梁海珍
(武警指揮學(xué)院,天津 300250)
Word文檔是日常工作中使用較多的文檔格式之一,在實(shí)際應(yīng)用中,用戶希望一些應(yīng)用程序也能夠讀取Word文檔內(nèi)容,為辦公帶來便利。而有時(shí)候在應(yīng)用程序中不需要打開Word文檔,只需要查找文檔中是否含有某個(gè)關(guān)鍵詞,雖然操作系統(tǒng)自帶的搜索功能可以實(shí)現(xiàn)這一要求,但是操作起來比較麻煩,也不便于程序中模塊的相互調(diào)用。如果應(yīng)用程序自帶檢索功能,不僅可以省去與操作系統(tǒng)的搜索功能來回切換的步驟,而且還可將檢索結(jié)果直觀地呈現(xiàn)在應(yīng)用程序中,便于程序中其他模塊調(diào)用這些檢索結(jié)果。
在應(yīng)用程序中實(shí)現(xiàn)檢索有多種方法,可以調(diào)用操作系統(tǒng)的“搜索”功能來實(shí)現(xiàn),但是需要知道相應(yīng)的接口,對(duì)于初學(xué)者來說比較困難。本文利用VC++實(shí)現(xiàn)在不打開Word文檔的情況下,根據(jù)給定的關(guān)鍵詞,檢索某一給定路徑下的所有Word文檔,并統(tǒng)計(jì)出文檔中有此關(guān)鍵詞的文檔數(shù)量與文檔路徑,并可對(duì)查找出的文檔進(jìn)行編輯修改。
VC++調(diào)用Microsoft Office產(chǎn)品中提供的OLE Automation自動(dòng)化程序的接口,每一個(gè)Microsoft Office應(yīng)用程序都在dll文件中提供了多種類型庫資源,這種 dll文件叫做目標(biāo)庫(*.olb)。不同版本的應(yīng)用程序其類型庫文件的名字不同,如Word 2003 的為 msword.olb。本例由 VC++調(diào)用Word,參考VBA的方法,需要導(dǎo)入庫文件并導(dǎo)入相關(guān)的類,使用Word中的各種功能。
本例編程實(shí)現(xiàn)在指定路徑下查找給定關(guān)鍵詞,并統(tǒng)計(jì)出該路徑下符合條件的文檔數(shù)量與路徑,并可對(duì)選定文檔進(jìn)行編輯修改。例程運(yùn)行如圖1所示。其中實(shí)現(xiàn)步驟及各部分主要功能、代碼如下:
//以讀取下拉框中的關(guān)鍵詞為例,也可自行輸入
UpdateData();
findstr=m_skey;
我們以查找“研究生”關(guān)鍵詞為例,從下拉框中選取,其運(yùn)行界面如圖1所示。
本例中將某個(gè)路徑下所有文件夾與文件夾中的Word文檔用樹表示出來,用戶可以選定左邊目錄樹中某個(gè)文件夾作為查找范圍。本文以“計(jì)算機(jī)系”文件夾為查找路徑,當(dāng)選中后,當(dāng)前文件夾下的所有Word文檔顯示在右側(cè)“當(dāng)前結(jié)點(diǎn)下的所有Word文檔”列表中,如圖1右上方所示。
如果Word文檔中關(guān)鍵詞有的在文本框中,有的在正文中,而用VC調(diào)用Word的Find類對(duì)象后,是找不到文本框中的關(guān)鍵詞的,僅能找到正文中的關(guān)鍵詞。因此需要分別對(duì)正文與文本框進(jìn)行查找。由于VC++操作Word的有關(guān)程序比較多,因此就不再贅述。
//對(duì)選定路徑下的文檔逐個(gè)查找
for(int j=0;j 圖1 例程運(yùn)行界面 (1)其中,在文檔正文中查找關(guān)鍵詞的主要代碼如下: sel=Wordapp.GetSelection(); //Selection 類對(duì)象 find=sel.GetFind(); //Find 類對(duì)象 find.ClearFormatting(); BOOL flag=false; //初始化是否找到關(guān)鍵詞的標(biāo)志 //以下是有關(guān)參數(shù)設(shè)置 CComVariant FindText(findstr), MatchCase(false),// 區(qū)分大小寫 MatchWholeWord(true),// 全字匹配 MatchWildcards(false),// 使用通配符 MatchSoundsLike(false),// 同音英文 MatchAllWordForms(false), Forward(false),F(xiàn)ormat(false),Replace(false),MatchKashida(false), MatchDiacritics(false),MatchAlefHamza(false),MatchControl(false); //查找 flag=find.Execute(&FindText,&MatchCase, &MatchWholeWord, &MatchWildcards, &MatchSoundsLike, &Match AllWordForms,&For ward,&Wrap, &Format,&ReplaceWith,&Replace, &MatchKashida,&Match-Diacritics, &MatchAlefHamza, &Match-Control); (2)在文檔的文本框中查找關(guān)鍵詞主要代碼如下: 檢索結(jié)束后,將會(huì)彈出文件數(shù)量統(tǒng)計(jì)結(jié)果,如圖1提示框所示,主要代碼如下: CString strcount; strcount.Format("檢索完畢,共找到%d 個(gè)文件!",count); MessageBox(strcount," 檢索分系統(tǒng)提示",MB_ICONWARNING); 將符合條件的文檔路徑顯示在右下方“符合條件的文檔”列表中,并可選定列表中的文檔,“打開文檔”進(jìn)行編輯修改,如圖1右下方所示。 本文在 VC++6.0、word2003 下調(diào)試通過,實(shí)現(xiàn)了利用VC++對(duì)指定路徑下的word文檔內(nèi)容進(jìn)行關(guān)鍵詞檢索,包括全文和文本框檢索,并可對(duì)選中的Word文檔進(jìn)行打開編輯等操作。當(dāng)文檔數(shù)量很多時(shí),運(yùn)行速度會(huì)比較慢,但本例可以作為簡(jiǎn)單關(guān)鍵詞檢索的參考。為了進(jìn)一步完善系統(tǒng)功能,還可以考慮利用操作系統(tǒng)提供的檢索功能接口來對(duì)更多類型的文檔進(jìn)行檢索。 [1]云舟工作室.中文版Word2000VBA一冊(cè)通[M].北京:人民郵電出版社,2000. [2]Office編程手冊(cè)合集(CHM)[Z]. [3]梁海珍.批量查找替換的實(shí)現(xiàn)[J].河北軟件職業(yè)技術(shù)學(xué)院學(xué)報(bào),2011(4).2.4 檢索結(jié)果
3 小結(jié)