折腾了将近一个月的WORD文档开发终于告一段落。这件事已经很多大牛已经做过了。并且很多方法都已经非常详细,提供的资料也非常齐全。不过由于时间的久远并且较为散乱。所以我在学习时间过程中还是走了一些些弯路。所以想整理一下自己的成果,供自己后期复习以及分享。

我的平台是 WIN7+VS2005+WORD2003;

、通过VC++6.0提取需要文档

整个程序需要调用word进程进行操作,所以我们必须要包含word的接口文件。

根据wowolook的博客http://blog.csdn.net/wowolook/article/details/8509664我们必须要添加类型库word2003相对应的类型库是MSWord.olb 。

如果你使用VS2005添加类->TypeLib中的MFC类,然后找到OFFICE安装路径下的MSword.olb,你会发现你选择一个函数就会生成一个头文件,到最后你全选过后发现‘头文件’里多了n++的头文件,即使你全部包含到工程中,依旧会报错。但如果使用VC++6.0来添加,则只会生成msword.h和msword.cpp两个文件。不单单方便、简单、并且好使用。使用的时候只需要 #include “msword.h” 就可以了。因为我的工程只能在VS2005下进行,所以我必须得弄到这两个文件。所以我只能在再安装一个VC++6.0。然后通过VC++6.0来生成msword.h和msword.cpp两个文件,然后再拷贝到VS2005的工程中。有些大牛已经给出了这两个文件,不过他们生成的时候并没有包含全部的函数。所以我只能自己生成。我一会把这两个文件上传到论坛里,直接下载拷贝到工程中就可以使用 :) 。

--------------------------------------------------------------------------------

msword.h和msword.cpp文档下载:

http://download.csdn.net/detail/skyhuangdan/6995993

---------------------------------------------------------------------------------

二、具体步骤

1、创建(或打开)一个MFC工程
2、把msword.h和msword.cpp两个文件包含进工程当中。
3、初始化COM。方法一,找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用;方法二,在需要调用COM功能的地方 CoInitialize(NULL),调用完毕后 CoUninitialize()。
4、在你需要的文件中#include“msword.h”。
------------------------------------------------------------------------------------------------------------------------------------------------------------
至此环境搭配已经完成。至于如何使用msword里面的函数进行开发,很多大牛已经做得非常好了。所以在此我就省略这一段了。在此我把相关的博客贴出:
c++ 操作Word:
http://blog.csdn.net/wowolook/article/details/8509664 该博客最后给出的练习非常非常好。让我非常直观、简单的认识到了msword.h的使用。建议重点学习这个博客。
MFC/VC++调用word进行报表制作:
http://www.cnblogs.com/scq2099yt/archive/2008/01/07/1028717.html

三、封装msword相关操作

