APP下载

对象链接与嵌入技术在产品测试输出中的应用

2020-05-19王炎舜

河南科技 2020年8期

王炎舜

摘 要:在某型产品研制过程中,其性能指标需要进行全面测试。过去,测试结果通常采用手工填写方式,但是存在效率低、费时费力、容易出错等问题。本研究采用对象链接与嵌入技术,在VC++平台下操作Excel表格,实现产品测试结果的批量输出和图表绘制功能,大幅度提升某型产品测试数据输出的准确性,提高产品测试数据分析及交付效率。

关键词:对象链接与嵌入技术;VC++;测试数据输出

中图分类号:TP311文献标识码:A文章编号:1003-5168(2020)08-0031-03

Application of Object Linking and Embedding Technology

in Product Test Output

WANG Yanshun

(China Air-to-Air Missile Research Institute,Luoyang Henan 471000)

Abstract: During the development of a certain type of product, its performance indicators need to be thoroughly tested. In the past, test results were usually filled in manually, but there were problems such as low efficiency, time-consuming and labor-intensive, and error-prone. This research used object linking and embedding technology to operate Excel tables under the VC ++ platform to realize the batch output and chart drawing functions of product test results, greatly improving the accuracy of product test data output, and improving the efficiency of product test data analysis and delivery.

Keywords: object linking and embedding technology;VC ++;test data output

某型产品具有复杂的技术指标体系,性能测试期间会产生包含大量参数的测试文件,人们需要将测试数據填写到测试记录Excel表格中。针对同一批次产品的测试数据,人们需要编写数据分析报告;对于各产品某些关键数据,需要绘制散图类型的图表来分析该批次产品质量情况。以往采用手动方式将测试数据填入测试记录卡并绘制测试数据散点图,任务量大,效率低且容易出错。本文采用对象链接与嵌入(Object Linking and Embedding,OLE)技术,最终实现产品测试记录自动化填写及测试数据图表生成。

1 OLE技术简介

OLE技术是一种交互进程间的通信技术,可以使开发者利用封装好的对象进行程序间的信息传递与操作,已逐渐发展成为一种基于对象的动态交互组件规范。该技术利用组件对象模型(COM)完成不同程序间的访问与操作,可以使组件自身的对象与其方法被方便地调用[1]。在该技术中,被调用方是OLE服务器端,调用方是客户端(或容器),调用的各个项目是OLE对象[2]。Microsoft Office的Excel软件就是一个OLE服务器,在VC++平台可以用MFC程序完成对Excel的操作,使其完成测试记录表的输出和数据对比图表的生成。

2 测试记录模板和流程设计

某型产品测试所保存的测试数据为二进制文件,结合测试数据格式和测试项目分类,依据不同测试数据集的文件名称区分测试项目,填入预先设计好的测试记录表模板,如图1所示。

测试数据批量自动化输出的流程为:首先开启Excel服务打开模板,之后选取需要填入测试表的测试项目,直到所有需要填写的项目填写完毕,随后进行超差数据标红与缺项统计,最后保存输出完成的测试记录表。整个测试记录数据输出操作流程如图2所示。

3 测试记录批量输出实现

Excel作为OLE自动化服务器,其中有许多OLE对象可以被客户端应用程序调用。常见的操作对象包括:应用对象Application、工作簿对象WorkBook、工作列表对象WorkSheet、单元格对象Range等。

要操纵Excel的对象并调用其方法,首先需要在工程中添加Excel类库。在Excel 2013中,类库文件为默认安装路径中的Excel.exe文件,即C:\Program Files\Microsoft\Office 15\Excel.exe。通过VC++平台的类向导(ClassWizard)选择目标类库后,选择所要添加的对象类,即可生成包含所选对象类的excel.cpp文件和excel.h头文件,然后自动添加到开发工程。完成类库的添加后,可以进行应用程序的工程开发。

对OLE服务器(即Excel对象)的调用分为以下几个步骤。

3.1 OLE服务初始化

OLE初始化在CmyApp::InitInstance()中完成,初始化代码如下:

if (!AfxOleInit())

{

AfxMessageBox(IDP_OLE_INIT_FAILED);

return FALSE;

}

如果OLE服务初始化成功,则AfxOleInit()返回一个非零值,否则返回值为0。

3.2 创建Excel服务

操作Excel进行表格填写和图表操作需要的对象类为应用对象_Application、工作簿集合Workbooks、工作簿_Workbook、工作表单集合Worksheets、工作表单_Worksheet、单元格Range、图表对象集合ChartObjects、图表对象_Chart等。使用各对象前需要定义对象实例,同时定义COleVariant类型的默认参数如(covOptional等)和LPDISPATCH类型的接口指针。创建Application对象的代码如下:

if (!app.CreateDispatch("Excel.Application"),NULL)

