使用C++讀寫Excel


1.導入Excel類型庫

使用Visual C++的擴展指令#import導入Excel類型庫:

01 #import "C:\\Program Files\\Common Files\\microsoft shared\\OFFICE14\\MSO.DLL" \
02     rename("RGB","MsoRGB") \
03     rename("SearchPath","MsoSearchPath")
04  
05 #import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"
06  
07 #import "C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE" \
08     rename"DialogBox""ExcelDialogBox" ) \
09     rename"RGB""ExcelRGB" ) \
10     rename"CopyFile""ExcelCopyFile" ) \
11     rename"ReplaceText""ExcelReplaceText" ) \
12     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):

01 try
02 {
03     Excel::_ApplicationPtr pExcelApp;
04     HRESULT hr = pExcelApp.CreateInstance(L"Excel.Application");
05     ATLASSERT(SUCCEEDED(hr));
06     pExcelApp->Visible = true;   // make Excel’s main window visible
07  
08     Excel::_WorkbookPtr pWorkbook = pExcelApp->Workbooks->Open(lpszPathName);  // open excel file
09     Excel::_WorksheetPtr pWorksheet = pWorkbook->ActiveSheet;
10     pWorksheet->Name = L"Chart Data";
11     Excel::RangePtr pRange = pWorksheet->Cells;
12  
13     const int nplot = 100;
14     const double xlow = 0.0, xhigh = 20.0;
15     double h = (xhigh-xlow)/(double)nplot;
16     pRange->Item[1][1] = L"x";  // read/write cell’s data
17     pRange->Item[1][2] = L"f(x)";
18     for (int i=0;i<nplot;++i)
19     {
20         double x = xlow+i*h;
21         pRange->Item[i+2][1] = x;
22         pRange->Item[i+2][2] = sin(x)*exp(-x);
23     }
24  
25     Excel::RangePtr pBeginRange = pRange->Item[1][1];
26     Excel::RangePtr pEndRange = pRange->Item[nplot+1][2];
27     Excel::RangePtr pTotalRange =
28         pWorksheet->Range[(Excel::Range*)pBeginRange][(Excel::Range*)pEndRange];
29     Excel::_ChartPtr pChart = pExcelApp->ActiveWorkbook->Charts->Add();
30     // refer to :
32     pChart->ChartWizard(
33         (Excel::Range*)pTotalRange,
34         (long)Excel::xlXYScatter,
35         6L,
36         (long)Excel::xlColumns,
37         1L,1L,
38         true,
39         L"My Graph",
40         L"x",L"f(x)");
41     pChart->Name = L"My Data Plot";
42  
43     pWorkbook->Close(VARIANT_TRUE);  // save changes
44     pExcelApp->Quit();
45 }
46 catch (_com_error& error)
47 {
48     ATLASSERT(FALSE);
49     ATLTRACE2(error.ErrorMessage());
50 }

在這段代碼中,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++異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章