使用COM或者OLE的方法调用来控制Excel或者其他Office组件

    很多时候需要直接操作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,仔细研究的话,可以实现更强大的功能。

阅读更多
个人分类: VC++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

使用COM或者OLE的方法调用来控制Excel或者其他Office组件

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