为了简单操作并且方便下个工程使用,所以我把操作word的基本过程进行了封装。在此贴出自己封装的内容:
MyWord.h文件:
#pragma once#include "msword.h"class CMyWord
{
public:CMyWord(void);
public:~CMyWord(void);private://待操作变量_Application m_wdApp;      //wordAppDocuments m_wdDocs;            //wordDocs_Document m_wdDoc;            //wordDocSelection m_wdSel;         //wordSelectionRange     m_wdRange;     //wordRangeInlineShapes m_wdInlineShapes; InlineShape m_wdInlineShape;Tables m_wdTables;            //  Tables wordTables;Table m_wdTable;          //  Table wordTable;Cell m_wdCell;              //  Cell wordCell;Cells m_wdCells;          //  Cells wordCells;_Font m_wdFont;             //  _Font wordFont;Shading m_wdShading;     //  Shading wordShading;Paragraphs m_wdParagraphs;  //  Paragraphs wordParagraphs;public:/*-------------------------文档操作------------------------------------*/BOOL Create();                                    //创建进程,打开窗口,打开版面void HideApp();void ShowApp();BOOL SaveDocumentAs(CString FileName);void CloseApp();                              //关闭程序void PrintWord();                             //连接实体打印机打印BOOL SaveDocAsPDF(CString FileName);             //保存为PDF文件/*--------------------------文字操作-------------------------------------*/void WriteText(CString szText);                    //当前光标处写文本void WriteNewLineText(CString szText, int nLineCount = 1); //换N行写字void WriteEndLine(CString szText);              //文档结尾处写文本void ChangeFontSize(float num);                   //更改字体大小void ChangeFontToggle();                        //是否加粗字体void NewLine(int nLineCount = 1);               //实现向下切换n行/*---------------------------图片插入------------------------------------*/void InsertShapes(CString fileName);           //在当前光标的位置插入图片/*---------------------------表格操作------------------------------------*/void InsertTable(int row, int column);         //在当前光标的位置插入表格void MoveRight(int nRight = 1);                   //光标向右移动n次,默认一次void MoveLeft(int nLeft = 1);                 //光标向左      void MoveDown(int nDown = 1);                   //光标向下void MoveUp(int nUp = 1);                     //光标向上};

MyWord.cpp文件:
#include "StdAfx.h"
#include "MyWord.h"CMyWord::CMyWord()
{Create();
}CMyWord::~CMyWord()
{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_wdParagraphs.ReleaseDispatch();m_wdShading.ReleaseDispatch();m_wdFont.ReleaseDispatch();m_wdCells.ReleaseDispatch();m_wdCell.ReleaseDispatch();m_wdTable.ReleaseDispatch();m_wdTables.ReleaseDispatch();m_wdInlineShape.ReleaseDispatch();m_wdInlineShapes.ReleaseDispatch();m_wdRange.ReleaseDispatch();m_wdSel.ReleaseDispatch();m_wdDoc.ReleaseDispatch();m_wdDocs.ReleaseDispatch();m_wdApp.ReleaseDispatch();}BOOL CMyWord::Create()
{//CreateDocuments//CreateAppif (FALSE == m_wdApp.CreateDispatch(_T("Word.Application"))){AfxMessageBox(_T("Application创建失败,请确保安装了word 2000或以上版本!"), MB_OK|MB_ICONWARNING);return FALSE;}m_wdDocs.AttachDispatch(m_wdApp.GetDocuments());if (!m_wdDocs.m_lpDispatch) {AfxMessageBox(_T("Documents创建失败!"), MB_OK|MB_ICONWARNING);return FALSE;}//CreateDocumentif (!m_wdDocs.m_lpDispatch) {AfxMessageBox(_T("Documents为空!"), MB_OK|MB_ICONWARNING);return FALSE;}COleVariant varTrue(short(1),VT_BOOL),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);CComVariant Template(_T("C:\\TSINGHUA.doc"));    //使用TSINGHUA的文档模板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(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);return FALSE;}//得到selection变量m_wdSel = m_wdApp.GetSelection();if (!m_wdSel.m_lpDispatch) {AfxMessageBox(_T("Select获取失败!"), MB_OK|MB_ICONWARNING);return FALSE;}//得到Range变量m_wdRange = m_wdDoc.Range(vOptional,vOptional);if(!m_wdRange.m_lpDispatch){AfxMessageBox(_T("Range获取失败!"), MB_OK|MB_ICONWARNING);return FALSE;}return TRUE;}void CMyWord::ShowApp()
{m_wdApp.SetVisible(TRUE);
}void CMyWord::HideApp()
{m_wdApp.SetVisible(FALSE);
}BOOL CMyWord::SaveDocumentAs(CString fileName)
{if (!m_wdDoc.m_lpDispatch) {AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);return FALSE;}COleVariant vTrue((short)TRUE),    vFalse((short)FALSE),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);COleVariant vFileName(fileName);m_wdDoc.SaveAs(vFileName,    //VARIANT* FileNamevOptional,    //VARIANT* FileFormatvOptional,    //VARIANT* LockCommentsvOptional,    //VARIANT* PasswordvOptional,    //VARIANT* AddToRecentFilesvOptional,    //VARIANT* WritePasswordvOptional,    //VARIANT* ReadOnlyRecommendedvOptional,    //VARIANT* EmbedTrueTypeFontsvOptional,    //VARIANT* SaveNativePictureFormatvOptional,    //VARIANT* SaveFormsDatavOptional,    vOptional,   vOptional,   vOptional,    vOptional,    vOptional  );return    TRUE;
}void CMyWord::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_wdParagraphs.ReleaseDispatch();m_wdShading.ReleaseDispatch();m_wdFont.ReleaseDispatch();m_wdCells.ReleaseDispatch();m_wdCell.ReleaseDispatch();m_wdTable.ReleaseDispatch();m_wdTables.ReleaseDispatch();m_wdInlineShape.ReleaseDispatch();m_wdInlineShapes.ReleaseDispatch();m_wdRange.ReleaseDispatch();m_wdSel.ReleaseDispatch();m_wdDoc.ReleaseDispatch();m_wdDocs.ReleaseDispatch();m_wdApp.ReleaseDispatch();
}void CMyWord::PrintWord()
{//m_wdApp.SetActivePrinter(_T("\\166.111.52.59\\HP LaserJet 1020")); //应该先设置所选择的打印机,这里是打印机的名字,如果不设置则会选择之前的默认设置m_wdDoc = m_wdApp.GetActiveDocument();if(!m_wdDoc.m_lpDispatch){AfxMessageBox(_T("获取激活文档对象失败"));return;}else{COleVariant covTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);m_wdDoc.PrintOut(covFalse,              // Background.covOptional,           // Append.covOptional,           // Range.covOptional,           // OutputFileName.covOptional,           // From.covOptional,           // To.covOptional,           // Item.COleVariant((long)1),  // Copies.covOptional,           // Pages.covOptional,           // PageType.covOptional,           // PrintToFile.covOptional,           // Collate.covOptional,           // ActivePrinterMacGX.covOptional,           // ManualDuplexPrint.covOptional,           // PrintZoomColumn  New with Word 2002covOptional,           // PrintZoomRow          dittocovOptional,           // PrintZoomPaperWidth   dittocovOptional);          // PrintZoomPaperHeight  ditto*/}}BOOL CMyWord::SaveDocAsPDF(CString FileName)
{m_wdApp.SetActivePrinter(_T("Foxit Reader PDF Printer")); //设置为打印机的名字!!!!!m_wdDoc = m_wdApp.GetActiveDocument();if(!m_wdDoc.m_lpDispatch){AfxMessageBox(_T("获取激活文档对象失败"));return false;}else{COleVariant covTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);m_wdDoc.PrintOut(covFalse,              // Background.covOptional,           // Append.covOptional,           // Range.COleVariant(FileName),           // OutputFileName.covOptional,           // From.covOptional,           // To.covOptional,           // Item.COleVariant((long)1),  // Copies.covOptional,           // Pages.covOptional,           // PageType.covOptional,           // PrintToFile.covOptional,           // Collate.covOptional,           // ActivePrinterMacGX.covOptional,           // ManualDuplexPrint.covOptional,           // PrintZoomColumn  New with Word 2002covOptional,           // PrintZoomRow          dittocovOptional,           // PrintZoomPaperWidth   dittocovOptional);          // PrintZoomPaperHeight  ditto*/}return TRUE;}void CMyWord::WriteText(CString szText)
{m_wdSel.TypeText(szText);
}void CMyWord::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 CMyWord::WriteEndLine(CString szText)
{m_wdRange.InsertAfter(szText);
}//改变字体
void CMyWord::ChangeFontSize(float num)
{m_wdFont = m_wdSel.GetFont();m_wdFont.SetSize(num);}//字体加粗
void CMyWord::ChangeFontToggle()
{const int Toggle = 9999998;m_wdFont = m_wdSel.GetFont();m_wdFont.SetBold(Toggle);
}//实现换行,n
void CMyWord::NewLine(int nLineCount)
{int i;if (nLineCount <= 0){nLineCount = 0;}for (i = 0; i < nLineCount; i++){m_wdSel.TypeParagraph();}}void CMyWord::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 CMyWord::InsertTable(int row, int column)
{m_wdTables = m_wdSel.GetTables();m_wdRange = m_wdSel.GetRange();const int wdWordTableBehavior = 1;const int wdAutoFitFixed = 0;m_wdTables.Add( m_wdRange,row, column, COleVariant((short)wdWordTableBehavior),COleVariant((short)wdAutoFitFixed));
}void CMyWord::MoveRight(int nRight)
{m_wdSel.MoveRight(COleVariant((short)1), COleVariant((short)nRight), COleVariant((short)0));   }void CMyWord::MoveLeft(int nLeft)
{m_wdSel.MoveLeft(COleVariant((short)1), COleVariant((short)nLeft),COleVariant((short)0));}//向上移动鼠标到上一行
void CMyWord::MoveDown(int nDown)
{m_wdSel.MoveDown(COleVariant((short)5), COleVariant((short)nDown),COleVariant((short)0));}//向上移动鼠标到上一行
void CMyWord::MoveUp(int nUp)
{m_wdSel.MoveUp(COleVariant((short)5), COleVariant((short)nUp),COleVariant((short)0));}/*---------------------------------------------------------------------------*/
然后在你的工程中的简单使用这个类方法是:
#include "MyWord.h"void Cword15Dlg::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码CMyWord App;App.ShowApp();//AfxMessageBox(_T("看到弹出的窗口了吗?"));for(int i = 0;i < 3;i++)App.WriteText(_T("这是测试字体。。。测试字体。字体大小默认。未加粗!\n"));App.ChangeFontSize(20);App.WriteText(_T("这是测试字体。。。测试字体。字体大小20。未加粗!\n"));App.ChangeFontToggle();App.WriteText(_T("这是测试字体。。。测试字体。字体大小20。加粗!\n"));App.InsertShapes(_T("C:\\TSINGHUA.jpg"));App.InsertTable(2,5);AfxMessageBox(_T("看到你需呀的了吗?我要保存了哦!"));//App.SaveDocumentAs(_T("C:\\helloTHU.doc"));//App.PrintWord();App.SaveDocAsPDF(_T("C:\\helloTHU.pdf"));OnOK();
}
====================================================================================================================================

在此特别说明的函数是 打印函数。 由于工程需要不仅仅需要doc文档还需要PDF文档。所以我希望能够直接生成两个文档。(这样就可以避免去操作PDFLib库 哈哈~)

环境:Foxit Reader 安装了福昕PDF阅读器过后在你的word里面就会自带了一个Foxit Reader PDF Printer 虚拟打印机。只需要打印输出的时候调用该打印机就可以直接生成pdf文件。具体实现 在上面的代码中已经实现了。在函数BOOL CMyWord::SaveDocAsPDF(CString FileName)中。

转载于:https://www.cnblogs.com/skyhuangdan/p/5486804.html

VS2005进行WORD文档开发相关推荐

  1. linux文件管理系统开发毕业,定稿毕业论文基于Linux的远程管理系统服务器端的实现word文档(范文1)...

    <[毕业论文]基于Linux的远程管理系统服务器端的实现.doc>由会员分享,可免费在线阅读全文,更多与<(定稿)毕业论文基于Linux的远程管理系统服务器端的实现(word文档)& ...

  2. 国内研发!适用于安卓应用程序的 Word文档功能开发组件来啦!

    你是否在寻找一款工具能够在Android应用程序中的Word文档管理的开发工具?那么,好消息来啦!Spire系列文档开发组件又添新成员,专门用于在 Android 手机应用程序中创建.读取.操作和转换 ...

  3. PB调用C#开发的控制台应用——实现WORD文档按页转存JPG图片

    由来:一个POWERBUILDE项目,要实现WORD文档按页转存为JPG图片,并按页号存为001.JPG.002.JPG--寻找了好久找到了一个非常不借的C#的例子Word2Image,链接如下: h ...

  4. java毕业论文_【毕业论文】基于java的博客网站设计与开发毕业论文(word文档)

    <[毕业论文]基于java的博客网站设计与开发毕业论文.doc>由会员分享,可免费在线阅读全文,更多与<[毕业论文]基于java的博客网站设计与开发毕业论文(word文档)>相 ...

  5. Java版Word开发工具Aspose.Words基础转换指南:将Word文档和图像转换为PDF

    Aspose.Words for Java是功能丰富的文字处理API,开发人员可以在自己的Java应用程序中嵌入生成,修改,转换,呈现和打印Microsoft Word支持的所有格式的功能.它不依赖于 ...

  6. 基于node.js开发的聚美酒店住宿管理系统的设计(论文设计word文档)

    摘要 随着经济的发展,越来越多的群体依赖互联网,酒店行业也纷纷捉住机遇 展开新的运营方式--线上运营,取得了不错的成效并且大大节约了成本问题,与 此同时,聚美酒店作为大型企业之一,员工数量众多,但在住 ...

  7. Java版Word开发工具Aspose.Words功能解析:查找和替换Word文档中的文本

    MS Word提供了一种简单的方法来查找和替换文档中的文本.查找和替换文本的一种流行用例之一可能是在文档之间的敏感信息在各个实体之间共享之前,对其进行删除或替换.但是,手动过程可能需要您安装MS Wo ...

  8. Word开发工具Aspose.Words功能演示:在C ++中以编程方式在Word文档中添加或删除页眉和页脚

    Word文档中的页眉和页脚用于格式化和显示重要信息,例如主题,章节,页码,Copywrite等.以编程方式使用Word文档时,可能需要添加或删除页眉和页脚.为此,本文将教您如何使用C ++在Word文 ...

  9. Android开发——使用Jword生成本地word文档

    本文主要介绍如何使用Jword生成本地word文档,这里涉及到Jword的使用技巧,本文给出相应的代码,需要的朋友可以参考下. 为什么使用Jword呢?因为IText .Freemark在安卓平台上压 ...

  10. java开发导出Excel和Word文档

    前言:刚满18的小编在电脑网页上看到好看但19禁的电影,然后想下载到手机上看,你会怎么做? 1.这是一个后台,里面已经增加了几部电影... 2.这是导出Excel,这是方便以后查询用的,生成Excel ...

最新文章

  1. 参加微软新技术预览大会
  2. 阿里云的java规范_阿里JAVA开发强制要求的15条并发处理规范,切记
  3. 与word2vec_NLP--Word2Vec详解
  4. go语言json解析的坑 注意事项
  5. 科学价值 社交关系 大数据_服务的价值:数据科学和用户体验研究美好生活
  6. hibernate中*.hbm.xml配置文件的各种映射关系配置方法(多对一,多对多)
  7. MYSQL 定时任务
  8. php小程序onload,微信小程序 loading 组件实例详解
  9. Android RecyclerView快速上手
  10. Linux开机自动启动Tomcat
  11. C/C++编程语言中枚举类型(enum)介绍
  12. Java中try与catch的使用
  13. PHP 解决未定义变量报错
  14. 2.1 CMMI2级——7个PA简述
  15. postman测试JSON参数接口
  16. ff7重制版青魔法_最终幻想7重制版蒂法全服装获取攻略
  17. 快速复制移动文件_如何使用F2快速移动或复制Word中的内容
  18. MIUI的JAVA导出
  19. python lisp_随笔:code.org与python,FoxDot,Lisp
  20. 《使用IEC61499为控制系统建模》-第一章 概述

热门文章

  1. linux中python如何调用matlab的数据_如何在Python中创建Gif动图?(动图数据可视化基础教学)
  2. c++ 队列_RabbitMQ的死信与延迟队列,你真的会用吗?
  3. surfer画世界频率分布图(等高线、地点标注)
  4. 康托展开逆展开算法笔记
  5. Go语言中正则表达式的使用
  6. 软件评測师真题考试分析-5
  7. 乘坐飞机时,有什么事情是机长和机上工作人员不想让乘客知道的?
  8. tensorflow功能函数
  9. 编写Spark SQL查询程序
  10. 数据--第21课-递归课后练习