C++调用微软类库操作Excel详细示例

最近需要一个属性数据库导出查询、统计信息到Excel中的功能,之前也没有系统的学习过代码操作Excel,只用过ADO的方式读取写入,现在所需的Excel既然是查询统计报表,就必须有较好的排版格式、柱状图、饼状图等东西,所以还得看一下微软office的类库是怎么用的。

网上没有找到比较完整的资料,搜索一部分,摸索一部分,把自己所需要的功能实现方法给总结出来做了个Demo,有需要的朋友可以参考一下。首先是引入Excel类库,新建一个空工程后,在stdafx.h头文件中添加下面代码:

1
2
3
#import " C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\MSO.DLL" rename("RGB", "ExcelRGB")\
rename("DocumentProperties", "ExcelDocumentProperties")\
rename("SearchPath", "ExcelSearchPath")

#import ” C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB”

#import ” C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE” rename(“DialogBox”, “ExcelDialogBox”)\
rename(“RGB”, “ExcelRGB”)\
rename(“CopyFile”, “ExcelCopyFile”)\
rename(“ReplaceText”, “ExcelReplaceText”) rename_namespace(“Excel”)\

Demo是基于office2003开发的,如果你的电脑上装的是office或者更高版本,请按照上述类似的路径找到对应文件,文件位置与office安装路径有关。加上以上代码进行编译一下,看是否已经将类库正常引入,出现部分警告可以忽略。

完成类库引入就可以进行相关变量的声明了,比如Demo中在“ExcelTestDlg.h”声明了类的如下成员变量:

1
2
3
4
5
6
7
Excel::_ApplicationPtr excelapp;//Excel进程控制
Excel::_WorkbookPtr excelworkbook;//工作簿控制
Excel::SheetsPtr excelworksheets;//表控制,指向所有表
Excel::_WorksheetPtr excelworksheet;//单独表控制
Excel::RangePtr excelrange;//控制指定范围的单元格
Excel::_ChartPtr pChart;//生成图表用
Excel::InteriorPtr? pInterior; //没找到学名,我称它为“内部结构指针”,可用于操作单元格样式

下边创建一个Excel进程:

1
2
3
4
excelapp.CreateInstance("Excel.Application",NULL);
excelworkbook = excelapp->Workbooks->Add(); //新建一个工作簿
excelworksheet= excelworkbook->Worksheets->Add();//新建一个sheet
excelworksheet->PutName("new sheet");//设置sheet名称为new sheet

然后就可以对Excel进行数据填写、合并单元格并居中、修改颜色、加边框、创建图表等操作了,具体操作代码就不再贴上来了,可以下载下边附件的Demo看一下。代码的编写其实是有窍门的,如果想实现某个操作,可以先录制一段宏代码(打开Excel-工具-宏-录制新宏,开始操作,操作完后点停止录制,然后查看宏),对照着宏代码写出对应的C++代码就可以了,不会VBA也没有关系,看个差不多就可以了,下边是一段宏代码和C++代码的对比:

VBA宏代码:

1
2
3
4
5
6
7
8
9
10
11
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=Sheets("new sheet").Range("A2:A10,D2:D10") _
, PlotBy:=xlColumns
ActiveChart.Location Where:=xlLocationAsNewSheet
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "要素3"
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
End With

C++代码

1
2
3
4
5
6
pChart = excelworkbook->Charts->Add();
pChart->PutChartType(Excel:: xlLineMarkers);
xrange.Format("A2:A10,D2:D10");
excelrange=excelworksheet->GetRange(xrange.GetBuffer(0));
pChart->SetSourceData(excelrange,long(Excel::xlColumns));
pChart->Location(Excel::xlLocationAsNewSheet ,"要素3");

可以发现相关函数名称是没有变化的,变化的只是代码风格,因此,只要宏录制功能能录下来代码的操作,用C++调用类库基本上也都可以实现。

以前不知道微软提供的office类库这么简单易用,Word和PPT的操作应当也是类似的,录制一段宏代码即可解决好多问题,熟练之后完全可以写自己的office插件了,有时间了再研究一下吧,希望这篇文章会对你有所帮助。

附件:Demo (927)