C++讀寫Excel的實現(xiàn)方法詳解
更新時間:2013年05月17日 15:54:42 作者:
本篇文章是對C++讀寫Excel的實現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
1.導(dǎo)入Excel類型庫
使用Visual C++的擴(kuò)展指令#import導(dǎo)入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指令會從指定的可執(zhí)行文件,動態(tài)鏈接庫等COM組件中導(dǎo)出類型庫(type lib),在Debug和Release臨時目錄中生成對應(yīng)的類型庫頭文件(type lib header file),以供C++程序使用。如以上三條指令在編譯后會生成excel.tlh, mso.lh和vbetext.olb三個頭文件,可以在Debug和Release目錄中找到。
2.訪問Excel暴露的COM對象
下面是一段比較完整的訪問Excel的實例代碼。首先用生成的數(shù)據(jù)填充單元格,然后用這些單元格的數(shù)據(jù)生成了一個圖表(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++ 編譯器根據(jù)#import指令自動生成的智能指針,實際上就是C++模板類_com_ptr_t<T>的typedef,其定義可在excel.tlh等類型庫頭文件中找到。
另外,由于#import指令中沒有指定raw_interface_only修飾符,Visual C++對Excel的COM接口進(jìn)行了適當(dāng)?shù)姆庋b,以簡化COM接口屬性和方法的調(diào)用,并且將HRESULT返回值都轉(zhuǎn)換成了C++異常,因此,上面的這段代碼不需要每一步都堅持HRESULT,而是改為捕獲C++異常。
使用Visual C++的擴(kuò)展指令#import導(dǎo)入Excel類型庫:
復(fù)制代碼 代碼如下:
#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指令會從指定的可執(zhí)行文件,動態(tài)鏈接庫等COM組件中導(dǎo)出類型庫(type lib),在Debug和Release臨時目錄中生成對應(yīng)的類型庫頭文件(type lib header file),以供C++程序使用。如以上三條指令在編譯后會生成excel.tlh, mso.lh和vbetext.olb三個頭文件,可以在Debug和Release目錄中找到。
2.訪問Excel暴露的COM對象
下面是一段比較完整的訪問Excel的實例代碼。首先用生成的數(shù)據(jù)填充單元格,然后用這些單元格的數(shù)據(jù)生成了一個圖表(Chart):
復(fù)制代碼 代碼如下:
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++ 編譯器根據(jù)#import指令自動生成的智能指針,實際上就是C++模板類_com_ptr_t<T>的typedef,其定義可在excel.tlh等類型庫頭文件中找到。
另外,由于#import指令中沒有指定raw_interface_only修飾符,Visual C++對Excel的COM接口進(jìn)行了適當(dāng)?shù)姆庋b,以簡化COM接口屬性和方法的調(diào)用,并且將HRESULT返回值都轉(zhuǎn)換成了C++異常,因此,上面的這段代碼不需要每一步都堅持HRESULT,而是改為捕獲C++異常。
相關(guān)文章
C語言內(nèi)存函數(shù)的使用及其模擬實現(xiàn)
這篇文章主要介紹了C語言內(nèi)存函數(shù)的使用及其模擬實現(xiàn),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10
C++ boost::asio編程-同步TCP詳解及實例代碼
這篇文章主要介紹了C++ boost::asio編程-同步TCP詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11
C語言實現(xiàn)十進(jìn)制轉(zhuǎn)任意進(jìn)制的代碼詳解
這篇文章主要介紹了C語言實現(xiàn)十進(jìn)制轉(zhuǎn)任意進(jìn)制,運用一個數(shù)組,通過數(shù)字每次取任意進(jìn)制模,存在數(shù)組中, 再通過倒取數(shù)組中的數(shù)值,來實現(xiàn)進(jìn)制轉(zhuǎn)換,如果遇到十六進(jìn)制,利用ASCII碼值 數(shù)字字符和大寫字母 相差55的特性來解決,文中有詳細(xì)代碼示例,需要的朋友可以參考下2024-05-05

