最近需要一个属性数据库导出查询、统计信息到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插件了,有时间了再研究一下吧,希望这篇文章会对你有所帮助。
源码下载:百度云
提取码:7b3f
技术贴,支持。
高手啊!