zoukankan      html  css  js  c++  java
  • 使用C++读写Excel

     

    1.导入Excel类型库

    使用Visual C++的扩展指令#import导入Excel类型库:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #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):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    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 :
        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# 图像处理:将图像(24位真彩)转为 8位灰度图像 采用了内存法,大大提高了效率
    C# 图像处理:复制屏幕到内存中,拷屏操作
    C# 图像处理:Bitmap 与 Image 之间的转换
    C# 图像处理:获取鼠标位置信息(全局)
    C# Liseview的使用方法之一:滚动到选中的行
    C# windows服务:如何获取服务程序所在的文件夹
    C#自制Web 服务器开发:mysql免安装版配置步骤详解分享
    C#自制Web 服务器开发:用C#开发自己的Web服务器
    ROS:ROS操作类MK.cs
  • 原文地址:https://www.cnblogs.com/liangxiaofeng/p/5420551.html
Copyright © 2011-2022 走看看