MFC调用wod制作表格.docx
- 文档编号:27739873
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:15
- 大小:18.54KB
MFC调用wod制作表格.docx
《MFC调用wod制作表格.docx》由会员分享,可在线阅读,更多相关《MFC调用wod制作表格.docx(15页珍藏版)》请在冰豆网上搜索。
MFC调用wod制作表格
MFC/VC++调用word进行报表制作
使用word进行数据报告的制作可谓非常方便,word具有非常强大的编辑、排版功能。
使用word能够制作出内容丰富、样式精美的报告。
我们在工作中当然会有报表报告的需求,如果能够在MFC/VC++里面能够调用word进行word格式报告的自动生成,岂不是一件非常惬意的事情。
我在工作当中需要对大量的数据或者各种测试数据进行统计分析,最终的统计分析结果总归要汇总为一份报告,不管是内部使用也好还是外部提供给客户也好,一份内容翔实、格式精美的报告自然必不可少。
我对MFC/VC++也不是高手,只是业余爱好自己动动手做些东西。
自然,低于VC操作word可谓完全没有经验,在网络上面也查找了很多资料,都是些只言片语,不能真正的领略通过VC使用word的方法。
于是自己摸索了几个礼拜,可谓耗时甚长,劳心劳力啊。
MS的东西,封装的也太严实了,对于函数部分只有些许的简单介绍,往往看的云里雾里。
没有实践还是不行啊!
体会自己的经历,虽然辛苦但也有收获。
不想其他朋友再继续走我走过的路,浪费时间、精力,故成文以共享。
废话少说,进入正题吧。
第一步,当然我们需要首先导入word需要的库。
通过ClassWizard->AddClass选择FromaTypeLibrary…定位需要的库文件导入。
本例应该使用C:
"ProgramFiles"MicrosoftOffice"OFFICE11"MSWORD.OLB,在这里尽可选择所有的类导入,反正用的时候都有了,呵呵。
完成这一步,我们得到两个文件msword.h和msword.cpp,那就加入你的工程吧。
说明:
如果需要在VC++/MFC开发程序操作word/excel等office元素,那么需要对必要的类型库进行导入.下面是office系列的类型库参考,导入类型库时候请选择正确的类型库进行导入.
应用程序
类型库
MicrosoftAccess97
Msacc8.olb
MicrosoftJetDatabase3.5
DAO350.dll
MicrosoftBinder97
Msbdr8.olb
MicrosoftExcel97
Excel8.olb
MicrosoftGraph97
Graph8.olb
MicrosoftOffice97
Mso97.dll
MicrosoftOutlook97
Msoutl97.olb
MicrosoftPowerPoint97
Msppt8.olb
MicrosoftWord97
Msword8.olb
MicrosoftAccess2000
Msacc9.olb
MicrosoftJetDatabase3.51
DAO360.dll
MicrosoftBinder2000
Msbdr9.olb
MicrosoftExcel2000
Excel9.olb
MicrosoftGraph2000
Graph9.olb
MicrosoftOffice2000
Mso9.dll
MicrosoftOutlook2000
Msoutl9.olb
MicrosoftPowerPoint2000
Msppt9.olb
MicrosoftWord2000
Msword9.olb
MicrosoftAccess2002
Msacc.olb
MicrosoftExcel2002
Excel.exe
MicrosoftGraph2002
Graph.exe
MicrosoftOffice2002
MSO.dll
MicrosoftOutlook2002
MSOutl.olb
MicrosoftPowerPoint2002
MSPpt.olb
MicrosoftWord2002
MSWord.olb
MicrosoftOfficeAccess2003
Msacc.olb
MicrosoftOfficeExcel2003
Excel.exe
MicrosoftOfficeGraph2003
Graph.exe
MicrosoftOffice2003
MSO.dll
MicrosoftOfficeOutlook2003
MSOutl.olb
MicrosoftOfficePowerPoint2003
MSPpt.olb
MicrosoftOfficeWord2003
MSWord.olb
注意:
这些类型库的默认位置是:
Office版本
路径
Office97
C:
"ProgramFiles"MicrosoftOffice"Office
Office2000
C:
"ProgramFiles"MicrosoftOffice"Office
OfficeXP
C:
"ProgramFiles"MicrosoftOffice"Office10
Office2003
C:
"ProgramFiles"MicrosoftOffice"Office11
Dao350.dll和Dao360.dll的默认位置是C:
"ProgramFiles"CommonFiles"MicrosoftShared"Dao。
第二步,进入具体使用实践阶段。
激动人心的时刻到来了,呵呵。
不过别忘记把你的H文件#Include进来。
下面是我的一个例子,从我具体的工程当中抽取出来供各位参考。
有些地方我会简要解释。
还等什么,赶紧试验一下代码吧。
修改一下就是你的报告了,开心吧。
BOOLCMDIDemoApp:
:
OnMakeReport()
{
_ApplicationwordApp;
DocumentswordDocs;
_DocumentwordDoc;
SelectionwordSelection;
RangewordRange;
TableswordTables;
TablewordTable;
CellwordCell;
CellswordCells;
//ParagraphswordParagraphs;
//ParagraphwordParagraph;
_FontwordFont;
ShadingwordShading;
//
intnRow=0;
//
COleVariantvTrue((short)TRUE),
vFalse((short)FALSE),
vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
CComVariantdefaultBehavior
(1),AutoFitBehavior(0);
//创建wordapplication实例
if(!
wordApp.CreateDispatch(_T("Word.Application")))
{
AfxMessageBox("WordCreateDispatchFailed!
");
returnFALSE;
}
wordApp.SetVisible(TRUE);//makevisible
wordApp.Activate();//激活
wordDocs=wordApp.GetDocuments();//getdocumentsobject
//
CStringstrDocTemplate;
CStringstrPath;
charszFullPath[_MAX_PATH];
:
:
GetModuleFileName(NULL,szFullPath,_MAX_PATH);
strDocTemplate.Format("%s",szFullPath);
intnPos=strDocTemplate.ReverseFind(''""'');
strDocTemplate=strDocTemplate.Left(nPos);
strPath=strDocTemplate;
TRACE1("%s"n",strDocTemplate);
//strDocTemplate+="""Template""Report.doc";
//wordDoc=wordDocs.Open(COleVariant(strDocTemplate),&vOpt,&vOpt,&vOpt,&vOpt,
//&vOpt,&vOpt,&vOpt,&vOpt,&vOpt,&vOpt,&vTrue,&vOpt,&vOpt,&vOpt,&vOpt);
CComVarianttpl(_T("")),Visble,DocType(0),NewTemplate(false);
wordDoc=wordDocs.Add(&tpl,&NewTemplate,&DocType,&Visble);
wordSelection=wordApp.GetSelection();
//wordTables.AttachDispatch(wordDoc.GetTables());
wordTables=wordDoc.GetTables();
//wordParagraphs=wordDoc.GetParagraphs();
//wordParagraph=wordParagraphs.GetLast();
//wordRange=wordParagraph.GetRange();
//wordSelection.EndKey(COleVariant((short)6),COleVariant((short)0));
//moveinsertionpointtotheendofthestory
/*
wdUnits:
wdCharacter=1
wdWord=2
wdSentence=3
wdParagraph=4
wdSection=8
wdStory=6
wdCell=12
wdColumn=9
wdRow=10
wdTable=15
wdMovementType:
wdMove=0
wdExtend=1
*/
//movetoendofstory
wordSelection.EndOf(COleVariant((short)6),COleVariant((short)0));
//1.1RxLevFull
wordSelection.TypeText("1.统计报告");
wordSelection.HomeKey(&CComVariant(5),&CComVariant
(1));
//Formatthelinewithselection
wordFont=wordSelection.GetFont();
wordFont.SetBold(9999998);//wdToggle
wordSelection.EndOf(&CComVariant(5),&CComVariant(0));
wordSelection.TypeParagraph();
wordSelection.TypeText("(1.1).分段统计");
wordSelection.TypeParagraph();
wordFont.SetBold(9999998);//wdToggle
wordRange=wordSelection.GetRange();
//addtable
//nRow=m_nRange1+1;
wordTable=wordTables.Add(wordRange,5/*row*/,4/*column*/,&defaultBehavior,&AutoFitBehavior);
wordRange=wordTable.GetRange();
//wordRange.MoveEnd(COleVariant((short)15),COleVariant((short)1));
//wordRange.Select();
//moveendoftable
//wordSelection.EndOf(COleVariant((short)15),COleVariant((short)0));
//insertrows
//wordSelection.InsertRowsBelow(COleVariant((short)5));
//选择第一个单元,进而选择第一行进行格式化
wordCell=wordTable.Cell(1,1);
wordCell.Select();
//selecttherowwithcurrentselection
wordSelection.EndKey(&CComVariant(10),&CComVariant
(1));
//Formattherowwithselection
//wordFont=wordSelection.GetFont();
wordFont.SetBold(9999998);//wdToggle
wordCells=wordSelection.GetCells();
wordShading=wordCells.GetShading();
wordShading.SetTexture(0);
wordShading.SetBackgroundPatternColor(14737632);//1598769914737632adColorBlue
wordShading.SetForegroundPatternColor(-16777216);//-16777216wdColorAutomatic
//movetoendoftable
//wordSelection.EndOf(COleVariant((short)15),COleVariant((short)0));
//wordParagraph=wordParagraphs.GetLast();
//wordRange=wordParagraph.GetRange();
//wordRange.MoveEnd(COleVariant((short)4),COleVariant((short)1));
//wordRange.SetText("Test");
//wordSelection=wordApp.GetSelection();
//wordSelection.MoveEnd(COleVariant((short)6),COleVariant((short)1));
wordCell=wordTable.Cell(1,1);
wordCell.Select();
wordSelection.TypeText("统计项目");
wordSelection.MoveRight(&CComVariant(12),&CComVariant
(1),&CComVariant(0));
wordSelection.TypeText("采样");
wordSelection.MoveRight(&CComVariant(12),&CComVariant
(1),&CComVariant(0));
wordSelection.TypeText("百分比");
wordSelection.MoveRight(&CComVariant(12),&CComVariant
(1),&CComVariant(0));
wordSelection.TypeText("累计百分比");
//
//
wordSelection.EndOf(COleVariant((short)6),COleVariant((short)0));
wordSelection.TypeParagraph();
wordSelection.TypeText("(1.2).分段统计");
wordSelection.HomeKey(&CComVariant(5),&CComVariant
(1));
//Formatthelinewithselection
wordFont=wordSelection.GetFont();
wordFont.SetBold(9999998);//wdToggle
wordSelection.EndOf(&CComVariant(5),&CComVariant(0));
wordSelection.TypeParagraph();
wordFont.SetBold(9999998);//wdToggle
wordRange=wordSelection.GetRange();
//addtable
//nRow=m_nRange1+1;
wordTable=wordTables.Add(wordRange,5/*row*/,4/*column*/,&defaultBehavior,&AutoFitBehavior);
wordRange=wordTable.GetRange();
//选择第一个单元,进而选择第一行进行格式化
wordCell=wordTable.Cell(1,1);
wordCell.Select();
//selecttherowwithcurrentselection
wordSelection.EndKey(&CComVariant(10),&CComVariant
(1));
//Formattherowwithselection
wordFont=wordSelection.GetFont();
wordFont.SetBold(9999998);
wordCells=wordSelection.GetCells();
wordShading=wordCells.GetShading();
wordShading.SetTexture(0);
wordShading.SetBackgroundPatternColor(14737632);//15987699
wordShading.SetForegroundPatternColor(-16777216);
wordCell=wordTable.Cell(1,1);
wordCell.Select();
wordSelection.TypeText("Range");
wordSelection.MoveRight(&CComVariant(12),&CComVariant
(1),&CComVariant(0));
wordSelection.TypeText("Samples");
wordSelection.MoveRight(&CComVariant(12),&CComVariant
(1),&CComVariant(0));
wordSelection.TypeText("Percentage");
wordSelection.MoveRight(&CComVariant(12),&CComVariant
(1),&CComVariant(0));
wordSelection.TypeText("Calculation");
//
//Savedocumentasreport
SYSTEMTIMEsysTime;
GetLocalTime(&sysTime);
CStringstrReport;
strReport.Format("%d年-%d月-%d日%d-%d-%d报告",sysTime.wYear,sysTime.wMonth,
sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
strReport=strPath+""""+strReport;
wordDoc.SaveAs(COleVariant(strReport),COleVariant((short)0),vOpt,vOpt,vOpt,vOpt,vOpt,vOpt
vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt);
//Releasecom
wordFont.ReleaseDispatch();
wordCells.ReleaseDispatch();
wordShading.ReleaseDispatch();
wordTable.ReleaseDispatch();
wordTables.ReleaseDispatch();
wordRange.ReleaseDispatch();
wordSelection.ReleaseDispatch();
wordDoc.RecheckSmartTags();
wordDocs.ReleaseDispatch();
wordApp.ReleaseDispatch();
returnTRUE;
}
注释如下:
1.使用之前比忘记先进行COM环境的初始化,最好放在BOOLCMDIDemoApp:
:
InitInstance()里吧。
//InitializeCOMcontext
if(FAILED(:
:
CoInitialize(NULL)))
{
AfxMessageBox("InitializeCOMcontextfailed!
");
returnFALSE;
}
2.注意几个函数的用法:
a)wordSelection.EndOf(COleVariant((short)6),COleVariant((short)0));
b)wordSelection.EndKey(&CComVariant(10),&CComVariant
(1));
c)wordSelection.HomeKey(&CComVariant(5),&CComVariant
(1));
d)wordTable=wordTables.Add(wordRange,5/*row*/,4/*column*/,&defaultBehavior,&AutoFitBehavior);
这几个函数可以说是我收获最大的地方了,EndOf/EndKey/HomeKey实现了当前焦点的任意移动,比如到一个文档的末尾或者行尾、表格的操作位置等。
举例来说:
EndOf(VARIANT*Unit,VARIANT*Extend)其第二个参数Extend决定了你是单纯的移动光标还是扩展移动选中内容。
通过VBA参考,你可以知道wdMove=0wdExtend=1,这样就可以决定是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 调用 wod 制作 表格