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

2016-02-19 09:01 125 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐C++读写Excel的实现方法详解,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

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

#import "C:Program FilesCommon Filesmicrosoft sharedOFFICE14MSO.DLL"
    rename("RGB","MsoRGB")
    rename("SearchPath","MsoSearchPath")

#import "C:Program FilesCommon FilesMicrosoft SharedVBAVBA6VBE6EXT.OLB"

#import "C:Program FilesMicrosoft OfficeOffice14EXCEL.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;inplot;++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_tT的typedef,其定义可在excel.tlh等类型库头文件中找到。
另外,由于#import指令中没有指定raw_interface_only修饰符,Visual C++对Excel的COM接口进行了适当的封装,以简化COM接口属性和方法的调用,并且将HRESULT返回值都转换成了C++异常,因此,上面的这段代码不需要每一步都坚持HRESULT,而是改为捕获C++异常。

来源:https://www.tulaoshi.com/n/20160219/1589215.html

延伸阅读
标签: Web开发
一,简介 如果你对Unix/Linux有所了解的话,你应该知道他们大都自带了C和C++的编译器,分别是GCC和G++。Unix在程序安装及Make等许多地方使用到了这些编译器。利用一些控制台命令,C++和PHP, 我将向你介绍怎样生成一个完整的C++程序例子,他可以在用PHP程序来执行,并能获得相应的输出结果。我将先生成C++程序代码,并编译它,谈后讨论...
标签: PHP
  Author: Mitchell Harper 翻译    :Kefeng Nie (kefeng_nie@163.com) Date   :2002-10-15   一,简介   如果你对Unix/Linux有所了解的话,你应该知道他们大都自带了C和C++的编译器,分别是GCC和G++。Unix在程序安装及Make等许多地方使用到了这些编译器。利用一些控制台命令,C++和PHP, 我将...
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。 sprintf 是个变参函数,定义如下: int sprintf( char *buffer, const char *format [, argument] ... ); 除了前...
前言:本文书写的格式与其它不相同。本文题目说是关于C++ API的思考,其实也不仅仅是C++,对于其它语言同样适用。 API实际是指Application Programming Interface,应用程序编程接口。对API是一套用来控制Windows的各个部件的外观和行为的一套预先定义的Windows函数。在C++中我认为:一个API就是一堆类以及类中方法和字段的集合。 并不是所有的...
  ANSI C++ 中的 Singleton 实现说难不难,说轻易也不轻易,很多人写 ANSI C++ 的 Singleton class 都有错误。这篇文章讨论怎样在 ANSI c++ 中写 Singleton class, 希望对大家有帮助。   《设计模式》中把 Singleton 写成返回指针: class Singleton{ public:     static Singleton* Instance(...

经验教程

219

收藏

16
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部