亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        自動(dòng)化技術(shù)在生成數(shù)據(jù)報(bào)告中的應(yīng)用

        2018-01-29 07:36:50孫海民姜學(xué)東計(jì)大杰于萬(wàn)國(guó)
        實(shí)驗(yàn)室研究與探索 2017年12期
        關(guān)鍵詞:調(diào)用表格文檔

        孫海民, 姜學(xué)東, 計(jì)大杰, 于萬(wàn)國(guó)

        (河北民族師范學(xué)院 數(shù)字與計(jì)算機(jī)科學(xué)學(xué)院,河北 承德 067000)

        0 引 言

        隨著大數(shù)據(jù)產(chǎn)業(yè)發(fā)展,在可視化數(shù)據(jù)結(jié)果時(shí),人們希望將分析結(jié)果如文本、圖片、表格、數(shù)字等保存到文件,自動(dòng)生成數(shù)據(jù)分析報(bào)告。筆者調(diào)查90%以上的數(shù)據(jù)分析管理系統(tǒng)存在這樣需求。文獻(xiàn)調(diào)研發(fā)現(xiàn)90%的MS Office自動(dòng)化客戶端項(xiàng)目都使用VBA開(kāi)發(fā),如《基于Excel VBA的漁具選擇性分析SELECT模型實(shí)現(xiàn)》[1]《基于Excel的水泵性能試驗(yàn)數(shù)據(jù)處理的VBA開(kāi)發(fā)》[2]《利用VBA技術(shù)和EndNote軟件建立查新報(bào)告數(shù)據(jù)庫(kù)》[3]。使用C++開(kāi)發(fā)Microsoft Office自動(dòng)化客戶端研究很少,并且存在設(shè)計(jì)缺陷。以VC開(kāi)發(fā)環(huán)境下生成Word文件為例,有人提出將數(shù)據(jù)分析結(jié)果寫(xiě)入臨時(shí)文件,再通過(guò)VBA從臨時(shí)文件中讀取數(shù)據(jù)并寫(xiě)入Word中[4]。由于使用臨時(shí)文件和VBA會(huì)造成應(yīng)用程序工作效率降低,究其原因是人們對(duì)自動(dòng)化(Automation)技術(shù)研究不足。C++作為主流軟件開(kāi)發(fā)語(yǔ)言在開(kāi)發(fā)MS Office自動(dòng)化客戶端方面研究不足。另外,已有文獻(xiàn)關(guān)于自動(dòng)化技術(shù)和MS Office組件對(duì)象模型研究不夠全面和深入。深入研究自動(dòng)化技術(shù)、MS Office組件對(duì)象模型,將數(shù)據(jù)結(jié)果自動(dòng)保存到文件中的技術(shù)具有現(xiàn)實(shí)意義。本文將結(jié)合理論知識(shí)和實(shí)踐應(yīng)用兩個(gè)方面,提出一種基于自動(dòng)化技術(shù)自動(dòng)生成數(shù)據(jù)報(bào)告文件的解決方案。

        1 自動(dòng)化技術(shù)

        1.1 COM技術(shù)

        MS Office組件是基于自動(dòng)化技術(shù)的,開(kāi)發(fā)人員利用這項(xiàng)技術(shù)可以在應(yīng)用程序中調(diào)用組件方法和服務(wù),利用現(xiàn)有組件功能達(dá)到自己的目的[5]。例如在應(yīng)用程序中調(diào)用Excel對(duì)象插入圖表實(shí)現(xiàn)數(shù)據(jù)可視化。自動(dòng)化技術(shù)中提供服務(wù)的部分稱服務(wù)器(也稱為自動(dòng)化組件)例如Word、Excel等,調(diào)用自動(dòng)化組件服務(wù)的應(yīng)用程序稱為客戶端。自動(dòng)化組件由通過(guò)COM接口為客戶端提供服務(wù),每個(gè)自動(dòng)化對(duì)象都會(huì)對(duì)外公開(kāi)COM接口,對(duì)客戶端來(lái)說(shuō)組件接口是已知的。一個(gè)COM接口包含了功能上相關(guān)的一組函數(shù),客戶端獲得COM接口指針后,便可以調(diào)用自己所期望的函數(shù)以利用其功能。IUnknown是COM的基本接口,所有COM接口都從該接口繼承。它有QueryInterface、AddRef和Release三個(gè)方法,第一個(gè)方法用來(lái)查詢COM對(duì)象的其它接口,第二第三個(gè)方法用于對(duì)象引用計(jì)數(shù)。生存期控制和接口查詢是IUnknown接口兩個(gè)重要功能[6]。

        1.2 自動(dòng)化技術(shù)

        自動(dòng)化是基于IDispatch接口的COM,IDispatch接口繼承IUnknown接口。自動(dòng)化技術(shù)繼承COM優(yōu)點(diǎn),簡(jiǎn)化COM底層細(xì)節(jié),還提供一組專用于自動(dòng)化的數(shù)據(jù)類型等[7]。自動(dòng)化對(duì)象是實(shí)現(xiàn)IDispatch接口的COM對(duì)象,該接口包含GetIDsOfNames、GetTypeInfo、GetTypeInfoCount和Invoke 4個(gè)方法。通過(guò)GetTypeInfoCount方法可以判斷對(duì)象是否提供類型信息,如果對(duì)象提供類型信息,客戶端調(diào)用GetTypeInfo方法就可以獲取到類型信息,如CLSID、接口ID、成員函數(shù)等。GetIDsOfNames方法的功能是根據(jù)名字返回方法或者屬性的DISPID,客戶端以DISPID調(diào)用Invoke方法從而獲得對(duì)象提供的功能。圖1所示一個(gè)自動(dòng)化對(duì)象模型。

        圖1 自動(dòng)化對(duì)象示例圖

        1.3 類型庫(kù)

        客戶端在調(diào)用自動(dòng)化組件功能時(shí),必須獲取自動(dòng)化組件對(duì)象屬性和方法的相關(guān)信息[8]。自動(dòng)化技術(shù)使用類型庫(kù)(tlb文件類型)來(lái)保存這些信息。除此之外,OCX、OlB、DLL和EXE等文件也可以保存類型信息。使用OLE Object Viewer可查看組件類型庫(kù)信息。

        1.4 調(diào)用方式

        客戶端調(diào)用自動(dòng)化組件對(duì)象有早綁定和晚綁定兩種方式。早綁定是在編譯期間就確定了調(diào)用組件對(duì)象相關(guān)信息,如方法名、參數(shù)等,通過(guò)導(dǎo)入類型庫(kù)來(lái)實(shí)現(xiàn),是靜態(tài)綁定。晚綁定是應(yīng)用程序在運(yùn)行時(shí)根據(jù)對(duì)象屬性或方法名調(diào)用GetIDsOfNames方法獲取DISPID,再調(diào)用接口的Invoke方法,是動(dòng)態(tài)綁定。

        1.5 事件通知

        自動(dòng)化組件能否將自身狀態(tài)變化通知給客戶端?例如當(dāng)切換EXCEL工作表時(shí),客戶端能夠感知到EXCEL組件對(duì)象的狀態(tài)變化,以便做出相應(yīng)處理,如保存當(dāng)前工作表數(shù)據(jù)防止丟失。在自動(dòng)化技術(shù)中通過(guò)事件通知(Events)來(lái)實(shí)現(xiàn)。

        事件通知傳出接口,它包含一組函數(shù),每個(gè)函數(shù)對(duì)應(yīng)一個(gè)事件。事件通知的接口實(shí)現(xiàn)是由客戶端的捕獲器來(lái)完成的。自動(dòng)化技術(shù)中通過(guò)IConnectionPointContainer和IConnectionPoint接口以連接點(diǎn)的方式來(lái)實(shí)現(xiàn)事件通知和處理。第1個(gè)接口用于對(duì)連接點(diǎn)的管理,該接口FindConnectionPoint方法根據(jù)事件通知接口ID返回第2個(gè)接口指針,將事件通知與第2個(gè)接口關(guān)聯(lián)起來(lái)。第2個(gè)接口的Advise方法將客戶端的事件捕獲器關(guān)聯(lián)起來(lái),這樣就形成“事件通知-連接點(diǎn)-捕獲器”的關(guān)聯(lián)。當(dāng)組件對(duì)象狀態(tài)改變時(shí),事件捕獲器收到事件并進(jìn)行處理。圖2所示客戶端處理自動(dòng)化組件事件通知的過(guò)程。

        2 MFC對(duì)自動(dòng)化技術(shù)的支持

        2.1 自動(dòng)化對(duì)象開(kāi)發(fā)

        如果從頭開(kāi)始開(kāi)發(fā)C++自動(dòng)化對(duì)象不僅效率低而且非常繁瑣[9][10]。VC++可以創(chuàng)建支持自動(dòng)化特性的工程,該工程會(huì)維護(hù)一個(gè)idl文件,該文件記錄了工程中所有自動(dòng)化對(duì)象、接口及其屬性方法等信息。利用MFC添加類型向?qū)r(shí),開(kāi)發(fā)者可以指定“自動(dòng)化”選項(xiàng),從而創(chuàng)建自動(dòng)化接口及從CCmdTarget類派生的自動(dòng)化類。MFC封裝了所有自動(dòng)化對(duì)象所必須的一些代碼,簡(jiǎn)化了開(kāi)發(fā)自動(dòng)化對(duì)象過(guò)程。

        圖2 自動(dòng)化客戶端處理組件事件通知時(shí)序圖

        2.2 自動(dòng)化對(duì)象調(diào)用

        MFC提供了COleDispatchDriver類實(shí)現(xiàn)對(duì)自動(dòng)化對(duì)象IDispatch接口的處理。當(dāng)用Class Wizard導(dǎo)入組件類型庫(kù)時(shí),Wizard自動(dòng)創(chuàng)建組件接口的COleDispatchDriver包裝類,組件接口的屬性和方法被轉(zhuǎn)換為該類的成員函數(shù),其操作過(guò)程如下:

        (1)在Class View視圖右擊,在級(jí)聯(lián)菜點(diǎn)擊“添加”,鼠標(biāo)指向“類”。

        (2)在“添加類”對(duì)話框左邊窗格中,選擇“Visual C++|MFC”選項(xiàng),在右邊窗格中選擇“TypeLib中的MFC類”,點(diǎn)擊“打開(kāi)”按鈕。

        (3)在“從類型庫(kù)添加類向?qū)А睂?duì)話框選擇從“注冊(cè)表”來(lái)源添加可用的類型庫(kù),在“可用的類型庫(kù)”列表框中選擇類型庫(kù),“接口”窗格就會(huì)顯示該類型庫(kù)的接口,雙擊接口則會(huì)自動(dòng)創(chuàng)建接口對(duì)應(yīng)的類名稱及生成對(duì)應(yīng)的頭文件。圖3使用類型庫(kù)向?qū)閼?yīng)用程序添加Excel Object Library引用。

        圖3 VC++中導(dǎo)入類型庫(kù)圖

        自動(dòng)化技術(shù)中使用VARIANT數(shù)據(jù)類型傳遞數(shù)據(jù),MFC提供了COleVariant類實(shí)現(xiàn)對(duì)VARIANT數(shù)據(jù)結(jié)構(gòu)的封裝。

        3 Microsoft Office組件對(duì)象模型

        MS Office提供了一個(gè)可編程對(duì)象集合,開(kāi)發(fā)者可以通過(guò)可編程對(duì)象來(lái)調(diào)用Office組件功能[11]。這將極大加速應(yīng)用程序開(kāi)發(fā),我們以Word為例講解MS Office組件對(duì)象模型。

        3.1 組件對(duì)象模型

        MS Office組件對(duì)象以樹(shù)狀層級(jí)結(jié)構(gòu)排列,Word的任何元素,如文檔、表格、書(shū)簽等都是對(duì)象。每個(gè)對(duì)象都有一個(gè)父對(duì)象(Application除外),包含多個(gè)子對(duì)象。圖4所示,Word形成以Application對(duì)象為根節(jié)點(diǎn)的樹(shù)狀層級(jí)結(jié)構(gòu)[12]。

        圖4 Word對(duì)象模型圖

        Application對(duì)象包含Documents集合對(duì)象,通過(guò)其Item屬性就可以得到單個(gè)Document對(duì)象。通過(guò)Document對(duì)象又可以得到Range、Sections、Sentences和Paragraphs等對(duì)象。每個(gè)對(duì)象都有屬性和方法,屬性是對(duì)自動(dòng)化對(duì)象的某種狀態(tài)的描述,Document對(duì)象有段落、背景、保存等屬性。方法是指自動(dòng)化對(duì)象提供的服務(wù),如Document對(duì)象Undo和Redo方法執(zhí)行撤銷(xiāo)和恢復(fù)功能。集合對(duì)象是一組同類對(duì)象的容器,通過(guò)枚舉的方法可以得到該集合中的對(duì)象,圖4背景為白色的對(duì)象都是集合對(duì)象。如Dialogs集合對(duì)象。通過(guò)Item方可以得到集合中的每個(gè)對(duì)象。

        Word版本不同其對(duì)象模型有所差異,隨著Word版本的不斷提高,不斷有新的對(duì)象加入到模型中[13]。例如,在Word2003中新增了Break(s)等對(duì)象。版本變化也會(huì)帶來(lái)對(duì)象的屬性和方法的會(huì)更新,如Word 2010版中Application對(duì)象放棄了MountVolume等方法和屬性。在開(kāi)發(fā)中使用OLE編程標(biāo)識(shí)符(ProgID)創(chuàng)建自動(dòng)化對(duì)象[14],Word使用“Application”作為編程標(biāo)識(shí)符,PPT使用“PowerPoint.Application”作為編程標(biāo)識(shí)符。

        3.2 幾個(gè)重要對(duì)象

        3.2.1Application對(duì)象

        Application表示W(wǎng)ord應(yīng)用程序,是其它所有對(duì)象的根。在這些成員對(duì)象中可以通過(guò)get_Application方法直接得到Application對(duì)象[15]。當(dāng)用戶啟動(dòng)了Word應(yīng)用程序時(shí),也就創(chuàng)建了Application對(duì)象,創(chuàng)建Application對(duì)象代碼如下:

        CApplication app;

        app.CreateDispatch("Word.Application")));

        下面代碼演示W(wǎng)ord退出時(shí)的函數(shù)調(diào)用過(guò)程,在代碼中調(diào)用ReleaseDispatch方法釋放資源。

        CComVariant save(false),origFmt,doc;

        app.Quit(&save,&origFmt,&doc);

        app.ReleaseDispatch();

        可以使用Application對(duì)象的屬性和方法來(lái)設(shè)置和獲取Word環(huán)境信息。例如下面代碼將Word窗口可視化并設(shè)置為最大化。

        app.putVisible(TRUE);

        app.putWindowState(1);

        3.2.2Document對(duì)象

        新建Word文檔時(shí)就創(chuàng)建了一個(gè)Document對(duì)象,該對(duì)象被添加到Documents集合中。Document對(duì)象Avtive方法用于設(shè)置對(duì)象為活動(dòng)狀態(tài)。調(diào)用對(duì)象Open和Add方法打開(kāi)和創(chuàng)建的文檔都具有活動(dòng)文檔屬性。下面代碼示意關(guān)閉文檔。

        CComVariant varSave(-2),varDoc(1),varRoute(FALSE);

        doc.Close(&varSave,&varDoc,&varRoute);

        Documents是Docment的集合對(duì)象,調(diào)用Add方法創(chuàng)建一個(gè)新的Document對(duì)象并加入該集合;Open方法打開(kāi)一個(gè)Word文檔并加入該集合;Item返回一個(gè)文檔對(duì)象;Close方法關(guān)閉指定文檔;Save方法保存所有的文檔。

        3.2.3Selection對(duì)象

        操作Word文檔主要是通過(guò)Selection對(duì)象來(lái)實(shí)現(xiàn)。Selection對(duì)象表示當(dāng)前選擇的區(qū)域,例如設(shè)置文本顏色時(shí)被選中的文本就是一個(gè)Selection對(duì)象。Selection對(duì)象始終存在于文檔中,如果用戶沒(méi)有選擇文本則它表示插入點(diǎn),表1所示該對(duì)象的主要屬性。

        應(yīng)用程序有且只能有一個(gè)活動(dòng)的Selection對(duì)象。下面代碼示意為所選中的每個(gè)段落添加矩形邊框,

        CPphs pahs = selection.get_Paragraphs();

        CBorders borders = pahs.get_Borders();

        borders.put_Enable(TRUE);

        3.2.4Range對(duì)象

        Range對(duì)象通過(guò)開(kāi)始和結(jié)束字符的位置來(lái)來(lái)引用

        表1 Selection對(duì)象常用屬性

        文檔中某一連續(xù)區(qū)域。Word組件模型中多個(gè)對(duì)象具有Range屬性。下面代碼演示Range對(duì)象引用文檔中第四段落,設(shè)置段落格式為右對(duì)齊且選中該段落。

        CPphs pahs = doc.get_Paragraphs();

        CPphs pah = pahs.Item(4);

        CRange range = pah.get_Range();

        CPahFormat pahFormat = pah.get_Format();

        pahFormat.put_Alignment(2);

        range.Select();

        3.2.53個(gè)屬性對(duì)象

        Information、Type和Flag對(duì)象通常用于獲取和設(shè)置對(duì)象的屬性信息。Information對(duì)象返回Selection或range對(duì)象的有關(guān)信息。如頁(yè)碼、節(jié)、表格列號(hào)等。下面代碼示意如何獲得當(dāng)前光標(biāo)所處的行號(hào)。

        CComVariant varLineNum=selection.get_Information(10);

        Type對(duì)象用于返回Selection、Document、Window等對(duì)象的屬性。Type的屬性依對(duì)象不同而不相同。如Selection對(duì)象具有wdSelectionIP等屬性值。開(kāi)發(fā)人員通過(guò)操作對(duì)象屬性而修改對(duì)象特征,下面代碼將一個(gè)圖片從嵌入型版式修改為浮于文字上方。

        if(wdSelectionInlineShape==selection.get_Type()){

        CnlineShapes inlineShapes=selection.get_InlineShapes();

        CnlineShape inlineShape = inlineShapes.Item(1);

        inlineShape.ConvertToShape();}

        Flag屬性僅用于Selection對(duì)象,該屬性可讀寫(xiě),屬性值包括wdSelStartActive等。當(dāng)向一個(gè)Word文檔輸入文本時(shí),若希望設(shè)置編輯為插入狀態(tài),代碼示意如下:

        if (wdSelOvertype&selection.get_Flags()){

        selection.put_Flags(wdSelReplace);}

        4 自動(dòng)化客戶端開(kāi)發(fā)實(shí)例

        我們以VC環(huán)境下開(kāi)發(fā)Word(2003版)組件客戶端為例,詳細(xì)講解自動(dòng)化組件的客戶端開(kāi)發(fā)過(guò)程。開(kāi)發(fā)情境如下:在一個(gè)油田井下測(cè)試數(shù)據(jù)分析平臺(tái)中需要將數(shù)據(jù)分析結(jié)果保存到Word中,自動(dòng)生成數(shù)據(jù)分析報(bào)告。數(shù)據(jù)分析報(bào)告包括封面、目錄、正文部分(包括章節(jié)、正文、表格、圖片、正文等)、頁(yè)眉等。數(shù)據(jù)分析報(bào)告可以分為固定項(xiàng)目和插入項(xiàng)目?jī)蓚€(gè)部分。固定項(xiàng)目是指每次創(chuàng)建文件時(shí)不需要更改的部分,如封面格式、目錄、頁(yè)眉、不變的文本、正文格式、表格屬性、圖片屬性、正文章節(jié)層級(jí)結(jié)構(gòu)、插入圖片的位置和表格的位置等。插入部分是指平臺(tái)產(chǎn)生的數(shù)據(jù)、文本、圖片、表格中的數(shù)據(jù)等,要利用Word組件對(duì)象的功能將這部分內(nèi)容插入到指定位置。因此需要?jiǎng)?chuàng)建一個(gè)文檔模版,設(shè)置封皮樣式、頁(yè)眉頁(yè)腳、目錄結(jié)構(gòu)、插入字體格式、表格屬性和圖片屬性等。生成Word報(bào)告時(shí),創(chuàng)建Word組件對(duì)象客戶端,打開(kāi)文檔模版并向其中添加數(shù)據(jù),完成后另存文檔。

        4.1 編制Word報(bào)告模版

        (1)封皮。設(shè)置報(bào)告題目“……報(bào)告”黑體一號(hào)字加粗,“單位:……”宋體一號(hào)字,“報(bào)告人:……”宋體一號(hào)字,“完成日期:……”宋體一號(hào)字,插入分頁(yè)符。

        (2)頁(yè)眉頁(yè)腳。添加頁(yè)眉“……”,在頁(yè)腳添加頁(yè)碼。

        (3)目錄。目錄便于用戶快速定位該報(bào)告的內(nèi)容。在報(bào)告模版中預(yù)留目錄空間,當(dāng)完成報(bào)告后動(dòng)態(tài)添加目錄。在目錄位置輸入“目 錄”設(shè)置宋體一號(hào)字,插入分頁(yè)符。

        (4)目錄結(jié)構(gòu)設(shè)置。根據(jù)報(bào)告的需要設(shè)置目錄的格式,形成遞進(jìn)的層級(jí)結(jié)構(gòu)。

        (5)錄入固定不變的內(nèi)容。將每次生成Word報(bào)告都相同的內(nèi)容包括文字、圖片和表格等保存在模版中,并預(yù)留插入文本、圖片的位置。在生成Word報(bào)告時(shí),在預(yù)留的位置中添加數(shù)據(jù)處理結(jié)果包括文本、數(shù)字和圖片等。

        (6)設(shè)置表格和圖片。在模版中添加表格并設(shè)置表格屬性。這種方法不需要在VC中動(dòng)態(tài)生成表格,開(kāi)發(fā)人員只需要向表格內(nèi)添加數(shù)據(jù)。如果表格行數(shù)不確定(大于2行),則只需要在模版中添加標(biāo)題行和一個(gè)空行就可以了。在程序中根據(jù)具體情況動(dòng)態(tài)添加表格行。在模版中預(yù)留插入圖片的位置并設(shè)置格式,報(bào)告中插入的圖片基本都是嵌入型版式且水平居中對(duì)齊,由程序添加圖名稱和表名稱。

        (7)設(shè)置模版密碼。為增加模版安全性,為該模版設(shè)置密碼保護(hù),防止被意外修改。另外,開(kāi)發(fā)人員根據(jù)具體情況決定是否進(jìn)行頁(yè)面設(shè)置等。

        4.2 封裝Word對(duì)象接口

        為提高開(kāi)發(fā)速度減少重復(fù)代碼,在開(kāi)發(fā)中對(duì)Word接口的包裝類進(jìn)行封裝。由于在Word文檔中幾乎所有的操作都通過(guò)Selection對(duì)象來(lái)完成,所以我們將在Word中的所有操作都封裝在一個(gè)CMySelection類中,該類主要實(shí)現(xiàn)以下功能:①插入符操作:移動(dòng)插入符至文檔開(kāi)始結(jié)束位置、行首、行尾、向上下左右移動(dòng)和換行。②字符串操作:查找、刪除、插入和替換。③表格操作:創(chuàng)建表格、添加數(shù)據(jù)、刪除表格和添加表標(biāo)題。④圖片操作:插入、刪除圖片和添加圖標(biāo)題;復(fù)制和粘貼。⑤創(chuàng)建目錄。圖5所示生成Word報(bào)告模塊的靜態(tài)類圖,COperateMSWord類中組合了CMySelection、CAppliction和CDocuments類。在COperateMSWord類中按照生成Word報(bào)告文檔內(nèi)容的先后順序依次聲明方法,在這些方法中調(diào)用CMySelection類的有關(guān)方法實(shí)現(xiàn)對(duì)文本、數(shù)字、圖片、表格、目錄等內(nèi)容的添加。

        圖5 操作Word對(duì)象類圖

        4.3 關(guān)鍵技術(shù)

        (1)打開(kāi)和保存文檔。打開(kāi)文檔代碼如下,該模版設(shè)置密碼保護(hù),所以在Open函數(shù)的參數(shù)中包含了模版的密碼。為防止在生成報(bào)告過(guò)程中,用戶更改插入符的位置,設(shè)置文檔窗口為不可視狀態(tài)。

        if (FALSE == word.CreateDispatch(_T("Word.Application"))){

        return;

        }

        word.put_Visible(FALSE);

        m_docsWord = word.get_Documents();

        CString strReportTem = GetExecutePath();

        strReportTem += _T("Report-template.doc");

        CComVariant varFile(strReportTem),varT(TRUE),varF(FALSE),varNull(_T("")),varFmt(0),varDire(0),varPwd(_T("shm"));

        m_docsWord.Open(&varFile,&varF,&varF,&varF,&varPwd,&varNull,&varF,&varPwd,&varNull,&varFmt,&varF,&varT,&varT,&varDire,&varT,&varNull);

        當(dāng)報(bào)告生成后調(diào)用Document對(duì)象SaveAs方法將報(bào)告保存,同時(shí)釋放Word對(duì)象資源,代碼與前面相似不再給出。

        (2)插入文字。CMySelection類實(shí)現(xiàn)了InsertStringAfter和InsertStringBefore兩個(gè)插入字符串的方法。根據(jù)不同情況調(diào)用相應(yīng)的方法在當(dāng)前選定的字符串之前或者之后插入字符串。這兩個(gè)函數(shù)都有兩個(gè)參數(shù),一個(gè)參數(shù)是用于確定插入字符串位置的待查找字符串,另一個(gè)參數(shù)是待插入的字符串。在這兩個(gè)方法中,首先執(zhí)行查找操作,將光標(biāo)定位到插入字符的位置,然后調(diào)用Selection對(duì)象的InsertAfter或者InsertBefore方法插入字符串。CMySelection類的FindString函數(shù)中封裝了Word的查找和替換操作,在Word對(duì)象模型中Find對(duì)象實(shí)現(xiàn)查找和替換功能。在FindString函數(shù)中首先調(diào)用Selection對(duì)象的get_Find方法得到Find對(duì)象,然后清除格式信息,最后調(diào)用Find對(duì)象的Execute方法執(zhí)行查找操作。

        CFind findWord = m_selWord.get_Find();

        findWord.ClearFormatting();

        CComVariant varFindText(strFind),varF(FALSE),varT(TRUE),varWrap(1),varNull;

        findWord.Execute(&varFindText,&varT,&varT,&varF,&varF,&varF,&varT,&varWrap,&varF,&varF,&varNull,&varF, &varF, &varF, &varF);

        用于確定插入字符串位置的字符串,在報(bào)告模版中必須具有唯一性。替代這種字符串查找的另外一種方式是使用書(shū)簽。由于書(shū)簽內(nèi)容在編輯模版時(shí)不能清晰顯示出來(lái),不利于模版文檔的維護(hù),故在開(kāi)發(fā)中未采用這種方法。Find對(duì)象實(shí)現(xiàn)查找和替換功能,通過(guò)Find對(duì)象可以得到Replacement對(duì)象,該對(duì)象是執(zhí)行替換操作時(shí)的替換條件,為該對(duì)象賦值后(替換的字符串),該調(diào)用Find對(duì)象Excute方法執(zhí)行替換操作。

        (3)添加圖片。CMySelection類InsertPicture方法實(shí)現(xiàn)向文檔中插入圖片功能。在模版中預(yù)留了插入圖片的位置,在圖片位置的正下方是該圖片的名稱。該函數(shù)首先調(diào)用FindString方法找到圖片名稱,然后調(diào)用MoveUp方法將插入符向上移動(dòng)到插入圖片的位置,然后調(diào)用AddPicture方法插入圖片,最后為圖片添加題注。報(bào)告文檔中的圖片都是嵌入型的,在Word對(duì)象模型中InlineShape對(duì)象表示嵌入型圖片。在AddPicture方法中通過(guò)Selection對(duì)象得到InlineShapes集合對(duì)象,然后調(diào)用該對(duì)象AddPicture方法將圖片添加到文檔中。

        CnlineShapes inlineShapes=m_selWord.get_InlineShapes();

        CComVariant varLinkToFile(false),varSave (true);

        CRange range = m_selWord.get_Range();

        inlineShapes.AddPicture(szFilePath,&varLinkToFile, &varSave, &CComVariant(range));

        使用題注的方法為圖片和表格命名是很有實(shí)用價(jià)值的,在CMySelection類中也封裝了插入題注的功能。在該類中首先添加圖標(biāo)簽,然后調(diào)用Selection對(duì)象的InsertCaption方法為插入的圖添加題注。

        CCaptionLabels captionLabels = appWord.get_CaptionLabels();

        captionLabels.Add(_T("圖"));

        CComVariant varLab(T("圖")),varTle(_T("")),varTleAuTxt(""),varPos(wdCaptionPositionBelow),varEx(false);

        selection.InsertCaption(&varLab,&varTle,&varTleAuTxt,&varPos,&varEx);

        (4)添加表格數(shù)據(jù)。在報(bào)告模版中已經(jīng)插入了表格和表名稱(在表格的正上方),所以首先調(diào)用FindString函數(shù)找到表名稱并為該表加入題注,然后將光標(biāo)下移到需要插入數(shù)據(jù)的位置,插入數(shù)據(jù)。這時(shí)需要判斷當(dāng)前的插入符是否在表格內(nèi),必要時(shí)還需要判斷插入符所在的行和列。通過(guò)Selection對(duì)象的Information屬性實(shí)現(xiàn)此項(xiàng)功能。

        CComVariant varBInTle(true);

        i(varBInTl==election.get_Information(12)){

        CComVariant varCol=selection.get_Information(16);

        CComVariant varRow=selection.get_Information(13);}

        如果插入到表格中數(shù)據(jù)數(shù)量不確定,則該表格行數(shù)就不確定。這就要求程序根據(jù)數(shù)據(jù)長(zhǎng)度動(dòng)態(tài)添加表格行。在程序中使用MFC的CStringList類保存插入的數(shù)據(jù),該類是一個(gè)由字符串構(gòu)成的鏈表。當(dāng)插入符移動(dòng)到表格右下角的單元格時(shí),按下Tab鍵會(huì)在最后一行下面增加一空行。下面代碼為表格增加一空行。

        CComVariant

        varUnit(wdCell),varCut(1),varN;

        selection.MoveRight(&varUnit,&varCut,&varN);

        使用這種方法插入表格行的優(yōu)點(diǎn)是,當(dāng)插入空行后,插入符會(huì)自動(dòng)移動(dòng)到該行的第一個(gè)單元格,這樣就可以繼續(xù)插入數(shù)據(jù)。

        (5)創(chuàng)建目錄。創(chuàng)建目錄的方法比較簡(jiǎn)單,Word中TablesOfContents對(duì)象的Add方法實(shí)現(xiàn)該功能。該函數(shù)參數(shù)比較多包括Appliction、Document、Range等對(duì)象。創(chuàng)建目錄時(shí)選擇使用點(diǎn)填充目錄項(xiàng)目與頁(yè)碼之間空白,并設(shè)置目錄內(nèi)容按照級(jí)別遞增索引,代碼如下所示。

        CApplication app = word.get_Application();

        CDoc actDoc=app.get_ActiveDocument();

        CTablesOfContents tabsOfCtets = actDoc.get_TablesOfContents();

        CRange range = m_selWord.get_Range();

        CComVariant varF(false),varT(true),varUp(1),varLow(3),varNull;

        CTableOfContents table= tabsOfCtets.Add(range,&varT,&varUp,&varLow,&varF,&varNul,&varT,&varT,&varNul,&varT,&varT,&varT);

        table.put_TabLeader(1);

        tabsOfCtets.put_Format(0);

        由于Word報(bào)告中存在格式相同的內(nèi)容,例如表格1、表格2……,這些表格的格式都一樣,標(biāo)題行也一樣,只是填充的內(nèi)容不同。通過(guò)調(diào)用selection對(duì)象Copy和Paste/PasteAndFormat方法執(zhí)行復(fù)制和粘貼操作。這樣解決了在報(bào)告中格式相同而內(nèi)容不同的問(wèn)題。由于創(chuàng)建的Word報(bào)告內(nèi)容比較多時(shí)間長(zhǎng),為了告知用戶當(dāng)前創(chuàng)建報(bào)告的進(jìn)度,我們使用一個(gè)進(jìn)度條顯示當(dāng)前生成報(bào)告的狀態(tài)。

        5 結(jié) 語(yǔ)

        本文以Microsoft Office組件為開(kāi)發(fā)對(duì)象,提出一種基于自動(dòng)化技術(shù)生成數(shù)據(jù)報(bào)告文件的解決方案,詳細(xì)講解了自動(dòng)化技術(shù)知識(shí),MFC對(duì)自動(dòng)化技術(shù)的支持,Microsoft Office組件對(duì)象模型,最后以一個(gè)項(xiàng)目詳細(xì)說(shuō)明了VC環(huán)境下開(kāi)發(fā)自動(dòng)化組件客戶端的過(guò)程,希望本文能夠給人們提供一個(gè)很好的幫助。

        [1] 金宇鋒,張 健.基于Excel VBA的漁具選擇性分析SELECT模型實(shí)現(xiàn)[J].實(shí)驗(yàn)室研究與探索,2014(3):154-158.

        [2] 湯 躍,趙 坤,許文博.基于Excel的水泵性能試驗(yàn)數(shù)據(jù)處理的VBA開(kāi)發(fā)[J].排灌機(jī)械工程學(xué)報(bào),2011(2):123-126.

        [3] 王 磊,張仁瓊.利用VBA技術(shù)和EndNote軟件建立查新報(bào)告數(shù)據(jù)庫(kù)[J].現(xiàn)代情報(bào),2015(8):131-136,140.

        [4] 朱 敏,沈同圣,王學(xué)偉.VC++與VBA結(jié)合實(shí)現(xiàn)復(fù)雜報(bào)表[J]. 計(jì)算機(jī)應(yīng)用與軟件,2005(2):42-43+101.

        [5] 葉 明,張 諍.基于C#.NET的Word報(bào)告生成功能開(kāi)發(fā)[J].計(jì)算機(jī)工程與應(yīng)用,2008(9):104-106.

        [6] 潘愛(ài)民.COM原理與應(yīng)用[M].北京:清華大學(xué)出版社,1999:334.

        [7] 朱 敏,沈同圣.VC++與VBA結(jié)合實(shí)現(xiàn)復(fù)雜報(bào)表[J].計(jì)算機(jī)應(yīng)用與軟件,2005(2):42.

        [8] 湯克明,陳 崚.Word自動(dòng)閱卷系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 計(jì)算機(jī)工程與應(yīng)用,2008(35):69-72.

        [9] 孔令彥,董蓬勃,姜青香.使用Visual Basic操縱Microsoft Word對(duì)象生成報(bào)表文檔[J].計(jì)算機(jī)工程與應(yīng)用,2003(36):115-117.

        [10] 趙宏亮,楊鶴標(biāo).面向領(lǐng)域的語(yǔ)義搜索引擎的應(yīng)用研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2012,(05):1801-1805.

        [11] 冉 沛,楊吉云,譚金勇.一種新的Word電子文檔完整性保護(hù)方案[J].計(jì)算機(jī)工程與應(yīng)用,2013(13):76-79+148.

        [12] MSDN.Office development[EB/OL].https://msdn.microsoft.com/en-us/library/fp161347.aspx, 2016-12-1.

        [13] 朱 敏,方登建,王 哲. Word模板數(shù)據(jù)自校驗(yàn)設(shè)計(jì)與信息提取技術(shù)[J]. 實(shí)驗(yàn)室研究與探索,2012(3):75-78.

        [14] 楊德明,郭 盛. 基于Word文檔的數(shù)據(jù)隱藏方法[J].計(jì)算機(jī)應(yīng)用與軟件,2015(5):314-318.

        [15] 高麗萍,郭棟彬,鄭博文. Co-Word中圖文混排的文檔一致性研究[J].計(jì)算機(jī)應(yīng)用研究,2017(11):1-10.

        猜你喜歡
        調(diào)用表格文檔
        《現(xiàn)代臨床醫(yī)學(xué)》來(lái)稿表格要求
        有人一聲不吭向你扔了個(gè)文檔
        統(tǒng)計(jì)表格的要求
        統(tǒng)計(jì)表格的要求
        統(tǒng)計(jì)表格的要求
        核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
        基于RI碼計(jì)算的Word復(fù)制文檔鑒別
        Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat
        99久久99久久精品国产片果冻| 日韩av一区二区无卡| 国产天堂av在线播放资源| 97久人人做人人妻人人玩精品| 少妇高清精品毛片在线视频| jjzz日本护士| 亚洲国产精品成人一区| 久久精品国产亚洲av高清三区| 日韩精品久久久久久久电影蜜臀 | 吃奶摸下的激烈视频| 亚洲AV秘 无码一区二区三区臀| 91久久精品一二三区蜜桃| 亚洲精品国产一区二区免费视频 | 免费国产一级特黄aa大片在线| 亚洲国产成人Av毛片大全| 成人在线观看视频免费播放| 亚洲av激情久久精品人| 91久久国产香蕉熟女线看| 性饥渴的农村熟妇| 黄色视频在线免费观看| 2022国内精品免费福利视频| 亚洲av中文字字幕乱码| 亚洲av毛片在线免费观看| 无码人妻丰满熟妇啪啪网站 | 老岳肥屁熟女四五十路| 久久99精品久久久久久琪琪| 中日韩精品视频在线观看| 日韩亚洲制服丝袜中文字幕| 在线观看国产av一区二区| 久久免费看黄a级毛片| 人妻精品动漫h无码网站| 亚洲中文字幕无码久久2018| 日韩精品一区二区三区视频| 色欲一区二区三区精品a片| 东北妇女肥胖bbwbbwbbw| 国产女高清在线看免费观看| 天堂av一区二区在线| 91久久精品国产综合另类专区| 99久久精品日本一区二区免费| 可以免费观看的毛片| 女人一级特黄大片国产精品|