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

 更新时间:2013年05月17日 15:54:42   作者:  
本篇文章是对C++读写Excel的实现方法进行了详细的分析介绍,需要的朋友参考下
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;i<nplot;++i)
    {
        double x = xlow+i*h;
        pRange->Item[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<T>的typedef,其定义可在excel.tlh等类型库头文件中找到。
另外,由于#import指令中没有指定raw_interface_only修饰符,Visual C++对Excel的COM接口进行了适当的封装,以简化COM接口属性和方法的调用,并且将HRESULT返回值都转换成了C++异常,因此,上面的这段代码不需要每一步都坚持HRESULT,而是改为捕获C++异常。

相关文章

  • C语言内存函数的使用及其模拟实现

    C语言内存函数的使用及其模拟实现

    这篇文章主要介绍了C语言内存函数的使用及其模拟实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • 用C语言实现链式栈介绍

    用C语言实现链式栈介绍

    大家好,本篇文章主要讲的是用C语言实现链式栈介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言的函数概念与规则你了解吗

    C语言的函数概念与规则你了解吗

    这篇文章主要介绍了C语言中的函数概念与规则,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助
    2021-08-08
  • C++ boost::asio编程-同步TCP详解及实例代码

    C++ boost::asio编程-同步TCP详解及实例代码

    这篇文章主要介绍了C++ boost::asio编程-同步TCP详解及实例代码的相关资料,需要的朋友可以参考下
    2016-11-11
  • C语言实现十进制转任意进制的代码详解

    C语言实现十进制转任意进制的代码详解

    这篇文章主要介绍了C语言实现十进制转任意进制,运用一个数组,通过数字每次取任意进制模,存在数组中, 再通过倒取数组中的数值,来实现进制转换,如果遇到十六进制,利用ASCII码值  数字字符和大写字母 相差55的特性来解决,文中有详细代码示例,需要的朋友可以参考下
    2024-05-05
  • C语言函数语法详解

    C语言函数语法详解

    本文是小结了一下C语言的函数语法,详细介绍了C语言函数语法的概述、函数的定义、函数的返回值、函数调用等7个方面的内容,非常详细,这里推荐给小伙伴们。
    2015-02-02
  • 如何判断一个整数的二进制中有多少个1

    如何判断一个整数的二进制中有多少个1

    本篇文章是对如何判断一个整数的二进制中有多少个1的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言动态内存分配图文讲解

    C语言动态内存分配图文讲解

    给数组分配多大的空间?你是否和初学C时的我一样,有过这样的疑问。这一期就来聊一聊动态内存的分配,读完这篇文章,你可能对内存的分配有一个更好的理解
    2023-01-01
  • 使用c++实现异或加密的代码示例

    使用c++实现异或加密的代码示例

    这篇文章主要为大家介绍了c++实现异或加密的代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • C++代码实现双向链表

    C++代码实现双向链表

    这篇文章主要为大家详细介绍了C++代码实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论