張雪詠++馬紅濤++趙建峰
摘 要本文介紹了通過Visual C++操縱Word的思想,通過實例演示了具體的方法和步驟,實現(xiàn)了將記事本格式的文件通過VC軟件自動寫入Word文檔,可以顯著提高工作效率。
【關鍵詞】VC 操縱Word
我們在做保護裝置功能測試時,程序根據(jù)測試用例生成的測試結果是記事本格式,而我們要提交的報告是Word文檔。以前我們在寫測試報告時,總是手工將測試用例及結果輸入到Word表格中,因為測試用例可能比較多,而且正式報告中的要求的表格格式和程序生成的記事本文檔中的測試結果格式不太一致, 這樣做有兩個缺點:1、浪費時間。2、容易出錯。鑒于此,開發(fā)了一個轉換程序,這個轉換程序可以對記事本文檔中的測試結果進行分析,再將其自動輸入到Word中去。
1 實現(xiàn)基礎
Word本身是一個實現(xiàn)了自動化的COM(Component Object Model)組件,它提供給我們很多接口,我們可以通過它對外提供的編程接口來訪問和操作Word文檔,為我們通過VC等軟件編寫的程序服務。
我們可以通過兩種方式來在VC中操縱Word:
(1)使用Office自帶的類型庫。
(2)使用COM的Automation技術。
我們做的該轉換程序用第一種方法在VC中操縱Word,即使用Office自帶的類型庫。下面簡單介紹一下類型庫:
Word本身提供了一個文件,叫做對象庫(Object library)或類型庫(Type library),里邊包含了有關的對象、屬性、方法和事件,以及應用程序的常量信息。我們可以通過對象瀏覽器(Object Browser或 OLEView)工具來在此文件中查看信息,以及瀏覽它所描述的對象。我們可以通過導出Word對象庫,在自己編寫的程序中調用。
2 Office層次結構
為了邏輯更清晰,層次更清楚的操作Office,微軟將Office按邏輯功能劃分為如下所示的屬性結構:
Application(以WORD 為例,只列出一部分示意)
Documents(所有的文檔)
Document(單個的文檔)
......
Templates(所有的模板)
Template(單個的模板)
......
Windows(所有的窗口)
Window(單個窗口)
Selection(編輯對象)
View(視圖)
Selection(編輯對象)
Font(字體)
Style(格式)
Range(范圍)
......
......
熟悉邏輯層次之后,就可以正確操作Office了。舉一個簡單的例子,如果給出的VB腳本語句(該語句可通過錄制宏獲?。椋?/p>
application.ActiveDocument.SaveAs "D:\test.doc"
從這個語句我們可以看出該操作過程分以下步驟:
(1)獲取Application對象;
(2)從Application對象中取得ActiveDocument活動文檔屬性;
(3)調用Document的“另存為”函數(shù)SaveAs,參數(shù)為字符串類型的文件名稱。
下面簡單介紹一下“宏”,因為“宏”在完成這個轉換程序過程中起到了很大的作用。在WORD中(以Office2010為例),調出菜單“視圖\宏\錄制宏(R)”,這時候它將開始記錄你在 WORD 中所有菜單和鍵盤的操作,把所有的操作過程保存起來。這些宏是VB腳本程序,將其轉換為VC代碼,便可在VC程序中實現(xiàn)對Word的操作,如圖1所示。
3 基本操作步驟
(1)通過VC應用程序向導創(chuàng)建一個 MFC 的程序工程。
(2)使用Ctrl+W快捷鍵打開ClassWizard類向導。
(3)點擊”Add Class...”,從下拉菜單中選擇”From a type Library...”,在 Office安裝目錄中找到需要使用的類型庫。
(4)選擇類型庫文件后,在彈出的對話窗中繼續(xù)按照功能選擇需要添加的類。也可以不考慮,全部添加進去。
(5)對COM進行初始化。第一種方法,找到應用程序對象App的InitInstance()函數(shù),在其中調用 AfxOleInit()初始化函數(shù);第二種方法,在需要調用COM功能的程序入口地方使用CoInitialize(NULL),調用結束后使用CoUninitialize()。
(6)在需要調用 Office 功能函數(shù)的 cpp實現(xiàn)文件中包含相關頭文件
#include
#include "XXX.h" //具體頭文件名稱,由裝載類型庫的文件名決定。
//如使用 msword.olb類型庫,頭文件為msword.h(實現(xiàn)在一doc文件中插入另一個word文件)
(7)開始在VC程序中調用Word的功能。
4 舉例說明
4.1 通過接口函數(shù)對Word進行操作時使用的數(shù)據(jù)類型
轉換程序通過接口對Word進行操作(即通過接口使用組件)時,應使用的數(shù)據(jù)類型說明如下:
Word是一個實現(xiàn)了自動化的COM組件。COM產(chǎn)生的目的之一就是跨語言,它使用的數(shù)據(jù)類型應該具有跨語言的特性,而VARIANT數(shù)據(jù)類型正具有這種特性。從C語言的角度講,VARIANT其實是一個結構,結構中用一個域表示該變量是什么類型的數(shù)據(jù),同時真正的數(shù)據(jù)存在Union空間中。舉例說明如下:
(1)用VARIANT表示一個4字節(jié)長的整數(shù)
VARIANT vtest1; vtest1.vt=VT_I4; vtest1.Val=100;
(2)用 VARIANT 表示布爾值“真”
VARIANT vtest2; vtest2.vt=VT_BOOL; vtest2.boolVal=VARIANT_TRUE;
(3)用VARIANT表示字符串
VARIANT vtest3; vtest3.vt=VT_BSTR; vtest3.bstrVal=SysAllocString(L"Hello,Word已經(jīng)打開了");
上面的操作過程看起來很麻煩,我們可以使用已有的包裝類CComVariant、COleVariant、_variant_t。上面幾個問題可以書寫成這樣:
CComVariant vtest1(100),vtest2(true),vtest3("Hello, Word已經(jīng)打開了");
在該轉換程序中,通過接口使用組件時,就是用的包裝類CComVariant。
4.2 實現(xiàn)中的技巧
在書寫調用Office函數(shù)的過程中,函數(shù)的參數(shù)較難確定,通常參數(shù)均為VARIANT變體類型指針,具體應如何確定呢?推薦兩種方法:第一種是查閱有關VBA相關書籍;第二種是查看Office自帶“宏”功能,本文推薦采用第二種方法,將需要實現(xiàn)的功能,在Office環(huán)境中操作,通過宏錄制下來,分析錄制后的函數(shù)和參數(shù),就可以在VC程序中進行使用了。舉一個簡單例子:
以下是在Word2010中錄制的另存文件的宏:
ActiveDocument.SaveAs2 FileName:="test.docx", FileFormat:= _wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _SaveAsAOCELetter:=False, CompatibilityMode:=14
該宏在VC程序中對應函數(shù)原型為:
void _Document::SaveAs(VARIANT* FileName, VARIANT* FileFormat, VARIANT* LockComments, VARIANT* Password, VARIANT* AddToRecentFiles, VARIANT* WritePassword, VARIANT* ReadOnlyRecommended, VARIANT* EmbedTrueTypeFonts, VARIANT* SaveNativePictureFormat, VARIANT* SaveFormsData, VARIANT* SaveAsAOCELetter, VARIANT* Encoding, VARIANT* InsertLineBreaks, VARIANT* AllowSubstitutions, VARIANT* LineEnding, VARIANT* AddBiDiMarks)
將以上內容對照分析后,我們可以看出來,第一個參數(shù) FileName是字符串類型 VARIANT(VT_BSTR), 第二個參數(shù) FileFormat:= _wdFormatXMLDocument為表示保存時指定文件類型的常量,是 DWORD 雙字類型VARIANT(VT_I4),常量的數(shù)值可寫成一個宏,通過調用函數(shù)AfxMessageBox顯示就能夠知道,第三個參數(shù)LockComments是布爾類型VARIANT(VT_BOOL)等等。
5 程序實現(xiàn)
此轉換程序分為兩個模塊:
5.1 數(shù)據(jù)準備模塊,此模塊提供了準備向Word輸入的數(shù)據(jù)
為了將記事本文件中的測試用例轉化為預期格式,必須通過分析記事本中測試用例數(shù)據(jù)獲得以下信息:
(1)測試用例名稱----保存在類成員變量TestName中。
(2)結果文件名稱----保存在類成員變量strFileName中。
(3)被測模塊參數(shù)個數(shù)----保存在類成員變量paraNum中。
(4)被測模塊輸出結果個數(shù)----保存在類成員變量resulAnticipated中。
(5)測試用例長度----保存在類成員變量caseLength中。
(6)測試用例數(shù)目----保存在類成員變量caseNum中。
(7)正常測試用例個數(shù)----保存在類成員變量NormalTestNum中。
(8)邊界測試用例個數(shù)----保存在類成員變量BorderTestNum中。
(9)異常測試用例個數(shù)----保存在類成員變量ExcepTestNum中。
(10)測試用例數(shù)據(jù)----保存在類成員變量TestCase字符串數(shù)組中。
5.2 Word操作模塊,此模塊用準備好的數(shù)據(jù)對Word進行操作
//打開模版
CComVariant FileName(lpBuffer);
CComVariant ConfirmConversions(false), ReadOnly(false), AddToRecentFiles(false), PasswordDocument(_T("")),
PasswordTemplate(_T("")),Revert(false), WritePasswordDocument(_T("")), WritePasswordTemplate(_T("")),F(xiàn)ormat(0),Encoding,Visible,OpenAndRepair(0),DocumentDirection,NoEncodingDialog,XMLTransform(_T(""));
docs.Open(&FileName,&ConfirmConversions,&ReadOnly,&AddToRecentFiles,&PasswordDocument,&PasswordTemplate,&Revert,&WritePasswordDocument,&WritePasswordTemplate,&Format,&Encoding,&Visible,&OpenAndRepair,&DocumentDirection,&NoEncodingDialog,&XMLTransform);
//替換模塊名稱
CComVariant FindText3(moduluName);
CComVariant ReplaceWith3(TestName);
CComVariant MatchCase3(false), MatchWholeWord3(false), MatchWildcards3(false),MatchSoundsLike3(false), MatchAllWordForms3(false), Forward3(true), Wrap3(1), Format3(false), Replace3(2), MatchKashida3,MatchDiacritics3,MatchAlefHamza3, MatchControl3;
find3.Execute(&FindText3,&MatchCase3,&MatchWholeWord3,&MatchWildcards3,&MatchSoundsLike3,&MatchAllWordForms3,&Forward3,&Wrap3,&Format3,&ReplaceWith3,&Replace3,&MatchKashida3,&MatchDiacritics3,&MatchAlefHamza3,&MatchControl3);
//保存測試報告
CComVariant FileName6(lpBuffer);
CComVariant FFormat6(0); CcomVariant LComments6(false),PW6(_T(""));
CComVariant AddToRecentFiles6(true),WritePW6(_T(""));
CComVariant ReadOnlyRecommended6(false),EmbedTrueTypeFonts6(false);
CComVariant SaveNPictureFormat6(false),SaveFormData6(false);
CComVariant SaveAsAOCEL6(false);
CComVariant Encoding6, InsertLBreaks6, AllowSub6, LineEnding6, AddBiDiMarks6;
saveDoc.SaveAs(&FileName6,&FFormat6,&LComments6,&PW6,&AddToRecentFiles6,&WritePW6,&ReadOnlyRecommended6,
&EmbedTrueTypeFonts6,&SaveNPictureFormat6,&SaveFormData6,&SaveAsAOCEL6,&Encoding6,&InsertLBreaks6,&AllowSub6,&LineEnding6,&AddBiDiMarks6);
CComVariant SaveCHG(false),ORGFormat,RDocument;
saveDoc.Close(&SaveCHG, &ORGFormat, &RDocument);
如圖2、3所示。
6 結束語
本文通過VC對Word的操縱,實現(xiàn)了將記事本格式內容自動寫入Word格式文件中,簡化了報告的填寫過程,極大的提高了工作效率。
參考文獻
[1]朱敏,沈同圣,王學偉,周曉東.VC++與VBA結合實現(xiàn)復雜報表[J].計算機應用與軟件,2005(02).
[2]熊瑜容,柴毅,王淑娟,王嘉騏.基于VC++的Word文檔自動生成技術[J].計算機時代,2010(01).
[3]陳特放,方斌.VC平臺下基于OLE的Word自動化操作應用[J].計算機應用與軟件,2009(09).
[4]王怒濤,李大凱,李丹,王超.VC++的Word文檔中的表與圖自動生成技術[J].石油工業(yè)計算機應用,2015(02).
[5]岳亮.在VC中利用WORD生成圖文報告[J].電腦編程技巧與維護,2002(05).
[6]雷曉榮,雷凌云,馮宏.VC中用Word生成隨鉆測量報告的一種方法[J].微處理機,2010(04).
[7]徐格寧,馮曉蕾,陶元芳,楊瑞剛.基于COM+ VC+ Word技術的產(chǎn)品設計說明書自動化研究[J].中國工程機械學報,2009(03).
[8]姜照林.用VC實現(xiàn)Word文檔自動化[J].嘉興學院學報,2007(03).
[8]閆新珠,王秀芹.在VC中利用Word生成測量報告[J].地礦測繪,2006(01).
[9]申屠浩,鮑可進.用VC++語言創(chuàng)建WORD文檔[J].計算機工程與設計,2004(06).
[10]劉春雷,吳重光.用VC實現(xiàn)Word自動化操作的研究與應用[J].計算機工程與設計,2004(09).
[11]孫鑫,余安萍編著.VC++深入詳解[M].北京:電子工業(yè)出版社,2006.
作者簡介
張雪詠(1979-),女,大學本科學歷。工程師,主要從事繼電保護及自動化產(chǎn)品的測試技術、測試方法的研究和測試工作。
馬紅濤(1980-),男,工程師,主要從事繼電保護及自動化產(chǎn)品的測試技術、測試方法的研究和測試工作。
趙建峰(1981-),女,工程師,主要從事繼電保護及自動化產(chǎn)品的測試技術、測試方法的研究和測試工作。
作者單位
許繼電氣股份有限公司 河南省許昌市 461000