12.2.2 VC++(www.cppentry.com)读/写Word文档
1.问题阐述
在第7章阐述了读/写文本文件、ini 文件、.inf等非复合文档文件,这些文件系统给出了相应的API函数完成了文件的读写,对Word的读取/写入系统没有提供API函数,VC++(www.cppentry.com)如何完成Word的读写呢?
2.实现技巧
写Word文档,首先要从Word应用程序获取文档的类的对象,然后设置文档中接收文字位置,最后将文字写入Word文档。
在上一节加入_Application应用程序类,本节继续加入两个类,即Document类和Selection类,按照以前添加类的步骤,将Documents类和Selection类添加进应用程序。
Documents类是文档对象集类,是所有Document对象的集合。使用Documents对象集合的Add方法可以新建一篇空白文档并将返回的Document 对象添至Documents对象集合之中。
Add方法的原型声明如下:
LPDISPATCH Add( VARIANT* Template, VARIANT* NewTemplate, VARIANT* DocumentType, VARIANT* Visible) |
参数Template,指定新文档使用的模板名,如果忽略此参数则使用Normal模板。
参数NewTemplate,如果此属性设置为 True 则将文档作为模板打开。默认值为 False。
参数DocumentType其值可取下列 WdNewDocumentType常量之一。
WdNewBlankDocument 创建一个空白文档,默认值。
WdNewEmailMessage 新建一个电子邮件信息。
wdNewWebPage 新建一个Web页。
参数Visible,如果此参数为True,Microsoft Word将在可见窗口打开文档。如果此参数为False,Word仍会打开此文档但文档窗口的Visible属性变为False,默认值为True。
Selection类对象用于选定文档的文字,然后对选定部分进行操作,如设置文字的格式或键入文字。Selection 对象代表窗体中的选定内容,每个窗体中只能有一个Selection 对象而且只能激活一个 Selection 对象。Selection 对象代表的选定内容既可以是文档中的一个区域也可以仅仅是一个插入点。通过Selection对象的TypeText和GetText可对Word文档进行读写操作。
TypeText的函数作用为写Word文档,其函数的声明如下:
void TypeText(LPCTSTR Text); |
GetText的函数的作用是读文档,其函数的声明如下:
3.实例代码
本实例演示了如何读写Word文档。
创建一个基于对话框的工程ReadWriteWord。通过上面的方法引入类型库,增加_Application类、Documents类、Selection类。在对话框上添加两个文本控件,两个按钮。文本控件分别用于输入和接收文本。
在CreadWriteWord中的InitInstance初始化COM库添加代码如下:
HRESULT 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文档对象 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文档,参考代码如下:
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(&Template,&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 = ""; UINT 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(); //获取光标点 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,RouteDocument; m_App.Quit(&SaveChanges,&OriginalFormat,&RouteDocument); m_App.ReleaseDispatch(); //释放应用程序类对象。 } |
程序的运行效果如图12-24所示。
|
| 图12-24 读/写Word |
【责任编辑:
夏书 TEL:(010)68476606】