王炎舜
摘 要:在某型產(chǎn)品研制過程中,其性能指標(biāo)需要進(jìn)行全面測試。過去,測試結(jié)果通常采用手工填寫方式,但是存在效率低、費(fèi)時(shí)費(fèi)力、容易出錯(cuò)等問題。本研究采用對象鏈接與嵌入技術(shù),在VC++平臺(tái)下操作Excel表格,實(shí)現(xiàn)產(chǎn)品測試結(jié)果的批量輸出和圖表繪制功能,大幅度提升某型產(chǎn)品測試數(shù)據(jù)輸出的準(zhǔn)確性,提高產(chǎn)品測試數(shù)據(jù)分析及交付效率。
關(guān)鍵詞:對象鏈接與嵌入技術(shù);VC++;測試數(shù)據(jù)輸出
中圖分類號:TP311文獻(xiàn)標(biāo)識(shí)碼: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
某型產(chǎn)品具有復(fù)雜的技術(shù)指標(biāo)體系,性能測試期間會(huì)產(chǎn)生包含大量參數(shù)的測試文件,人們需要將測試數(shù)據(jù)填寫到測試記錄Excel表格中。針對同一批次產(chǎn)品的測試數(shù)據(jù),人們需要編寫數(shù)據(jù)分析報(bào)告;對于各產(chǎn)品某些關(guān)鍵數(shù)據(jù),需要繪制散圖類型的圖表來分析該批次產(chǎn)品質(zhì)量情況。以往采用手動(dòng)方式將測試數(shù)據(jù)填入測試記錄卡并繪制測試數(shù)據(jù)散點(diǎn)圖,任務(wù)量大,效率低且容易出錯(cuò)。本文采用對象鏈接與嵌入(Object Linking and Embedding,OLE)技術(shù),最終實(shí)現(xiàn)產(chǎn)品測試記錄自動(dòng)化填寫及測試數(shù)據(jù)圖表生成。
1 OLE技術(shù)簡介
OLE技術(shù)是一種交互進(jìn)程間的通信技術(shù),可以使開發(fā)者利用封裝好的對象進(jìn)行程序間的信息傳遞與操作,已逐漸發(fā)展成為一種基于對象的動(dòng)態(tài)交互組件規(guī)范。該技術(shù)利用組件對象模型(COM)完成不同程序間的訪問與操作,可以使組件自身的對象與其方法被方便地調(diào)用[1]。在該技術(shù)中,被調(diào)用方是OLE服務(wù)器端,調(diào)用方是客戶端(或容器),調(diào)用的各個(gè)項(xiàng)目是OLE對象[2]。Microsoft Office的Excel軟件就是一個(gè)OLE服務(wù)器,在VC++平臺(tái)可以用MFC程序完成對Excel的操作,使其完成測試記錄表的輸出和數(shù)據(jù)對比圖表的生成。
2 測試記錄模板和流程設(shè)計(jì)
某型產(chǎn)品測試所保存的測試數(shù)據(jù)為二進(jìn)制文件,結(jié)合測試數(shù)據(jù)格式和測試項(xiàng)目分類,依據(jù)不同測試數(shù)據(jù)集的文件名稱區(qū)分測試項(xiàng)目,填入預(yù)先設(shè)計(jì)好的測試記錄表模板,如圖1所示。
測試數(shù)據(jù)批量自動(dòng)化輸出的流程為:首先開啟Excel服務(wù)打開模板,之后選取需要填入測試表的測試項(xiàng)目,直到所有需要填寫的項(xiàng)目填寫完畢,隨后進(jìn)行超差數(shù)據(jù)標(biāo)紅與缺項(xiàng)統(tǒng)計(jì),最后保存輸出完成的測試記錄表。整個(gè)測試記錄數(shù)據(jù)輸出操作流程如圖2所示。
3 測試記錄批量輸出實(shí)現(xiàn)
Excel作為OLE自動(dòng)化服務(wù)器,其中有許多OLE對象可以被客戶端應(yīng)用程序調(diào)用。常見的操作對象包括:應(yīng)用對象Application、工作簿對象WorkBook、工作列表對象WorkSheet、單元格對象Range等。
要操縱Excel的對象并調(diào)用其方法,首先需要在工程中添加Excel類庫。在Excel 2013中,類庫文件為默認(rèn)安裝路徑中的Excel.exe文件,即C:\Program Files\Microsoft\Office 15\Excel.exe。通過VC++平臺(tái)的類向?qū)В–lassWizard)選擇目標(biāo)類庫后,選擇所要添加的對象類,即可生成包含所選對象類的excel.cpp文件和excel.h頭文件,然后自動(dòng)添加到開發(fā)工程。完成類庫的添加后,可以進(jìn)行應(yīng)用程序的工程開發(fā)。
對OLE服務(wù)器(即Excel對象)的調(diào)用分為以下幾個(gè)步驟。
3.1 OLE服務(wù)初始化
OLE初始化在CmyApp::InitInstance()中完成,初始化代碼如下:
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
如果OLE服務(wù)初始化成功,則AfxOleInit()返回一個(gè)非零值,否則返回值為0。
3.2 創(chuàng)建Excel服務(wù)
操作Excel進(jìn)行表格填寫和圖表操作需要的對象類為應(yīng)用對象_Application、工作簿集合Workbooks、工作簿_Workbook、工作表單集合Worksheets、工作表單_Worksheet、單元格Range、圖表對象集合ChartObjects、圖表對象_Chart等。使用各對象前需要定義對象實(shí)例,同時(shí)定義COleVariant類型的默認(rèn)參數(shù)如(covOptional等)和LPDISPATCH類型的接口指針。創(chuàng)建Application對象的代碼如下:
if (!app.CreateDispatch("Excel.Application"),NULL)
{
AfxMessageBox("創(chuàng)建Excel服務(wù)失??!");
return;
}
app.SetVisible(TRUE);
須使用SetVisible方法設(shè)置,對用戶可見,否則創(chuàng)建的服務(wù)無法正常關(guān)閉,也無法創(chuàng)建新的服務(wù)。
3.3 相關(guān)對象的關(guān)聯(lián)調(diào)用
根據(jù)操作方式的不同,對工作簿book對象的關(guān)聯(lián)分為兩種:一是添加新的工作簿到工作簿集合,即新建空白Excel文檔進(jìn)行操作;二是打開預(yù)定Excel文檔進(jìn)行關(guān)聯(lián)操作。前者使用Add方法完成新建文檔并關(guān)聯(lián)的操作,后者使用Open方法打開預(yù)設(shè)路徑的文檔。本文使用后一種方法來打開設(shè)計(jì)好的測試記錄表模板進(jìn)行操作,相關(guān)代碼如下:
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的關(guān)聯(lián)操作可以通過range對象的AttachDispatch方法得到工作表單sheet內(nèi)的所有單元格,也可以通過sheet對象的GetRange方法傳入表格單元格的索引范圍。使用前者方法得到范圍后,使用SetItem方法輸入坐標(biāo)索引和設(shè)定值,可以填寫單元格,后者通過SetValue2方法設(shè)定單元格范圍內(nèi)的值。因?yàn)樾枰顚懝潭ǖ膯卧?,后者更便于格式化表格索引參?shù),故選用GetRange方法實(shí)現(xiàn)單元格的填寫,相關(guān)代碼如下:
//格式化單元格索引
strRange.Format(“I%d”,i);
//設(shè)置單元格
Range=sheet.GetRange(COleVariant(strRange), COleVariant(strRange));
//填寫單元格
Range.SetValue2(COleVariant(m_value));
3.4 釋放各個(gè)調(diào)用對象
在對各對象完成操作后,需要依次釋放各個(gè)對象,否則會(huì)出現(xiàn)無法再次進(jìn)行Excel服務(wù)注冊的錯(cuò)誤。
4 數(shù)據(jù)分析圖表生成方法
生產(chǎn)報(bào)告所需圖表是一組測試數(shù)據(jù)的針對某些指標(biāo)的散點(diǎn)圖,在選取多組數(shù)據(jù)后,調(diào)用OLE服務(wù)寫入Excel并完成圖表生成。打開文檔,使用CfileDIalog類生成一個(gè)模態(tài)對話框來選取多組測試數(shù)據(jù),再將所需指標(biāo)數(shù)據(jù)寫入Excel文檔,操作寫入單元格的方法同上一節(jié)表格輸出。
生成圖表使用ChartObjections、ChartObjection和_Chart類來完成,從工作表單到圖表對象層層關(guān)聯(lián),最后獲得圖表對象的關(guān)聯(lián)[3]。相關(guān)代碼如下:
Double left = 50, top = 100, width = 800, height = 300;//圖表坐標(biāo)與寬高
lpDisp = sheet.ChartObjects(covOptional);
chartobjects.AttachDispatch(lpDisp);
chartobject = chartobjects.Add(left, top, width, height);
chart.AttachDispatch(chartobject.GetChart());
chart.SetChartType(-4169);//散點(diǎn)圖類型常量
關(guān)聯(lián)后,用ChartWizard方法傳入相關(guān)參數(shù)生成圖表,相關(guān)代碼如下:
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可以分別設(shè)置圖表標(biāo)題、[X]軸標(biāo)題和[Y]軸標(biāo)題,其余參數(shù)項(xiàng)填入默認(rèn)參數(shù)。生成圖表效果如圖3所示。
5 結(jié)語
本文通過采用OLE技術(shù)實(shí)現(xiàn)了某型產(chǎn)品測試記錄表的自動(dòng)化輸出和批次測試數(shù)據(jù)的圖表生成。以往依靠手工完成的數(shù)據(jù)填寫和繪制任務(wù)需要耗時(shí)幾十分鐘,使用自動(dòng)化技術(shù)完成僅需數(shù)分鐘,該技術(shù)在某型產(chǎn)品的生產(chǎn)交付測試中得到了良好應(yīng)用,并已推廣到類似產(chǎn)品的測試工作中,工作效率大幅度提升。
參考文獻(xiàn):
[1]呂靜.基于OLE自動(dòng)化實(shí)現(xiàn)Excel動(dòng)態(tài)報(bào)表[J].電腦知識(shí)與技術(shù),2017(9):180-181.
[2]朱晗.基于對象鏈接與嵌入技術(shù)的數(shù)據(jù)校驗(yàn)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:華中科技大學(xué),2016.
[3]劉志江,羅欣,周博,等.VC++平臺(tái)下基于OLE技術(shù)的Excel圖表自動(dòng)化輸出[J].煤礦機(jī)械,2013(8):272-275.