使用COM或者OLE的方法调用来控制Excel或者其他Office组件
2004-07-29 15:05
1256 查看
很多时候需要直接操作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,仔细研究的话,可以实现更强大的功能。
下面是是一个往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,仔细研究的话,可以实现更强大的功能。
相关文章推荐
- MFC中使用OLE/COM操作EXCEL的方法
- 使用VC6和com控制excel的一些方法 (试验有效)
- MFC中使用OLE/COM操作EXCEL的方法
- 使用Geoprocessor导出ArcSde中的数据,对COM 组件的调用返回了错误 HRESULT E_FAIL 的解决方法
- 对Excel或者其他office操作推荐使用NPOI
- 安卓四大组件之二#2-使用AIDL技术实现动态调用其他app中的Service的方法
- 不使用第三方组件,只调用COM,导出EXECL,但只装OFFICE2007,不装2003,直接强制引用动态库的方法
- (用iis调用com来操纵Excel) 检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。8000401A的错误解决方法
- 使用ASP调用C#写的COM组件
- Delphi控制Excel的方法 OLE
- ASP.NET中常用的26个优化性能方法---将调用密集型的 COM 组件迁移到托管代码
- 调试Excel调用的COM组件
- Delphi中使用OLE方法操作Excel
- 组件的几种方法VC中使用COM
- 使用JavaScript中的ActiveXObject控制Excel的方法
- C# 使用 Environment.GetCommandLineArgs 方法 制作*.exe和参数 供其他程序调用
- "对COM 组件的调用返回了错误 HRESULT E_FAIL"的解决方法
- asp.net导出数据到Excel的方法(完全无组件,不用调用Excel.exe)
- "对COM 组件的调用返回了错误 HRESULT E_FAIL"的解决方法
- BCB使用OLE控制EXCEL过程中如何默认保存