基于VC下MFC调用Word XP生成报表推荐文档.docx
- 文档编号:3634037
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:8
- 大小:18.63KB
基于VC下MFC调用Word XP生成报表推荐文档.docx
《基于VC下MFC调用Word XP生成报表推荐文档.docx》由会员分享,可在线阅读,更多相关《基于VC下MFC调用Word XP生成报表推荐文档.docx(8页珍藏版)》请在冰豆网上搜索。
基于VC下MFC调用WordXP生成报表推荐文档
微软Word具有很强大的文档编辑、排版能力,使用它我们可以很方便地编写优秀的文案,或是写出不朽的文学巨著,抑或做出各式各样精美的统计报表等。
显而易见,世界上绝大多数公司或机构直接受益于Word自动化办公。
真不敢想象,没有word的世界会是怎样的。
在实际工作中,面对巨大的业务数据,我们总是希望有那么一个软件来帮我们分析数据,最后生成标准格式的word报表,供我们直接使用。
一切是多么地惬意。
笔者毕业设计所编的软件就需要有报表输出功能,以前曾用VB的水晶报表实现过通讯录打印,但惧于对VB年久生疏及水晶报表的繁杂,还是想到了调用word自动生成报表。
Baidu了一下,发现先行者不少,按他们的经验,磕磕绊绊,终于在VC2005+OFFICEXP环境下实现了MFC调用WORD进行报表制作。
值得高兴的是,经过努力,实现了插入图片和自动执行宏,这使制作有个性的报表成为可能,比如自动生成页眉,自动加入页码,自动生成目录等。
下面就介绍如何在VC2005中调用WORD制作报表。
首先,引入类型库。
方法“工程->添加类->选择MFC类从类型库导入”,选择”MicrosoftWord10.0ObjectLibrary<8.2>”,导入所有接口。
点击完成后,工程目录下会引入相应的头文件。
这些头文件实现了Word相关接口。
但是并不是所有接口我们都用得到,所以实际使用时候,只包含我们感兴趣的项就可以。
把所有自动引入的头文件,移动到新建文件夹Report里,以后的项目如果需要调用报表,引入该文件夹即可。
不需要重新导入库。
需要注意的是,
由于函数命名冲突,需要在生成的头文件做相应处理。
即:
#import"C:
\\ProgramFiles\\MicrosoftOffice\\Office10\\MSWORD.OLB"no_namespace\raw_interfaces_only\
rename("FindText","_FindText")\
rename("Rectangle","_Rectangle")\
rename("ExitWindows","_ExitWindows")
如果你使用的是其他版本的Word,那么可以根据下表修改MSWORD.OLB库路径。
表1MSWORD.OLB库路径
Office版本
路径
Office97
C:
\ProgramFiles\MicrosoftOffice\Office
Office2000
C:
\ProgramFiles\MicrosoftOffice\Office
OfficeXP
C:
\ProgramFiles\MicrosoftOffice\Office10
Office2003
C:
\ProgramFiles\MicrosoftOffice\Office11
Office2007
C:
\ProgramFiles\MicrosoftOffice\Office12
第二步,调用Word实现个性报表。
引入我们要用到的头文件,在例子中我用到了以下头文件,其意义如何:
#include"report\\CApplication.h"//word程序对象
#include"report\\CDocuments.h"//文档集对象
#include"report\\CDocument0.h"//单个doc对象
#include"report\\CSelection.h"//该对象代表窗口或窗格中的当前所选内容,使用率最高
#include"report\\CCell.h"//表格单元格
#include"report\\CCells.h"//表格单元格集合
#include"report\\CRange.h"//该对象代表文档中的一个连续范围
#include"report\\CTable0.h"//单个表格
#include"report\\CTables0.h"//表格集合
#include"report\\CFont0.h"//字体
#include"report\\CParagraphs.h"//段落集合
#include"report\\CParagraphFormat.h"//段落格式
#include"report\\CParagraph.h"//单个段落
#include"report\\CnlineShapes.h"//Inline图形对象集合
#include"report\\CnlineShape.h"//单个Inline图形对象
下面是调用word生成报表代码:
CApplicationoWord;//wordApp
CDocumentsoDocs;//Docs
CDocument0oDoc;//doc
if(!
oWord.CreateDispatch(_T("Word.Application")))//实例化oWord
{
AfxMessageBox(_T("wordfailedtostart!
"));
}
else
{
//Setthevisibleproperty
oWord.put_Visible(FALSE); //开始不可见
//Addanewdocument
oDocs=oWord.get_Documents();
COleVariantvDocType((short)0);
//GettheAppPath
charfileName[MAX_PATH];
GetModuleFileName(NULL,fileName,MAX_PATH);
chardir[260];
chardirver[100];
_splitpath(fileName,dirver,dir,NULL,NULL);
CStringstrAppPath=dirver;
strAppPath+=dir;
CStringstrTpl=strAppPath+_T("\\template.dot");//模板路径
COleVariantvTpl(strTpl);
//addadoc
oDoc=oDocs.Add(vTpl,vFalse,vDocType,vTrue);
//执行指定宏”信息”
oWord.Run(_T("信息"),vOptional,
vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional, vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional);
//声明一个CSelection对象,并实例化
CSelectionwordSelection=oWord.get_Selection();
wordSelection.TypeText(_T("虚拟试验仿真报表"));
wordSelection.HomeKey(COleVariant((short)wdLine),COleVariant((short)1));//返回当前行首,并选择当前行
//设置选择区域字体
CFont0font=wordSelection.get_Font();
font.put_Name(_T("微软雅黑"));
//设置为“标题1“样式
wordSelection.put_Style(COleVariant((short)wdStyleHeading1));
//获得当前段落,并设置对齐方式
CParagraphlastPara=getCurParagraph(oDoc);
lastPara.put_Alignment(wdAlignParagraphCenter);
//结束当前段落编辑,移动光标到段落后
wordSelection.EndOf(COleVariant((short)wdParagraph),COleVariant((short)0));
//生成表格
MakeRTITable(oDoc,wordSelection);
//以下为为不同段落设置不同字体和对齐方式示例
wordSelection.TypeParagraph();//新起一段
wordSelection.TypeText(_T("endofthestory!
"));
font=wordSelection.get_Font();
font.put_Size(20);
lastPara=getCurParagraph(oDoc);
lastPara.put_Alignment(wdAlignParagraphJustify);
wordSelection.EndOf(COleVariant((short)wdParagraph),COleVariant((short)wdMove));
wordSelection.TypeParagraph();
wordSelection.TypeText(_T("endofthestory!
"));
font=wordSelection.get_Font();
font.put_Size(10);
lastPara=getCurParagraph(oDoc);
lastPara.put_Alignment(wdAlignParagraphCenter);
wordSelection.EndOf(COleVariant((short)wdParagraph),COleVariant((short)wdMove));
//以下为插入图片示例
CStringstrPicture=strAppPath+_T("\\p.jpg");
CnlineShapesnLineShapes=wordSelection.get_InlineShapes();
CnlineShapenLineshape=nLineShapes.AddPicture(strPicture,vFalse,vTrue,vOptional);
//Word程序可见,显示报表
oWord.put_Visible(TRUE);
//保存成果
CStringstrSavePath=strAppPath;
strSavePath+=_T("\\报表.doc");
oDoc.SaveAs(COleVariant(strSavePath),vOptional,vOptional,vOptional,vOptional,
vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional);
}
其中,MakeRTITable()和getCurParagraph()定义如下:
voidCMyReport:
:
MakeRTITable(CDocument0&oDoc,CSelection&selection)
{
intnRowSize=10;
nRowSize=nRowSize==0?
2:
nRowSize;
//newparagraph
selection.TypeParagraph();
//Addtabletitle
selection.TypeParagraph();
selection.TypeText(RTITableTitle);
CParagraphlastPara=getCurParagraph(oDoc);
lastPara.put_Alignment(wdAlignParagraphCenter);
selection.EndOf(COleVariant((short)wdParagraph),COleVariant((short)wdMove));
//Addtable
CTables0wordTables=oDoc.get_Tables();
CRangewordRange=selection.get_Range();
CTable0wordTable=wordTables.Add(wordRange,nRowSize,RTITableColumnSize,vTrue,vFalse);//添加表格
wordRange=wordTable.get_Range();
//Makeheader
CCellcell;
for(inti=1;i { cell=wordTable.Cell(1,i);//表格第一行第i列单元格 cell.Select(); selection.TypeText(RTITableFieldArray[i-1]); } selection.EndOf(COleVariant((short)wdStory),COleVariant((short)wdMove));//结束表格编辑 } CParagraphCMyReport: : getCurParagraph(CDocument0&curDoc) { CParagraphsparagraphs=curDoc.get_Paragraphs(); CParagraphlastPara=paragraphs.get_Last(); returnlastPara; } 把表格列名称定义为常量,如下。 #defineRTITableColumnSize6 constCStringRTITableFieldArray[RTITableColumnSize]={_T("序号"),_T("属性名称"),_T("数据类型"),_T("数据长度"),_T("订购/发布"),_T("绑定属性/订购属性")}; constCStringRTITableTitle=_T("表订购/发布属性列表"); 注释: (1) 必须初始化Ole环境才可调用word.即在程序入口InitInstance()调用AfxOleInit函数; (2) 注意下面几个函数用法 1) TypeParagraph();//新起一段 2) TypeText(_T("endofthestory! ")); 3) EndOf(COleVariant((short)wdParagraph), COleVariant((short)wdMove));//挪动光标到段末 4) wordSelection.HomeKey(COleVariant((short)wdLine),COleVariant((short)wdExtend));//选择当前行 最后2个函数的第一个参数取值可以是 enumWdUnits { wdCharacter=1,//字母 wdWord=2,//单词 wdSentence=3,//句子 wdParagraph=4,//段落 wdLine=5,//行 wdStory=6,//所选区域 wdScreen=7,//当前屏幕 wdSection=8,//部分 wdColumn=9,//列 wdRow=10,//行 wdWindow=11,//窗口 wdCell=12,//单元格 wdCharacterFormatting=13,//字体格式 wdParagraphFormatting=14,//段落格式 wdTable=15,//表格 wdItem=16//项目 }; 总结,由以上代码我们可以看出,其实调用Word实现简单报表的生成并不难。 但是,要生成一个精美的报表还是得需要下很大功夫才成。 我给的例子仅仅使用了Word的最最基本的功能,若是想调用Word的其他高级功能,如生成直方图表格等,就得利用录制“宏“来研究如何实现具体操作了。 还有就是得参考OFFICEVBA手册,了解大多数函数调用格式。 源代码和VBA手册我均上传到我的共享资料里,有兴趣的朋友可以去下载.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于VC下MFC调用Word XP生成报表推荐文档 基于 VC MFC 调用 Word XP 生成 报表 推荐 文档