分享

使用VC 6.0实现自动生成Word表格

 风自向前 2011-05-26
使用VC 6.0实现自动生成Word表格
2010-10-16 11:25
最近在VC6.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",然后选择所需要的类(参考第(3)步),确定

(2)在使用到这些类型的类的头文件或者cpp文件的开头,包含以下头文件:
#include "msword.h"

(3)定义对象

  _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;

(4)创建或者连接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服务失败!"); 
return FALSE; 
}
}

(5)初始化文档,生成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();
table=tables.Add(range,5+nBhCount,6,vOpt,vOpt);
borders=table.GetBorders();
borders.SetEnable(1);//显示表框
range=table.GetRange();
cells=range.GetCells();
cells.SetVerticalAlignment(1);//文字居中
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(psDataArray.GetAt(iBh*3));
cell=table.Cell(2+iBh+1,2);
cell.Merge(table.Cell(2+iBh+1,4));
range=cell.GetRange();
range.SetBold(0);
range.SetText(psDataArray.GetAt(iBh*3+1));
cell=table.Cell(2+iBh+1,3);
range=cell.GetRange();
range.SetBold(0);
range.SetText(psDataArray.GetAt(iBh*3+2));    
}
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(strDjColArray[iCol-1]);
cell=table.Cell(3+nBhCount+2,iCol);
range=cell.GetRange();
range.SetBold(0);
range.SetText(strDjArray[iCol-1]); 
}

(6)保存,清理

 CString   strSave=m_strFilePath+"\\"+m_strFileName;
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();

(7)以上代码实现的word表格效果如下实现了单元格的合并,等操作

                                                       病害统计信息

组成材料

病害种类

病害总数

混凝土

1

砌体

风化

1

砌体

松动

1

                                                       等级统计信息

边坡总数

边坡数(评分为0-1)

边坡数(评分为1-2)

边坡数(评分为2-3)

边坡数(评分为3-4)

边坡数(评分为4-5)

1

0

0

0

1

0

(8)实现单元格的拆分

CComVariant con1(3),con2(2);
cell=table.Cell(A,B)
cell.Split(&con1,&con2);

(9)总体来讲:代码的效率还是比较高的!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多