VC 6.0动态生成Word表格实例
(1)首先,向你的项目中添加word 2003类型库:方法是在MFC ClassWizard中点击按钮Add Class,选择From a type library,在弹出的浏览对话框中,浏览找到office 2003安装路径下的msword.olb文件,例如:"C:\Program Files\Microsoft Office\OFFICE11\MSWORD.OLB",然后选择以下类,这些类都是后面实现生成word表格要用到的:
_Application,Documents,_Document,Range, Paragraph,Paragraphs,Cell,Cells,Table,Tables,Border,Borders ,_Font ,PageSetup
(2)在使用到这些类型的类的头文件或者cpp文件的开头,包含以下头文件:#include "msword.h"
(3) 创建如下代码
//1.定义对象
_Application oWordApp;
Documents oDocs;
_Document oDoc;
Range range;
Paragraph paragraph;
Paragraphs paragraphs;
Cell cell;
Cells cells;
Table table;
Tables tables;
Border border;
Borders borders;
_Font font;
PageSetup pagesetup;
//2.创建和连接word对象,初始化连接,判断当前系统是否有word进程,然后然后创建或连接对象
LPDISPATCH pDisp;
LPUNKNOWN pUnk;
CLSID clsid;
CoInitialize(NULL);
CLSIDFromProgID(L"Word.Application",&clsid);
if(GetActiveObject(clsid,NULL,&pUnk)==S_OK)
{
pUnk-> QueryInterface(IID_IDispatch,(void **)&pDisp);
oWordApp.AttachDispatch(pDisp);
}
else
{
if(!oWordApp.CreateDispatch("Word.Application"))
{
AfxMessageBox("创建Word服务失败!");
}
}
//初始化文档,生成WORD表格
oDocs.ReleaseDispatch();
oWordApp.m_bAutoRelease=true;
BeginWaitCursor();
oDocs=oWordApp.GetDocuments();
COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);
oDoc=oDocs.Add(vOpt,vOpt,vOpt,vOpt);//加新文档
pagesetup=oDoc.GetPageSetup();
pagesetup.SetOrientation(1);//横向
paragraphs=oDoc.GetParagraphs(); //生成第一个表
paragraph=paragraphs.GetLast();//以当前段落最后一行为表起始位置
range=paragraph.GetRange();
//添加制作新表格
tables=oDoc.GetTables();
int nBhCount=3;
table=tables.Add(range,5+nBhCount,6,vOpt,vOpt);
borders=table.GetBorders();
borders.SetEnable(1);//显示表框
range=table.GetRange();
cells=range.GetCells();
cells.SetVerticalAlignment(1);//文字居中
#define DOC_TABLE1_WIDTH 60
cells.SetWidth(DOC_TABLE1_WIDTH);
cell=table.Cell(1,1);//合并第一行的三列
cell.Merge(table.Cell(1,6));
range=cell.GetRange();
range.SetBold(1);
range.SetText(" 病害统计信息");//居中
cell=table.Cell(2,1);
cell.Merge(table.Cell(2,2));
range=cell.GetRange();
range.SetBold(1);
range.SetText("组成材料");
cell=table.Cell(2,2);
cell.Merge(table.Cell(2,4));
range=cell.GetRange();
range.SetBold(1);
range.SetText("病害种类");
cell=table.Cell(2,3);
range=cell.GetRange();
range.SetBold(1);
range.SetText("病害总数");
for(int iBh=0;iBh<nBhCount;iBh++)
{
cell=table.Cell(2+iBh+1,1);
cell.Merge(table.Cell(2+iBh+1,2));
range=cell.GetRange();
range.SetBold(0);
range.SetText("hello1");
cell=table.Cell(2+iBh+1,2);
cell.Merge(table.Cell(2+iBh+1,4));
range=cell.GetRange();
range.SetBold(0);
range.SetText("hello2");
cell=table.Cell(2+iBh+1,3);
range=cell.GetRange();
range.SetBold(0);
range.SetText("hello3");
}
cell=table.Cell(3+nBhCount,1);//合并7列
cell.Merge(table.Cell(3+nBhCount,6));
range=cell.GetRange();
range.SetBold(1);
range.SetText(" 等级统计信息");
for(int iCol=1;iCol<=6;iCol++)
{
cell=table.Cell(3+nBhCount+1,iCol);
range=cell.GetRange();
range.SetBold(1);
range.SetText("hello4");
cell=table.Cell(3+nBhCount+2,iCol);
range=cell.GetRange();
range.SetBold(0);
range.SetText("hello5");
}
//保存,清理
CString strSave="D:\\test.doc";
COleVariant vTrue((short)TRUE), vFalse((short)FALSE);
_Document oActiveDoc;
oActiveDoc = oWordApp.GetActiveDocument();
oActiveDoc.SaveAs(COleVariant(strSave),COleVariant((short)0), vFalse,
COleVariant(""), vTrue,COleVariant(""),vFalse,
vFalse, vFalse, vFalse, vFalse,
vOpt,vOpt,vOpt,vOpt,vOpt);
oWordApp.SetVisible(true);
oDocs.ReleaseDispatch(); //断开关联;
oWordApp.ReleaseDispatch(); //退出WORD
EndWaitCursor();
(5)生成表格如下:
病害统计信息 |
|||||
组成材料 |
病害种类 |
病害总数 |
|||
hello1 |
hello2 |
hello3 |
|||
hello1 |
hello2 |
hello3 |
|||
hello1 |
hello2 |
hello3 |
|||
等级统计信息 |
|||||
hello4 |
hello4 |
hello4 |
hello4 |
hello4 |
hello4 |
hello5 |
hello5 |
hello5 |
hello5 |
hello5 |
hello5 |