折腾了将近一个月的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里面的函数进行开发,很多大牛已经做得非常好了。所以在此我就省略这一段了。在此我把相关的博客贴出:

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; //wordApp
Documents m_wdDocs; //wordDocs
_Document m_wdDoc; //wordDoc
Selection m_wdSel; //wordSelection
Range m_wdRange; //wordRange
InlineShapes 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
//CreateApp
if (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;
} //CreateDocument
if (!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* 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,
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 2002
covOptional, // PrintZoomRow ditto
covOptional, // PrintZoomPaperWidth ditto
covOptional); // 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 2002
covOptional, // PrintZoomRow ditto
covOptional, // PrintZoomPaperWidth ditto
covOptional); // 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)中。














VS2005进行WORD文档开发的更多相关文章

  1. 使用freemarker模板引擎生成word文档的开发步骤

    1.准备模板文档,如果word文档中有表格,只保留表头和第一行数据:2.定义变量,将word文档中的变量用${var_name}替换:3.生成xml文件,将替换变量符后的word文档另存为xml文件: ...

  2. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  3. SpringBoot+FreeMarker开发word文档下载,预览

    背景: 开发一个根据模版,自动填充用户数据并下载word文档的功能 使用freemarker进行定义模版,然后把数据进行填充. maven依赖: <parent> <groupId& ...

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

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

  5. word 文档导出 (freemaker+jacob)--java开发

    工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂.  学习顺序: 第一阶 ...

  6. ASP.NET生成WORD文档,服务器部署注意事项

    网上转的,留查备用,我服务器装的office2007所以修改的是Microsoft Office word97 - 2003 文档这一个. ASP.NET生成WORD文档服务器部署注意事项 1.Asp ...

  7. C# 复制一个Word文档的部分或全部内容到另一个Word文档

    C# 复制一个Word文档的部分或全部内容到另一个Word文档 我最近喜欢折腾Office软件相关的东西,想把很多Office软件提供的功能用.NET来实现,如果后期能把它用来开发一点我自己的小应用程 ...

  8. Word文档合并的一种实现

    今天遇到一个问题,就是需要把多个Word文档的内容追加到一个目标Word文档的后面,如果我有目标文档a.doc以及其他很多个文档b.doc,c.doc…等等数量很多.这个问题,如果是在服务端的话,直接 ...

  9. 保护企业的Word文档

    保护企业的Word文档 通常,我们可以对Word文件进行加密码.设置为只读.禁止复制甚至是将内容变成图片加以保护,但这仅限于个人少量文档,如果是企业每天生产大量的word文档好用这种方法就不行,今天为 ...

随机推荐

  1. Windows系统查看xxx.dll、xxx.lib文件的导出函数、依赖文件等信息的方法

    1.查看xxx.dll或xxx.exe文件的导出函数.依赖文件等信息,使用Depends软件即可. 2.查看xxx.lib文件的导出函数.依赖文件等信息,使用Visual Studio附带工具dump ...

  2. Docker 尝试安装rabbitmq实践笔记

    docker pull rabbitmq 自定義的rabbitmq Dockerfile # base image FROM rabbitmq:3.7-management # running req ...

  3. MongoDB4.0及以上的版本安装时无法启动服务。

    问题描述:MongoDB安装过程中启动服务失败,点击忽略之后,可以安装完成.安装完成之后提示重启电脑,出现电脑蓝屏. 并且修复好电脑之后无法启动MongoDB服务. 暂时不知道原因(怀疑是MongoD ...

  4. Java中的常量池

    JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...

  5. SQL Server SQLFetch()

    { /* 摘要 SQLFetch从结果集中提取下一个数据行集, 并返回所有绑定列的数据. 语法 C++ SQLRETURN SQLFetch( SQLHSTMT     StatementHandle ...

  6. bfs理解——hdu6386好题

    用队列维护,对于每块颜色相同的相连的边进行dfs并记录即可 注意这题要用vis来标记边,不可以标记点 因为点的深度是可以随时更新的(这样的做法不满足贪心条件) #include<bits/std ...

  7. 学习Caffe(一)使用Caffe

    如何使用Caffe Caffe教程(http://robots.princeton.edu/courses/COS598/2015sp/slides/Caffe/caffe_tutorial.pdf) ...

  8. LUOGU P4159 [SCOI2009]迷路(矩阵乘法)

    传送门 解题思路 以前bpw讲过的一道题,顺便复习一下矩阵乘法.做法就是拆点,把每个点拆成\(9\)个点,然后挨个连边.之后若\(i\)与\(j\)之间的边长度为\(x\),就让\(i\)的第\(x\ ...

  9. System.Web.HttpCookie.cs

    ylbtech-System.Web.HttpCookie.cs 1.程序集 System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken= ...

  10. (1)mysql数据库操作

    1.安装mysql https://dev.mysql.com/downloads/windows/installer/8.0.html 2.mysql启停 运行mysql         net s ...