当前位置:文档之家› VC操作word实例详解

VC操作word实例详解

VC操作word实例详解[转]我们操纵Word需要通过类型库中的MFC类。

而这些类,应该都是基于一个叫COleDispatchDriv er的类。

至少我所了解到的都是这样。

COleDispatchDriv er没有基类。

COleDispatchDriv er类实现OLE自动化中的客户方。

OLE调度接口为访问一个对象的方法和属性提供了途径。

COleDispatchDriv er的成员函数连接,分离,创建和释放一个IDispatch类型的调度连接。

其它的成员函数使用变量参数列表来简化调用IDispatch::Inv oke。

学习如何自动化控制Word、Excel 和Powerpoint 的对象模型的最佳方法是使用这些Off ice 应用程序中的宏录制器:从工具菜单上的宏选项中选择录制新宏,然后执行您感兴趣的任务。

从工具菜单上的宏选项中选择停止录制。

完成录制后,从工具菜单上的宏选项中选择宏,选择您录制的宏,然后单击编辑。

您将看到生成的VBA 代码,该代码可完成您所录制的任务。

记住,录制的宏在大多数情况下并不是最佳代码,但它可以提供快捷可用的示例。

Application:代表Microsof t Word 应用程序。

Application 对象包含可返回最高级对象的属性和方法。

例如,Activ eDocument 属性可返回当前活动的Document 对象。

Documents:由Word 当前打开的所有Document(文档)对象所组成的集合。

Document:代表一篇文档。

Document 对象是Documents 集合中的一个元素。

Documents 集合包含Word 当前打开的所有Document 对象。

Selection:该对象代表窗口或窗格中的当前所选内容。

所选内容代表文档中被选定(或突出显示的)的区域,若文档中没有所选内容,则代表插入点。

每个文档窗格只能有一个活动的Selection 对象,并且整个应用程序中只能有一个活动的Selection 对象。

例子1:#include "msword9.h" //为了使代码集中,方便阅读,所以把头文件放到了这里v oid CStep1Dlg::OnOK(){_Application app; //定义一个WORD的应用对象if(!app.CreateDispatch(_T("Word.Application"))) //启动WORD{AfxMessageBox(_T("居然你连OFFICE都没有安装吗?"));return;}AfxMessageBox(_T("WORD 已经运行启动啦,你可以用Ctrl+Alt+Del查看"));app.SetVisible(TRUE); //设置WORD可见。

//当然,如果你想要悄悄地调用WORD的功能,则注释掉这条语句AfxMessageBox(_T("现在你已经看到WORD的程序界面了吧"));AfxMessageBox(_T("WORD准备要退出啦"));VARIANT Sav eChanges,OriginalFormat,RouteDocument; //定义调用QUIT时使用的参数Sav eChanges.v t=VT_BOOL; //设置退出WORD时候的保存参数Sav eChanges.boolVal=VARIANT_FALSE; //为不保存任何文档,模板及设置::VariantInit(&OriginalFormat); //清空变量RouteDocument.vt=VT_EMPTY; //清空变量的另一种方法//调用Quit退出WORD应用程序。

当然不调用也可以,那样的话WORD还在运行着那app.Quit(&Sav eChanges,&OriginalFormat,&RouteDocument);app.ReleaseDispatch(); //释放对象指针。

