梁海珍
(武警指挥学院,天津 300250)
Word作为常用的办公软件之一,提供了查找替换功能,可根据设定对文档内容进行查找替换,但一次只能完成一项查找替换,当有多项需要替换时就需要设置多次,操作比较麻烦。如“1”替换为“一”,“五笔”替换为“拼音”,就需要进行两次设置完成替换。本例通过VC++调用Word组件,可设置多个查找替换项,对当前Word文档进行批量查找替换,为办公带来极大便利。
Microsoft的Office产品,都提供了OLE Automation自动化程序的接口,使用VB、VBA和Script脚本调用Office功能比使用VC++调用要简单得多。比如在Word中,调出菜单“工具—宏—录制新宏”,这时候开始记录Word中任何菜单和键盘的操作,并把操作过程保存起来,以便再次重复调用。这些操作记录的保存,其实就是使用了VBA程序(Visual Basic for Application)。VC++调用 Word 组件,同样要参考VBA的方法,通过查看宏代码,可以清楚地看出要使用哪些类、哪些成员函数。每一个Microsoft Office应用程序都在dll文件中提供了多种类型库资源,这种 dll文件叫做目标库(*.olb)。VC++调用Word组件,需要导入库文件并导入相关的类才能使用Word中的各种功能。不同版本的应用程序其类型库文件的名字不同,如Word 2003为msWord.olb,Word 2000 为 msWord9.olb。
编程采用VC++和Word 2003实现,只需在安装有Word的机器上即可运行本例。本例选用数字、字母、汉字、特殊符号,实现了多种形式符号的替换。
通过VC++调用Word组件即用自动化功能从Visual C++应用程序中控制Microsoft Office组件,在VC++中使用代码组件一般有三种方法:(1)使用COM 库函数;(2)使用 MFC 的 ClassWizard;(3)使用#import指令。本例采用第二种方法,将涉及到Word中有关查找替换类导入添加到VC++程序中,如查找类Find,替换类Replacement等,根据需要进行参数设定调用函数。实现步骤如下:
(1)添加Word中的有关类
VC++中新建一个Dialog-Base MFC AppWizard Exe工程 find,进入 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()函数添加如下代码:
(3)在findDlg.cpp中添加如下两个头文件,并声明对象:
在IDD_FIND_DIALOG对话框界面中添加控件及成员变量,并通过下文中所述示例逐步运行,界面如图1所示:
图1 本例运行界面
2.2.1 添加“新建W ord文档”按钮及响应函数
Step1的功能:完成新建文档,并提示用户输入需要查找替换的文件内容。
如本例是打开可执行文件目录下的11.doc,文档输入内容为:首先插入分页符,然后在第二页中输入“我们1家有5口人。小朋友会唱abc。家里有1只小狗。上下左右上下左右。”
为按钮添加主要代码如下:
//启动Word应用程序
CString docfilepath=strPath+"\11.doc";
//参数设定,主要有文件名称、确认转换、只读、添加到最近文档、文档口令等
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 查找与替换项的设置与响应
Step2的功能:填写需要查找替换的多个项目,并可对已有项进行编辑修改。
在界面中添加查找编辑项、查找列表项、替换编辑项、替换列表项等控件,并添加对应的成员变量m_editfind、m_listfind、m_editrep、m_listrep。在查找编辑框中输入相应的内容,“添加”到查找列表项中,并通过“删除”、“插入”、“清空”等按钮对查找列表内容进行操作。同理,在替换编辑框中输入查找项所对应的内容,逐一添加到替换列表中,即查找列表与替换列表内容一一对应。
本文以step1中输入内容“我们1家有5口人。小朋友会唱abc。家里有1只小狗。上下左右上下左右。”为例,如将文档内容中的“1”替换为“一”,“a”替换为“A”,“上”替换为“下”,“手动分页符”替换为“段落标记”,则在查找编辑框中依次输入“1”、“a”、“上”、“^m”,并添加到查找列表中,在替换编辑框中依次输入“一”、“A”、“下”、“^p”,并添加到替换列表中。
查找项的“添加”按钮主要代码如下:
UpdateData();
m_editfind.TrimRight();
查找列表的“清空”按钮主要代码如下:
m_ctrllistfind.ResetContent();
同理,替换编辑项的“添加”与替换列表的“删除”、“插入”、“清空”等按钮的主要代码与左边查找项的代码相类似,不再赘述。
2.2.3 对查找项进行全部替换
Step3的功能:通过点击“替换”按钮对step2中所设查找项进行全部替换。
为按钮添加主要代码如下:
//当对左边查找项数与右边替换项数判断不一致时提示用户重新核对查找与替换项是否一一对应。
//替换函数的参数设置
CcomVariant FindText(findstr),Match-Case(true),MatchWholeWord(false);
CcomVariant MatchWildcards (false),MatchSoundsLike(false);
CcomVariant MatchAllWordForms(false),Forward(true),Wrap(1),Format(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为查找替换标志,通过while循环对全文所有需替换内容进行查找替换
while(flag)
{
//主要参数有查找内容、区分大小写、全字匹配、使用通配符等
flag=find.Execute (&FindText,&MatchCase,&MatchWholeWord,&MatchWildcards,&Match-SoundsLike,&MatchAllWordForms,&Forward,&Wrap,&Format,&ReplaceWith,&Replace,&MatchKashida,&MatchDiacritics,&MatchAlefHamza,&MatchControl);
通过本步骤的查找替换操作,本例的文档内容更新为:换行符,然后第二行内容是“我们一家有5口人。小朋友会唱Abc。家里有一只小狗。下下左右下下左右。”实现了对全文中多个查找项的替换,如果有特殊要求如全字匹配、区分大小写等,均可通过函数参数进行设定。
本文在VC++6.0、Word2003下实现了利用VC++新建Word文档,并对多个查找项、替换项进行设置,完成所设多个项,如数字、字母、汉字、特殊符号的批量替换。还可以对本例进行进一步完善,如取消“新建Word文档”对固定文档路径的设定,可以增加打开任意.doc文档功能,对已有内容的Word文档直接进行操作;还可以利用Word查找中的高级选项,如设定查找内容的字体、段落等格式,查找特殊符号等,增加本例的功能与实用性。
[1]云舟工作室.中文版Word2000 VBA一册通[M].北京:人民邮电出版社,2000.
[2]Office VBA编程手册合集(CHM)[Z].