[转]VC++操作Word
工具: vc++6.0 。
关键字: c++ , MFC 。
要求:系统安装 MS OFFICE 2003 。
过程:
准备工作:
1. 创建一个 MFC(EXE) 工程: MFC AppWizard ( exe ),工程为对话框形式(测试用)。
2. 在 CLASS VIEW 页面创建一个类:类名为: CWordOffice ,类的类型为: Class type : Generic Class 。
3. 在工具栏中找到 view -> class wizard -> Automation -> add class -> from a tye library ,然后选中 offfice 安装的目录中的 MSWORD.OLB ,然后选中所有列出的类名,点 OK 完成。
4. 最后,这里给出一个操作word的最简单的程序源码wordApp.rar(XP + VC6 + Word2010)
准备工作完成,下面贴出相关部分的代码:
CWordOffice.h 中的手动写入的代码如下(自动生成的没有加入): #include "atlbase.h" #include "msword.h" class CWordOffice { private : _Application m_wdApp; Documents m_wdDocs; _Document m_wdDoc; Selection m_wdSel; Range m_wdRange; InlineShapes m_wdInlineShapes; InlineShape m_wdInlineShape; public : CWordOffice(); virtual ~CWordOffice(); public : //操作 //**********************创建新文档******************************************* BOOL CreateApp(); //创建一个新的WORD应用程序 BOOL CreateDocuments(); //创建一个新的Word文档集合 BOOL CreateDocument(); //创建一个新的Word文档 BOOL Create(); //创建新的WORD应用程序并创建一个新的文档 void ShowApp(); //显示WORD文档 void HideApp(); //隐藏word文档 //**********************打开文档********************************************* BOOL OpenDocument(CString fileName); //打开已经存在的文档。 BOOL Open(CString fileName); //创建新的WORD应用程序并打开一个已经存在的文档。 BOOL SetActiveDocument( short i); //设置当前激活的文档。 //**********************保存文档********************************************* BOOL SaveDocument(); //文档是以打开形式,保存。 BOOL SaveDocumentAs(CString fileName); //文档以创建形式,保存。 BOOL CloseDocument(); void CloseApp(); //**********************文本书写操作***************************************** void WriteText(CString szText); //当前光标处写文本 void WriteNewLineText(CString szText, int nLineCount = 1); //换N行写字 void WriteEndLine(CString szText); //文档结尾处写文本 void WholeStory(); //全选文档内容 void Copy(); //复制文本内容到剪贴板 void InsertFile(CString fileName); //将本地的文件全部内容写入到当前文档的光标处。 //**********************图片插入操作***************************************** void InsertShapes(CString fileName); //在当前光标的位置插入图片 //**********************超链接插入操作***************************************** void InsertHyperlink(CString fileLink); //超级链接地址,可以是相对路径。 }; CWordOffice.cpp中的手写代码如下: CWordOffice::CWordOffice() { } CWordOffice::~CWordOffice() { COleVariant vTrue(( short )TRUE), vFalse(( short )FALSE), vOptional(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); //m_wdDoc.Save(); m_wdApp.Quit(vFalse, // SaveChanges. vTrue, // OriginalFormat. vFalse // RouteDocument. ); //释放内存申请资源 m_wdInlineShape.ReleaseDispatch(); m_wdInlineShapes.ReleaseDispatch(); //m_wdTb.ReleaseDispatch(); m_wdRange.ReleaseDispatch(); m_wdSel.ReleaseDispatch(); //m_wdFt.ReleaseDispatch(); m_wdDoc.ReleaseDispatch(); m_wdDocs.ReleaseDispatch(); m_wdApp.ReleaseDispatch(); } //操作 BOOL CWordOffice::CreateApp() { if (FALSE == m_wdApp.CreateDispatch( "Word.Application" )) { AfxMessageBox( "Application创建失败,请确保安装了word 2000或以上版本!" , MB_OK|MB_ICONWARNING); return FALSE; } return TRUE; } BOOL CWordOffice::CreateDocuments() { if (FALSE == CreateApp()) { return FALSE; } m_wdDocs.AttachDispatch(m_wdApp.GetDocuments()); if (!m_wdDocs.m_lpDispatch) { AfxMessageBox( "Documents创建失败!" , MB_OK|MB_ICONWARNING); return FALSE; } return TRUE; } BOOL CWordOffice::CreateDocument() { if (!m_wdDocs.m_lpDispatch) { AfxMessageBox( "Documents为空!" , MB_OK|MB_ICONWARNING); return FALSE; } COleVariant varTrue( short (1),VT_BOOL),vOptional(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); CComVariant Template(_T( "" )); //没有使用WORD的文档模板 CComVariant NewTemplate( false ),DocumentType(0),Visible; m_wdDocs.Add(&Template,&NewTemplate,&DocumentType,&Visible); //得到document变量 m_wdDoc = m_wdApp.GetActiveDocument(); if (!m_wdDoc.m_lpDispatch) { AfxMessageBox( "Document获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } //得到selection变量 m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) { AfxMessageBox( "Select获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } //得到Range变量 m_wdRange = m_wdDoc.Range(vOptional,vOptional); if (!m_wdRange.m_lpDispatch) { AfxMessageBox( "Range获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } return TRUE; } BOOL CWordOffice::Create() { if (FALSE == CreateDocuments()) { return FALSE; } return CreateDocument(); } void CWordOffice::ShowApp() { m_wdApp.SetVisible(TRUE); } void CWordOffice::HideApp() { m_wdApp.SetVisible(FALSE); } BOOL CWordOffice::OpenDocument(CString fileName) { if (!m_wdDocs.m_lpDispatch) { AfxMessageBox( "Documents为空!" , MB_OK|MB_ICONWARNING); return FALSE; } COleVariant vTrue(( short )TRUE), vFalse(( short )FALSE), vOptional(( long )DISP_E_PARAMNOTFOUND, VT_ERROR), vZ(( short )0); COleVariant vFileName(_T(fileName)); //得到document变量 m_wdDoc.AttachDispatch(m_wdDocs.Open( vFileName, // FileName vTrue, // Confirm Conversion. vFalse, // ReadOnly. vFalse, // AddToRecentFiles. vOptional, // PasswordDocument. vOptional, // PasswordTemplate. vOptional, // Revert. vOptional, // WritePasswordDocument. vOptional, // WritePasswordTemplate. vOptional, // Format. // Last argument for Word 97 vOptional, // Encoding // New for Word 2000/2002 vOptional, // Visible //如下4个是word2003需要的参数。本版本是word2000。 vOptional, // OpenAndRepair vZ, // DocumentDirection wdDocumentDirection LeftToRight vOptional, // NoEncodingDialog vOptional ) // Close Open parameters ); // Close AttachDispatch if (!m_wdDoc.m_lpDispatch) { AfxMessageBox( "Document获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } //得到selection变量 m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) { AfxMessageBox( "Select获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } //得到全部DOC的Range变量 m_wdRange = m_wdDoc.Range(vOptional,vOptional); if (!m_wdRange.m_lpDispatch) { AfxMessageBox( "Range获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } return TRUE; } BOOL CWordOffice::Open(CString fileName) { if (FALSE == CreateDocuments()) { return FALSE; } return OpenDocument(fileName); } BOOL CWordOffice::SetActiveDocument( short i) { COleVariant vIndex(_T(i)),vOptional(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); m_wdDoc.AttachDispatch(m_wdDocs.Item(vIndex)); m_wdDoc.Activate(); if (!m_wdDoc.m_lpDispatch) { AfxMessageBox( "Document获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } //得到selection变量 m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) { AfxMessageBox( "Select获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } //得到全部DOC的Range变量 m_wdRange = m_wdDoc.Range(vOptional,vOptional); if (!m_wdRange.m_lpDispatch) { AfxMessageBox( "Range获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } HideApp(); return TRUE; } BOOL CWordOffice::SaveDocument() { if (!m_wdDoc.m_lpDispatch) { AfxMessageBox( "Document获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } m_wdDoc.Save(); return TRUE; } BOOL CWordOffice::SaveDocumentAs(CString fileName) { if (!m_wdDoc.m_lpDispatch) { AfxMessageBox( "Document获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } COleVariant vTrue(( short )TRUE), vFalse(( short )FALSE), vOptional(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); COleVariant vFileName(_T(fileName)); m_wdDoc.SaveAs( vFileName, //VARIANT* FileName vOptional, //VARIANT* FileFormat vOptional, //VARIANT* LockComments vOptional, //VARIANT* Password vOptional, //VARIANT* AddToRecentFiles vOptional, //VARIANT* WritePassword vOptional, //VARIANT* ReadOnlyRecommended vOptional, //VARIANT* EmbedTrueTypeFonts vOptional, //VARIANT* SaveNativePictureFormat vOptional, //VARIANT* SaveFormsData vOptional, //VARIANT* SaveAsAOCELetter vOptional, vOptional, vOptional, vOptional, vOptional ); return TRUE; } BOOL CWordOffice::CloseDocument() { COleVariant vTrue(( short )TRUE), vFalse(( short )FALSE), vOptional(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); m_wdDoc.Close(vFalse, // SaveChanges. vTrue, // OriginalFormat. vFalse // RouteDocument. ); m_wdDoc.AttachDispatch(m_wdApp.GetActiveDocument()); if (!m_wdDoc.m_lpDispatch) { AfxMessageBox( "Document获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } //得到selection变量 m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) { AfxMessageBox( "Select获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } //得到全部DOC的Range变量 m_wdRange = m_wdDoc.Range(vOptional,vOptional); if (!m_wdRange.m_lpDispatch) { AfxMessageBox( "Range获取失败!" , MB_OK|MB_ICONWARNING); return FALSE; } return TRUE; } void CWordOffice::CloseApp() { COleVariant vTrue(( short )TRUE), vFalse(( short )FALSE), vOptional(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); m_wdDoc.Save(); m_wdApp.Quit(vFalse, // SaveChanges. vTrue, // OriginalFormat. vFalse // RouteDocument. ); //释放内存申请资源 m_wdInlineShape.ReleaseDispatch(); m_wdInlineShapes.ReleaseDispatch(); //m_wdTb.ReleaseDispatch(); m_wdRange.ReleaseDispatch(); m_wdSel.ReleaseDispatch(); //m_wdFt.ReleaseDispatch(); m_wdDoc.ReleaseDispatch(); m_wdDocs.ReleaseDispatch(); m_wdApp.ReleaseDispatch(); } void CWordOffice::WriteText(CString szText) { m_wdSel.TypeText(szText); } void CWordOffice::WriteNewLineText(CString szText, int nLineCount /* = 1 */) { int i; if (nLineCount <= 0) { nLineCount = 0; } for (i = 0; i < nLineCount; i++) { m_wdSel.TypeParagraph(); } WriteText(szText); } void CWordOffice::WriteEndLine(CString szText) { m_wdRange.InsertAfter(szText); } void CWordOffice::WholeStory() { m_wdRange.WholeStory(); } void CWordOffice::Copy() { m_wdRange.CopyAsPicture(); } void CWordOffice::InsertFile(CString fileName) { COleVariant vFileName(fileName), vTrue(( short )TRUE), vFalse(( short )FALSE), vOptional(( long )DISP_E_PARAMNOTFOUND, VT_ERROR), vNull(_T( "" )); /* void InsertFile(LPCTSTR FileName, VARIANT* Range, VARIANT* ConfirmConversions, VARIANT* Link, VARIANT* Attachment); */ m_wdSel.InsertFile( fileName, vNull, vFalse, vFalse, vFalse ); } void CWordOffice::InsertShapes(CString fileName) { COleVariant vTrue(( short )TRUE), vFalse(( short )FALSE), vOptional(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); m_wdInlineShapes=m_wdSel.GetInlineShapes(); m_wdInlineShape=m_wdInlineShapes.AddPicture(fileName,vFalse,vTrue,vOptional); } void CWordOffice::InsertHyperlink(CString fileLink) { COleVariant vAddress(_T(fileLink)),vSubAddress(_T( "" )); Range aRange = m_wdSel.GetRange(); Hyperlinks vHyperlinks(aRange.GetHyperlinks()); vHyperlinks.Add( aRange, //Object,必需。转换为超链接的文本或图形。 vAddress, //Variant 类型,可选。指定的链接的地址。此地址可以是电子邮件地址、Internet 地址或文件名。请注意,Microsoft Word 不检查该地址的正确性。 vSubAddress, //Variant 类型,可选。目标文件内的位置名,如书签、已命名的区域或幻灯片编号。 vAddress, //Variant 类型,可选。当鼠标指针放在指定的超链接上时显示的可用作“屏幕提示”的文本。默认值为 Address。 vAddress, //Variant 类型,可选。指定的超链接的显示文本。此参数的值将取代由 Anchor 指定的文本或图形。 vSubAddress //Variant 类型,可选。要在其中打开指定的超链接的框架或窗口的名字。 ); vHyperlinks.ReleaseDispatch(); } 测试部分代码如下: 需要在对话框中添加一个按钮,按钮的事件方法内添加如下代码: void CWordOperateDlg::OnButtonWord() { AfxEnableControlContainer(); AfxOleInit(); CWordOffice wd; wd.CreateDocuments(); wd.OpenDocument( "d:\\a.doc" ); wd.ShowApp(); //显示word } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~