{

AfxMessageBox("创建Excel服务失败!");

return;

}

app.SetVisible(TRUE);

须使用SetVisible方法设置,对用户可见,否则创建的服务无法正常关闭,也无法创建新的服务。

3.3 相关对象的关联调用

根据操作方式的不同,对工作簿book对象的关联分为两种:一是添加新的工作簿到工作簿集合,即新建空白Excel文档进行操作;二是打开预定Excel文档进行关联操作。前者使用Add方法完成新建文档并关联的操作,后者使用Open方法打开预设路径的文档。本文使用后一种方法来打开设计好的测试记录表模板进行操作,相关代码如下:

books=app.GetWorkbooks();

::GetCurrentDirectory(MAX_PATH,path);

strPath.Format(“%s”,path);

strPath += “\\Template.xlsx”;

lpDisp=books.Open(fileName,

covOptional,covOptional,covOptional,covOptional,

covOptional,covOptional,covOptional,covOptional,

covOptional,covOptional,covOptional,covOptional,

covOptional,covOptional

);

ASSERT(lpDisp);

book.AttachDispatch(lpDisp);

工作表單集合使用工作簿的GetSheets方法得到,工作表单则通过GetItem方法传入表单页索引sheetNum获取,代码如下:

Sheets =book.GetSheets();

Sheet=sheets.GetItem(COleVariant((short)sheetNum));

获取单元格range的关联操作可以通过range对象的AttachDispatch方法得到工作表单sheet内的所有单元格,也可以通过sheet对象的GetRange方法传入表格单元格的索引范围。使用前者方法得到范围后,使用SetItem方法输入坐标索引和设定值,可以填写单元格,后者通过SetValue2方法设定单元格范围内的值。因为需要填写固定的单元格,后者更便于格式化表格索引参数,故选用GetRange方法实现单元格的填写,相关代码如下:

//格式化单元格索引

strRange.Format(“I%d”,i);

//设置单元格

Range=sheet.GetRange(COleVariant(strRange), COleVariant(strRange));

//填写单元格

Range.SetValue2(COleVariant(m_value));

3.4 释放各个调用对象

在对各对象完成操作后,需要依次释放各个对象,否则会出现无法再次进行Excel服务注册的错误。

4 数据分析图表生成方法

生产报告所需图表是一组测试数据的针对某些指标的散点图,在选取多组数据后,调用OLE服务写入Excel并完成图表生成。打开文档,使用CfileDIalog类生成一个模态对话框来选取多组测试数据,再将所需指标数据写入Excel文档,操作写入单元格的方法同上一节表格输出。

生成图表使用ChartObjections、ChartObjection和_Chart类来完成,从工作表单到图表对象层层关联,最后获得图表对象的关联[3]。相关代码如下:

Double left = 50, top = 100, width = 800, height = 300;//图表坐标与宽高

lpDisp = sheet.ChartObjects(covOptional);

chartobjects.AttachDispatch(lpDisp);

chartobject = chartobjects.Add(left, top, width, height);

chart.AttachDispatch(chartobject.GetChart());

chart.SetChartType(-4169);//散点图类型常量

关联后,用ChartWizard方法传入相关参数生成图表,相关代码如下:

lpDisp = sheet.GetRange(_variant_t(“D1”0, _variant_t(“D9”));

var.pdisVal = lpDisp;

chart.ChartWizard(var,// Source

covOptional,//Gallery

covOptional,//Format

COleVariant((short)2),//PlotBy

covOptional,//CategoryLabels

covOptional,//SeriesLabels

COleVariant((short)FALSE),//HasLegend

COleVariant(“title”),//Title

COleVariant(“x_title”),//CategoryTitle

COleVariant(“y_title”),//ValueTitles

covOptional//ExtraTitle

);

其中,PlotBy為0按行取值,为1则按列取值;HasLegend表示是否需要图例,Tile、CategTile和ValueTile可以分别设置图表标题、[X]轴标题和[Y]轴标题,其余参数项填入默认参数。生成图表效果如图3所示。

5 结语

本文通过采用OLE技术实现了某型产品测试记录表的自动化输出和批次测试数据的图表生成。以往依靠手工完成的数据填写和绘制任务需要耗时几十分钟,使用自动化技术完成仅需数分钟,该技术在某型产品的生产交付测试中得到了良好应用,并已推广到类似产品的测试工作中,工作效率大幅度提升。

参考文献:

[1]吕静.基于OLE自动化实现Excel动态报表[J].电脑知识与技术,2017(9):180-181.

[2]朱晗.基于对象链接与嵌入技术的数据校验系统的设计与实现[D].武汉:华中科技大学,2016.

[3]刘志江,罗欣,周博,等.VC++平台下基于OLE技术的Excel图表自动化输出[J].煤矿机械,2013(8):272-275.