导入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目录中找到。
访问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
| try { Excel::_ApplicationPtr pExcelApp; HRESULT hr = pExcelApp.CreateInstance(L"Excel.Application"); ATLASSERT(SUCCEEDED(hr)); pExcelApp->Visible = true;
Excel::_WorkbookPtr pWorkbook = pExcelApp->Workbooks->Open(lpszPathName); 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"; pRange->Item[1][2] = L"f(x)"; for (int i=0;iItem[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(); 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); pExcelApp->Quit(); } catch (_com_error& error) { ATLASSERT(FALSE); ATLTRACE2(error.ErrorMessage()); }
|
在这段代码中,Excel::_ApplicationPtr
, Excel::_WorkbookPtr
和 Excel::_WorksheetPtr
等均是Visual C++编译器根据#import指令自动生成的智能指针,实际上就是C++模板类_com_ptr_t
的typedef,其定义可在excel.tlh等类型库头文件中找到。
另外,由于#import指令中没有指定raw_interface_only修饰符,Visual C++对Excel的COM接口进行了适当的封装,以简化COM接口属性和方法的调用,并且将HRESULT返回值都转换成了C++异常,因此,上面的这段代码不需要每一步都坚持HRESULT,而是改为捕获C++异常。
比较可惜的是这些自动生成的内容并没有良好的说明和注释,网上也没有相关帮助和标准,对方法的使用可以参考VBA的相关方法或者VB.Net引入Excel后的库,基本上保持一致,但是语言相关的内容会有一定差别。