切记,必须调用AfxMessageBox(_T("Step1执行完成。

接着请学习Setp2"));}例子2:#include "msword9.h"#include <AtlBase.h> //新增加了一个头文件,为使用CComVariant替代VARIANT做准备v oid CStep2Dlg::OnOK(){//以下3行代码,同Step1。

就不解释啦_Application app;//为了简单,没有判断返回值。

如果没有成功,记得检查你有没有Af xOleInit()呀?app.CreateDispatch(_T("Word.Application"));app.SetVisible(TRUE);AfxMessageBox(_T("WORD已经启动,现在要退出啦"));AfxMessageBox(_T("怎么和Step1没有什么区别呀?"));AfxMessageBox(_T("嘿嘿,是没什么区别,但是使用方式简单了很多呀。

看看源程序吧"));//准备调用_Application::Quit函数了,需要定义3个参数。

//但是,这次我们使用CComVariant,这是一个模板类。

//在定义的时候直接调用带参数的构造函数,比VARIANT使用简单多了吧CComVariant Sav eChanges(f alse),OriginalFormat,RouteDocument;//使用CComVariant 的不带参数的构造函数,默认就是使用VT_EMPTY,设置为空类型//另外,除了CComVariant,你还可以使用COleVariant和_v ariant_t,但我个人最喜欢前者app.Quit(&Sav eChanges,&OriginalFormat,&RouteDocument);app.ReleaseDispatch();AfxMessageBox(_T("下面该学习Setp3了"));}例子3:#include "msword9.h"#include <AtlBase.h>v oid CStep3Dlg::OnOK(){////////////// 这次,我们要控制在WORD中输入一些字符了//////////////////////************* WORD 录制的宏,新建一个空文档,然后输入一些文字************ Documents.Add Template:= _"C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates\Normal.dot" _ , NewTemplate:=False, DocumentTy pe:=0Selection.Ty peText Text:="HELLO"Selection.Ty peParagraphSelection.Ty peText Text:="大家好"***************************************************************************/_Application app;app.CreateDispatch(_T("Word.Application"));app.SetVisible(TRUE);AfxMessageBox(_T("看好了,就要新建一个空白文档了"));//通过WORD宏可以知道,由于要使用Documents,于是我们定义一个并从app中取得Documents docs=app.GetDocuments();//准备调用Documents::Add函数了,需要定义4个参数。

//从WORD宏可以看出来3个参数的类型为://Template字符,NewTemplate布尔,Document Ty pe数值//但Add函数还需要一个参数是Visible,傻子也能看出来这个值表示是否显示出新文档//并且可以给默认值(VT_EMPTY)CComVariant Template(_T("")); //为了简单,没有使用WORD的文档模板CComVariant NewTemplate(f alse),DocumentTy pe(0),Visible;docs.Add(&Template,&NewTemplate,&DocumentTy pe,&Visible);AfxMessageBox(_T("下面,程序要向WORD发送字符啦"));//通过WORD宏可以知道,由于要使用Selection,于是我们定义一个并从app中取得//Selection表示输入点,即光标闪烁的那个地方Selection sel=app.GetSelection();//调用函数Selection::Ty peText 向WORD发送字符sel.Ty peText(_T("HELLO\r\n大家好呀"));AfxMessageBox(_T("看见了吗?我要退出啦"));sel.ReleaseDispatch(); //Selection 不用了,一定要释放docs.ReleaseDispatch(); //Documents 也不用了CComVariant Sav eChanges(f alse),OriginalFormat,RouteDocument;app.Quit(&Sav eChanges,&OriginalFormat,&RouteDocument);app.ReleaseDispatch();AfxMessageBox(_T("下面该学习Setp4了"));}例子4:#include "msword9.h"#include <AtlBase.h>v oid CStep4Dlg::OnOK(){_Application app;app.CreateDispatch(_T("Word.Application"));app.SetVisible(TRUE);Documents docs=app.GetDocuments();CComVariant Template(_T(""));CComVariant NewTemplate(f alse),DocumentTy pe(0),Visible;docs.Add(&Template,&NewTemplate,&DocumentTy pe,&Visible);Selection sel=app.GetSelection();COleVariant v arstrRange("");COleVariant v arConf irmConv ersions(short(0),VT_BOOL);COleVariant v arLink(short(0),VT_BOOL);COleVariant v arAttachment(short(0),VT_BOOL);sel.InsertFile("C:\\M y Project\\WordOperator\\doc\\fjjb.doc",v arstrRange,v arConf irmConv ersions,v arLink,varAttachment);sel.Mov eUp(COleVariant((short)5),COleVariant((short)2),COleVariant((short)0));sel.Ty peText("123456789 ");sel.Mov eRight(COleVariant((short)12),COleVariant((short)1),COleVariant((short)0));sel.Ty peText(_T("HELLO"));sel.Mov eRight(COleVariant((short)1),COleVariant((short)1),COleVariant((short)0));sel.Ty peText("123456789");AfxMessageBox(_T("好了,我要保存到c:\\hello.doc中了"));/**************** 这是在WORD中录制的新建文档直到另存的宏*************Documents.Add Template:= _"C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates\Normal.dot" _, NewTemplate:=False, DocumentTy pe:=0Selection.Ty peText Text:="Hello"Selection.Ty peParagraphSelection.Ty peText Text:="大家好"ChangeFileOpenDirectory "C:\"Activ eDocument.Sav eAs FileName:="Hello.doc", FileFormat:=wdFormatDocument _, LockComments:=False, Password:="", AddToRecentFiles:=True, _WritePassword:="", ReadOnly Recommended:=False, EmbedTrueTy peFonts:=False, _Sav eNativ ePictureFormat:=False, Sav eFormsData:=False, Sav eAsAOCELetter:= _ False*********************************************************************//**************** 程序思路******************************************另存为的函数是Activ eDocument.Sav eAs,显然表示的是对当前活跃的文档进行保存,在我们的类中没有Activ eDocument,其实它对应的是_Document,而这个可以由_Application 的GetActiv eDocument()得到。

相关主题