C++讀寫Excel的實現方法詳解

來源:互聯網
上載者:User

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++異常。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.