c语⾔读写excel,C++读写Excel的实现⽅法详解
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" ) \
write的返回值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
{
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的typedef,其定义可在excel.tlh等类型库头⽂件中到。另外,由于#import指令中没有指定raw_interface_only修饰符,Visual C++对Excel的COM接⼝进⾏了适当的封装,以简化COM接⼝属性和⽅法的调⽤,并且将HRESULT返回值都转换成了C++异常,因此,上⾯的这段代码不需要每⼀步都坚持HRESULT,⽽是改为捕获C++异常。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论