很多时候需要直接操作Office来满足程序的要求,例如需要把输出的数据写到Word 或者输出到表格Excel里。如果对它们的文件格式了解的话可以直接写文件的方式来操作,不过既然Office提供了COM组件,当然用这个更方便了。
下面是是一个往Excel写表格的函数,首先要做的是在VC-ClassWizard-Automation-AddClass-From a type library 找到/office/EXCEL9.OLB这个库,然后分别添加下面几个Class。
//声明变量
_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range Cells;
//选择保存文件
char* szFilter="Excel Files(*.xls)|*.xls";
CFileDialog dlg(FALSE,"xls","Report",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,NULL);
if(dlg.DoModal()==IDOK)
{
//模板Excel路径
strPath=GetPath();
//保存路径
strSavePath=dlg.GetPathName();
//创建Excel 2000服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
return;
}
//使Excel不可见
ExcelApp.SetVisible(false);
LPDISPATCH lpDisp; // Often reused variable.
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
lpDisp = ExcelApp.GetWorkbooks(); // Get an IDispatch pointer.
ASSERT(lpDisp);
wbsMyBooks.AttachDispatch(lpDisp); // Attach the IDispatch pointer
// to the books object.
strPath+="//Info.xls";
lpDisp = wbsMyBooks.Open(strPath, // Test.xls is a workbook.
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional); // Return Workbook's IDispatch
// pointer.
wbMyBook.AttachDispatch( lpDisp );
lpDisp = wbMyBook.GetSheets();
ASSERT(lpDisp);
wssMysheets.AttachDispatch(lpDisp);
// Get sheet #1 and attach the IDispatch pointer to your sheet
// object.
lpDisp = wssMysheets.GetItem( COleVariant((short)(1)) );
ASSERT(lpDisp);
wsMysheet.AttachDispatch(lpDisp);
//写表格
nCount=pReport->GetSize();
Cells=wsMysheet.GetCells();//取单元格集合
for(i=0;i<nCount;i++)
{
structReport=pReport->GetAt(i);
//注意单元格集合与单元格都是一个范围对象
Cells.SetItem(CComVariant(i+2),CComVariant(1),CComVariant(structReport.strRecver));
Cells.SetItem(CComVariant(i+2),CComVariant(2),CComVariant(structReport.strTime));
Cells.SetItem(CComVariant(i+2),CComVariant(3),CComVariant(structReport.strFile));
}
wsMysheet.SaveAs(strSavePath,vtMissing,vtMissing,vtMissing,vtMissing,
vtMissing,vtMissing,vtMissing,vtMissing);
wbsMyBooks.Close();
ExcelApp.Quit();
Cells.ReleaseDispatch();
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
AfxMessageBox("生成报表完毕!");
}
整个过程不是很复杂,如果需要其他功能,可以直接查看刚才引入的几个Class的函数,大概就知道能做些什么了,库里还有很多Class,仔细研究的话,可以实现更强大的功能。