当前位置:  编程技术>c/c++/嵌入式

C++读写Excel的实现方法详解

    来源: 互联网  发布时间:2014-10-14

    本文导语:  1.导入Excel类型库使用Visual C++的扩展指令#import导入Excel类型库: 代码如下:#import "C:\Program Files\Common Files\microsoft shared\OFFICE14\MSO.DLL"     rename("RGB","MsoRGB")     rename("SearchPath","MsoSearchPath") #import "C:\Program Files\Common Files\Microsoft Sh...

1.导入Excel类型库
使用Visual C++的扩展指令#import导入Excel类型库:
代码如下:

#import "C:\Program Files\Common Files\microsoft shared\OFFICE14\MSO.DLL"
    rename("RGB","MsoRGB")
    rename("SearchPath","MsoSearchPath")

#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"

#import "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE"
    rename( "DialogBox", "ExcelDialogBox" )
    rename( "RGB", "ExcelRGB" )
    rename( "CopyFile", "ExcelCopyFile" )
    rename( "ReplaceText", "ExcelReplaceText" )
    exclude( "IFont", "IPicture" ) no_dual_interfaces

#import指令会从指定的可执行文件,动态链接库等COM组件中导出类型库(type lib),在Debug和Release临时目录中生成对应的类型库头文件(type lib header file),以供C++程序使用。如以上三条指令在编译后会生成excel.tlh, mso.lh和vbetext.olb三个头文件,可以在Debug和Release目录中找到。
2.访问Excel暴露的COM对象
下面是一段比较完整的访问Excel的实例代码。首先用生成的数据填充单元格,然后用这些单元格的数据生成了一个图表(Chart):
代码如下:

try
{
    Excel::_ApplicationPtr pExcelApp;
    HRESULT hr = pExcelApp.CreateInstance(L"Excel.Application");
    ATLASSERT(SUCCEEDED(hr));
    pExcelApp->Visible = true;   // make Excel's main window visible

    Excel::_WorkbookPtr pWorkbook = pExcelApp->Workbooks->Open(lpszPathName);  // open excel file
    Excel::_WorksheetPtr pWorksheet = pWorkbook->ActiveSheet;
    pWorksheet->Name = L"Chart Data";
    Excel::RangePtr pRange = pWorksheet->Cells;

    const int nplot = 100;
    const double xlow = 0.0, xhigh = 20.0;
    double h = (xhigh-xlow)/(double)nplot;
    pRange->Item[1][1] = L"x";  // read/write cell's data
    pRange->Item[1][2] = L"f(x)";
    for (int i=0;iItem[i+2][1] = x;
        pRange->Item[i+2][2] = sin(x)*exp(-x);
    }

    Excel::RangePtr pBeginRange = pRange->Item[1][1];
    Excel::RangePtr pEndRange = pRange->Item[nplot+1][2];
    Excel::RangePtr pTotalRange = 
        pWorksheet->Range[(Excel::Range*)pBeginRange][(Excel::Range*)pEndRange];
    Excel::_ChartPtr pChart = pExcelApp->ActiveWorkbook->Charts->Add();
    // refer to :
    // http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.chart.chartwizard(v=vs.80).aspx
    pChart->ChartWizard(
        (Excel::Range*)pTotalRange,
        (long)Excel::xlXYScatter,
        6L,
        (long)Excel::xlColumns,
        1L,1L,
        true,
        L"My Graph",
        L"x",L"f(x)");
    pChart->Name = L"My Data Plot";

    pWorkbook->Close(VARIANT_TRUE);  // save changes
    pExcelApp->Quit();
}
catch (_com_error& error)
{
    ATLASSERT(FALSE);
    ATLTRACE2(error.ErrorMessage());
}

在这段代码中,Excel::_ApplicationPtr , Excel::_WorkbookPtr 和 Excel::_WorksheetPtr 等均是Visual C++ 编译器根据#import指令自动生成的智能指针,实际上就是C++模板类_com_ptr_t的typedef,其定义可在excel.tlh等类型库头文件中找到。
另外,由于#import指令中没有指定raw_interface_only修饰符,Visual C++对Excel的COM接口进行了适当的封装,以简化COM接口属性和方法的调用,并且将HRESULT返回值都转换成了C++异常,因此,上面的这段代码不需要每一步都坚持HRESULT,而是改为捕获C++异常。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • 自旋锁和读写自旋锁、信号量和读写信号量分别有什么区别?
  • windows下c/c++读写锁实现原理及代码参考
  • linux 下能否读写.dbf 或者.xls格式的文件,怎样读写?高手指点,拜谢!!!
  • c#/ASP.NET操作cookie(读写)代码示例
  • CentOS5.2 如何设置目录读写权限,要求子目录均可以读写。
  • Java读写包括中文的txt文件时不同编码格式问题解决
  • SD卡的驱动只能支持读写2GB的卡,如果要读写更大容量,该修改什么地方?
  • 串口读写,双方同时读写控制问题(linux内核)。
  • 在中断服务程序里可以进行文件的读写操作么?
  • linux多线程无法进行阻塞方式的读写操作
  • 有谁知道,Linux下文件的读写原理是怎样的?急
  • 在中断服务程序里可以进行文件的读写操作么? iis7站长之家
  • socket是否可以同时读写
  • 如何通过LD_PRELOAD降低程序的读写速度
  • 请问JAVA如何读写注册表
  • 怎样编程实现I/O端口的读写?
  • 如何以独占式读写文件?
  • 紧急求助,读写Flash ROM。
  • 父子进程读写文件问题
  • 读写寄存器错误


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3