梁海珍
(武警指揮學(xué)院,天津 300250)
Word作為常用的辦公軟件之一,提供了查找替換功能,可根據(jù)設(shè)定對文檔內(nèi)容進(jìn)行查找替換,但一次只能完成一項查找替換,當(dāng)有多項需要替換時就需要設(shè)置多次,操作比較麻煩。如“1”替換為“一”,“五筆”替換為“拼音”,就需要進(jìn)行兩次設(shè)置完成替換。本例通過VC++調(diào)用Word組件,可設(shè)置多個查找替換項,對當(dāng)前Word文檔進(jìn)行批量查找替換,為辦公帶來極大便利。
Microsoft的Office產(chǎn)品,都提供了OLE Automation自動化程序的接口,使用VB、VBA和Script腳本調(diào)用Office功能比使用VC++調(diào)用要簡單得多。比如在Word中,調(diào)出菜單“工具—宏—錄制新宏”,這時候開始記錄Word中任何菜單和鍵盤的操作,并把操作過程保存起來,以便再次重復(fù)調(diào)用。這些操作記錄的保存,其實就是使用了VBA程序(Visual Basic for Application)。VC++調(diào)用 Word 組件,同樣要參考VBA的方法,通過查看宏代碼,可以清楚地看出要使用哪些類、哪些成員函數(shù)。每一個Microsoft Office應(yīng)用程序都在dll文件中提供了多種類型庫資源,這種 dll文件叫做目標(biāo)庫(*.olb)。VC++調(diào)用Word組件,需要導(dǎo)入庫文件并導(dǎo)入相關(guān)的類才能使用Word中的各種功能。不同版本的應(yīng)用程序其類型庫文件的名字不同,如Word 2003為msWord.olb,Word 2000 為 msWord9.olb。
編程采用VC++和Word 2003實現(xiàn),只需在安裝有Word的機(jī)器上即可運(yùn)行本例。本例選用數(shù)字、字母、漢字、特殊符號,實現(xiàn)了多種形式符號的替換。
通過VC++調(diào)用Word組件即用自動化功能從Visual C++應(yīng)用程序中控制Microsoft Office組件,在VC++中使用代碼組件一般有三種方法:(1)使用COM 庫函數(shù);(2)使用 MFC 的 ClassWizard;(3)使用#import指令。本例采用第二種方法,將涉及到Word中有關(guān)查找替換類導(dǎo)入添加到VC++程序中,如查找類Find,替換類Replacement等,根據(jù)需要進(jìn)行參數(shù)設(shè)定調(diào)用函數(shù)。實現(xiàn)步驟如下:
(1)添加Word中的有關(guān)類
VC++中新建一個Dialog-Base MFC AppWizard Exe工程 find,進(jìn)入 ClassWizard,點擊 Add Class,選擇From A Type Library,找到office目錄下Word 2003 類型庫 msWord.olb,選擇 _Application、Documents、_Document、Selection、Find、Replacement 類 添加,并聲明對象 Wordapp、WordDocs、WordDoc、sel、find、replace。
(2)在 find.cpp 中為 CFindApp:InitInstance()函數(shù)添加如下代碼:
(3)在findDlg.cpp中添加如下兩個頭文件,并聲明對象:
在IDD_FIND_DIALOG對話框界面中添加控件及成員變量,并通過下文中所述示例逐步運(yùn)行,界面如圖1所示:
圖1 本例運(yùn)行界面
2.2.1 添加“新建W ord文檔”按鈕及響應(yīng)函數(shù)
Step1的功能:完成新建文檔,并提示用戶輸入需要查找替換的文件內(nèi)容。
如本例是打開可執(zhí)行文件目錄下的11.doc,文檔輸入內(nèi)容為:首先插入分頁符,然后在第二頁中輸入“我們1家有5口人。小朋友會唱abc。家里有1只小狗。上下左右上下左右?!?/p>
為按鈕添加主要代碼如下:
//啟動Word應(yīng)用程序
CString docfilepath=strPath+"\11.doc";
//參數(shù)設(shè)定,主要有文件名稱、確認(rèn)轉(zhuǎn)換、只讀、添加到最近文檔、文檔口令等
COleVariant vFileName(docfilepath),vStrNull(_T(""));
COleVariant vFalse (short(0),VT_BOOL),vTrue(short(1),VT_BOOL);
COleVariant vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
//打開文檔
WordDoc.AttachDispatch(WordDocs.Open(vFile-Name,vOpt,vFalse,vOpt,vStrNull,vStrNull,vOpt,vStrNull,vStrNull,vOpt,vOpt,vTrue,vOpt,vOpt,vOpt,vOpt));
}
2.2.2 查找與替換項的設(shè)置與響應(yīng)
Step2的功能:填寫需要查找替換的多個項目,并可對已有項進(jìn)行編輯修改。
在界面中添加查找編輯項、查找列表項、替換編輯項、替換列表項等控件,并添加對應(yīng)的成員變量m_editfind、m_listfind、m_editrep、m_listrep。在查找編輯框中輸入相應(yīng)的內(nèi)容,“添加”到查找列表項中,并通過“刪除”、“插入”、“清空”等按鈕對查找列表內(nèi)容進(jìn)行操作。同理,在替換編輯框中輸入查找項所對應(yīng)的內(nèi)容,逐一添加到替換列表中,即查找列表與替換列表內(nèi)容一一對應(yīng)。
本文以step1中輸入內(nèi)容“我們1家有5口人。小朋友會唱abc。家里有1只小狗。上下左右上下左右?!睘槔?,如將文檔內(nèi)容中的“1”替換為“一”,“a”替換為“A”,“上”替換為“下”,“手動分頁符”替換為“段落標(biāo)記”,則在查找編輯框中依次輸入“1”、“a”、“上”、“^m”,并添加到查找列表中,在替換編輯框中依次輸入“一”、“A”、“下”、“^p”,并添加到替換列表中。
查找項的“添加”按鈕主要代碼如下:
UpdateData();
m_editfind.TrimRight();
查找列表的“清空”按鈕主要代碼如下:
m_ctrllistfind.ResetContent();
同理,替換編輯項的“添加”與替換列表的“刪除”、“插入”、“清空”等按鈕的主要代碼與左邊查找項的代碼相類似,不再贅述。
2.2.3 對查找項進(jìn)行全部替換
Step3的功能:通過點擊“替換”按鈕對step2中所設(shè)查找項進(jìn)行全部替換。
為按鈕添加主要代碼如下:
//當(dāng)對左邊查找項數(shù)與右邊替換項數(shù)判斷不一致時提示用戶重新核對查找與替換項是否一一對應(yīng)。
//替換函數(shù)的參數(shù)設(shè)置
CcomVariant FindText(findstr),Match-Case(true),MatchWholeWord(false);
CcomVariant MatchWildcards (false),MatchSoundsLike(false);
CcomVariant MatchAllWordForms(false),F(xiàn)orward(true),Wrap(1),F(xiàn)ormat(false);
CcomVariant ReplaceWith(replacestr),Replace(true),MatchKashida(false);
CcomVariant MatchDiacritics (false),MatchAlefHamza(false),MatchControl(false);
sel=Wordapp.GetSelection();
sel.WholeStory(); //選中全文
find=sel.GetFind(); //查找對象
replace=find.GetReplacement(); //替換對象
find.ClearFormatting();
replace.ClearFormatting();
//flag為查找替換標(biāo)志,通過while循環(huán)對全文所有需替換內(nèi)容進(jìn)行查找替換
while(flag)
{
//主要參數(shù)有查找內(nèi)容、區(qū)分大小寫、全字匹配、使用通配符等
flag=find.Execute (&FindText,&MatchCase,&MatchWholeWord,&MatchWildcards,&Match-SoundsLike,&MatchAllWordForms,&Forward,&Wrap,&Format,&ReplaceWith,&Replace,&MatchKashida,&MatchDiacritics,&MatchAlefHamza,&MatchControl);
通過本步驟的查找替換操作,本例的文檔內(nèi)容更新為:換行符,然后第二行內(nèi)容是“我們一家有5口人。小朋友會唱Abc。家里有一只小狗。下下左右下下左右?!睂崿F(xiàn)了對全文中多個查找項的替換,如果有特殊要求如全字匹配、區(qū)分大小寫等,均可通過函數(shù)參數(shù)進(jìn)行設(shè)定。
本文在VC++6.0、Word2003下實現(xiàn)了利用VC++新建Word文檔,并對多個查找項、替換項進(jìn)行設(shè)置,完成所設(shè)多個項,如數(shù)字、字母、漢字、特殊符號的批量替換。還可以對本例進(jìn)行進(jìn)一步完善,如取消“新建Word文檔”對固定文檔路徑的設(shè)定,可以增加打開任意.doc文檔功能,對已有內(nèi)容的Word文檔直接進(jìn)行操作;還可以利用Word查找中的高級選項,如設(shè)定查找內(nèi)容的字體、段落等格式,查找特殊符號等,增加本例的功能與實用性。
[1]云舟工作室.中文版Word2000 VBA一冊通[M].北京:人民郵電出版社,2000.
[2]Office VBA編程手冊合集(CHM)[Z].