1、MS Office中的COM应用12.2 MS Office 中的COM应用MS Office中的COM是应用最广泛的自动化技术,该功能所描述的是利用Visual C+应用程序控制Microsoft Office组件。自动化(OLE自动化)技术允许将现有的程序的功能合并到VC+的应用程序中。自动化技术建立在组件对象模型(COM)的基础上,系统的COM随操作系统一起安装的动态链接库(DLL)提供一组服务。例如,应用程序中使用Microsoft Word的拼写和语法检查功能,而不让用户看到Microsoft Word:可以使用Office的OCR技术,自动化也可以使用Microsoft Excel
2、的所有图表、打印和数据分析工具等。该技术的特点大大简化了开发过程,加快了开发的进度。12.2.1 VC+实现Office自动化1问题阐述熟悉VBA的开发者对于这一操作都非常熟悉,在VC+中读取MS Word系统并没有显示的这一功能,但是在Microsoft 的 Office 产品中,都提供了OLE Automation 自动化程序的接口,在VC+中如何实现Office的自动化技术呢?2实现技巧VC+实现Office自动化,通常可以采取以下3种方式实现。1)利用Visual C+的类向导机制,从Office类型库生成包装类生成的这些类,以及诸如 COleVariant、COleSafeArray
3、 和 COleException 之类的其他 MFC类可简化自动化任务,操作更加简单,所以建议采用该方法。2)通过#import指令引入Office类型库,创建智能指针的方式智能指针的功能非常强大,但不建议使用它,因为它与 Microsoft Office 应用程序一起使用时,经常会出现引用计数问题。3)利用C+直接调用COM服务C+相比上面两种方式实现起来比较困难,但是有时为了避免采用MFC造成的资源开销过大或避免使用#import方式所带来的问题,通常采用此种方式。类型库与C/C+头文件类似,它包含服务器发布的接口、方法和属性。Visual C+附带的OLE/COM对象查看器(Olevie
4、w.exe)用来查看类型库。表12-1列出了Microsoft Office 95、Microsoft Office 97、Microsoft Office 2000、Microsoft Office 2002和Microsoft Office 2003的类型库文件名。表12-1 Office类型库 Office版本和类型类型库文件Office版本和类型类型库文件Access 97Msacc8.olbPowerPoint 2000Msppt9.olbJet Database3.5 DAO350.dllWord 2000Msword9.olbBinder 97Msbdr8.olbAccess 2
5、002Msacc.olbExcel 97Excel8.olbExcel 2002Excel.exeGraph 97Graph8.olbGraph 2002Graph.exeOffice 97Mso97.dllOffice 2002MSO.dllOutlook 97Msoutl97.olbOutlook 2002MSOutl.olbPowerPoint 97Msppt8.olbPowerPoint 2002MSPpt.olbWord 97Msword8.olbWord 2002MSWord.olbAccess 2000Msacc9.olbOffice Access 2003Msacc.olbJe
6、t Database 3.51DAO360.dllOffice Excel 2003Excel.exeBinder 2000Msbdr9.olbGraph 2003Graph.exeExcel 2000Excel9.olbOffice 2003MSO.dllGraph 2000Graph9.olbOffice Outlook 2003MSOutl.olbOffice 2000Mso9.dllOffice PowerPoint 2003MSPpt.olbOutlook 2000Msoutl9.olbOffice Word 2003MSWord.olbMFC引入类型库的一般步骤如下。(1)启动MF
7、C的ClassWizard,出现如图12-19所示的对话框。图12-19 添加类型库向导1(2)在Office的目录中找到适合版本的类型库,如图12-20所示。图12-20 添加类型库向导2(3)选择类型文件后,根据所实现的功能选择不同的类,当然,也可以全部选择,如图12-21所示。图12-21 添加类型库向导3(4)单击【OK】按钮,将所选择的类_Application添加到创建应用程序中,如图12-22所示。图12-22 添加类型库向导4在MS Word中,_Application的一个对象代表是Word应用程序本身,在VC+中通过自动化技术控制Word时,则可用_Application声
8、名一个类对象,通过CreateDispatch实例化该对象,代码参考如下:_Application wordApp;wordApp.CreateDispatch(_T(Word.Applcation);实例化对象后,应用程序就启动了应用程序,通过对象实例wordApp可以获得Word版本属性、修改Word标题等,可以参考_Application 方法和属性。3实例代码本实例演示了利用VC+创建的应用程序打开Word,并且获取Word的版本号,关闭Word文档。(1)创建一个基于对话框的工程AutoMation,在窗口上放置一个进度条和两个按钮,用于启动和关闭Word。启动VC+的ClassWi
9、zard,添加MS Word的类型库(MSWord.olb),选择要生成的类_Application。添加后,在源文件文件夹中增加了msword.h和msword.cpp两个文件。(2)在CAutoMationApp的InitInstance中添加初始化COM的代码:HRESULT hr = AfxOleInit(); if(FAILED(hr) AfxMessageBox(初始化COM失败!); (3)为了处理VARIANT类型方便,在stdafx.h中包含头文件atlbase.h。(4)添加按钮的处理消息和定时器处理代码。打开按钮的响应代码:void CAutoMationDlg:OnOp
10、enBtn() if(!m_App.CreateDispatch(CLSID_Application) /可以采用CLSID启动 AfxMessageBox(_T(请检查是否安装了Office); return; if(!m_App.CreateDispatch(_T(Word.Application) /启动Word AfxMessageBox(_T(请检查是否安装了Office); return; else SetTimer(1,500,NULL); MessageBox(Word启动); MessageBox(m_App.GetVersion(); /获取Word版本 m_App.Set
11、Caption(this is a test); /设置Word的标题 m_nCurStep = 0; m_ProgressCtrl.SetStep(10); m_ProgressCtrl.SetRange(0,40); m_App.SetVisible(TRUE); 关闭按钮的响应代码:/*/* 关闭Word/*/void CAutoMationDlg:OnCloseBtn() /定义调用QUIT时使用的参数 VARIANT VarIsSave,VarInit,VarRoute; /退出Word时候的不保存参数 VarIsSave.vt=VT_BOOL; VarIsSave.boolVal=
12、VARIANT_FALSE; /初始化VARIANT变量 :VariantInit(&VarInit); :VariantInit(&VarRoute); /VarRoute.vt=VT_EMPTY; /VarInit.vt = VT_EMPTY; /调用Quit,退出Word应用程序 m_App.Quit(&VarIsSave,&VarInit,&VarRoute); MessageBox(退出Word编辑!); m_ProgressCtrl.SetPos(0); /释放对象指针 m_App.ReleaseDispatch(); /一定要释放定时器处理代码:void CAutoMationD
13、lg:OnTimer(UINT nIDEvent) m_nCurStep+=10; m_ProgressCtrl.SetPos(m_nCurStep); int n = m_ProgressCtrl.GetPos(); if(n 40) KillTimer(1); CDialog:OnTimer(nIDEvent);运行效果如图12-23所示。图12-23 VC+启动Word12.2.2 VC+读/写Word文档1问题阐述在第7章阐述了读/写文本文件、ini 文件、.inf等非复合文档文件,这些文件系统给出了相应的API函数完成了文件的读写,对Word的读取/写入系统没有提供API函数,VC+
14、如何完成Word的读写呢?2实现技巧 写Word文档,首先要从Word应用程序获取文档的类的对象,然后设置文档中接收文字位置,最后将文字写入Word文档。在上一节加入_Application应用程序类,本节继续加入两个类,即Document类和Selection类,按照以前添加类的步骤,将Documents类和Selection类添加进应用程序。Documents类是文档对象集类,是所有Document对象的集合。使用Documents对象集合的Add方法可以新建一篇空白文档并将返回的Document 对象添至Documents对象集合之中。Add方法的原型声明如下:LPDISPATCH Ad
15、d(VARIANT* Template, VARIANT* NewTemplate, VARIANT* DocumentType, VARIANT* Visible)l 参数Template,指定新文档使用的模板名,如果忽略此参数则使用Normal模板。l 参数NewTemplate,如果此属性设置为 True 则将文档作为模板打开。默认值为 False。l 参数DocumentType其值可取下列 WdNewDocumentType常量之一。 WdNewBlankDocument 创建一个空白文档,默认值。 WdNewEmailMessage 新建一个电子邮件信息。 wdNewWebPage
16、 新建一个Web页。l 参数Visible,如果此参数为True,Microsoft Word将在可见窗口打开文档。如果此参数为False,Word仍会打开此文档但文档窗口的Visible属性变为False,默认值为True。Selection类对象用于选定文档的文字,然后对选定部分进行操作,如设置文字的格式或键入文字。Selection 对象代表窗体中的选定内容,每个窗体中只能有一个Selection 对象而且只能激活一个 Selection 对象。Selection 对象代表的选定内容既可以是文档中的一个区域也可以仅仅是一个插入点。通过Selection对象的TypeText和GetTex
17、t可对Word文档进行读写操作。TypeText的函数作用为写Word文档,其函数的声明如下:void TypeText(LPCTSTR Text);GetText的函数的作用是读文档,其函数的声明如下:CString GetText();3实例代码本实例演示了如何读写Word文档。创建一个基于对话框的工程ReadWriteWord。通过上面的方法引入类型库,增加_Application类、Documents类、Selection类。在对话框上添加两个文本控件,两个按钮。文本控件分别用于输入和接收文本。在CreadWriteWord中的InitInstance初始化COM库添加代码如下:HRE
18、SULT hr;hr = AfxOleInit( );if(FAILED(hr) AfxMessageBox(初始化COM失败); return FALSE;在ReadWriteWordDlg.h中包含头文件:#include msword.h#include atlbase.h在stdafx.h中声明自定义消息标识:#define WM_SEND WM_USER+1声明3个_Application、Documents、Selection的对象,参考代码如下:/Attribute _Application m_App; /Word应用程序对象 Documents m_Doc; /Word文档对
19、象 Selection m_Slection; /文档选择对象声明一个CEdit类的派生类CMyEdit,在 CMyEdit中响应WM_CHAR消息,代码如下:void CMyEdit:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) GetParent()-PostMessage(WM_SEND,(WPARAM)nChar,0); /向父窗口发送字符。 CEdit:OnChar(nChar, nRepCnt, nFlags);在ReadWriteWordDlgl类的OnInitDialog函数中实例化Word应用程序,新建Word文档,参考代码如下:
20、BOOL CReadWriteWordDlg:OnInitDialog( )/*try if(!m_App.CreateDispatch(_T(Word.Application) /启动Word AfxMessageBox(_T(请检查是否安装了Office); return FALSE; m_App.SetVisible(true); m_Doc = m_App.GetDocuments(); CComVariant Template(_T(); CComVariant NewTemplate(false),DocumentType(0),Visible; m_Doc.Add(&Templa
21、te,&NewTemplate,&DocumentType,&Visible); catch(_com_error &e) MessageBox(e.ErrorMessage(); /*return TRUE;在ReadWriteWordDlg类中定义WM_SEND的消息体,在ReadWriteWordDlg.h中添加消息函数声明,在ReadWriteWordDlg.cpp中函数的实现参考代码如下:/*/* 消息体函数/*/void CReadWriteWordDlg:SendMsgToWord(WPARAM wParam,LPARAM lParam) CString strTmp = ; U
22、INT nChar = wParam; strTmp.Format(%c,wParam); m_Slection=m_App.GetSelection(); m_Slection.TypeText(strTmp);写Word按钮的响应参考代码如下:void CReadWriteWordDlg:OnWriteBtn() m_Slection=m_App.GetSelection();/Word文档光标输入点读Word按钮的响应参考代码如下:/*/* 读Word /*/void CReadWriteWordDlg:OnReadBtn() m_Slection.GetSections(); /获取光
23、标点 m_Slection.WholeStory(); /对当前文档全选 SetDlgItemText(IDC_READ_ED,m_Slection.GetText();释放对象的参考代码如下:/*/* 最后释放声明的对象/*/void CReadWriteWordDlg:OnDestroy() CDialog:OnDestroy(); m_Slection.ReleaseDispatch(); /释放selection对象 m_Doc.ReleaseDispatch(); /释放Document对象 CComVariant SaveChanges(false),OriginalFormat,
24、RouteDocument; m_App.Quit(&SaveChanges,&OriginalFormat,&RouteDocument); m_App.ReleaseDispatch(); /释放应用程序类对象。程序的运行效果如图12-24所示。利用MSWORD.OLB实现多种格式(DOC、rtf、HTML、XML.)转换成TXT利用MSWORD.OLB实现多种格式(DOC、rtf、HTML、XML.)转换成TXT 首先加载MSWORD.OLB:classwizard-automation-add class-from a type library,选择program files/micr
25、osoft office/office11(用的是office 2003)下的MSWORD.OLB,确定后,在工程中生成msword.ht msword.cpp两个文件。代码部分: / doc、html、xml转Txt, _Application oWord ; Documents oDocs; _Document oDoc; COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR); /For optional args /Start Word if(!(oWord.CreateDispatch(Word.Application, NULL) AfxMessa
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2