VC
最近在做个数据库程序,因为有些数据用户要求导出到E_cel文件显示(需要报给其他单位)。所以查阅了一下相关的VC的E_cel编程操作,总结一下吧:(所有资料来源于网络)利用VC操作E_cel的方法至少有两种
1.利用ODBC把E_cel文件当成数据库文件,来进行读、写、修改等操作,网上有人编写了CSpreadSheet类,提供支持。
2.利用Automation(OLDAutomation)方法。将E_cel当成组件服务器,利用VBA。又分为基于MFC的和SDK两种。
主要研究了一下第二种基于MFC的OLE编程方法。
一、E_cel的对象模型
在对E_cel编程之前首先要了解微软E_cel对象(Object)模型。(Parent-Child关系)
图1Office应用程序对象模型(E_cel)Frommsdn
Application:代表应用程序本身。即E_cel应用程序
Workbooks:是Workbook的集合,代表了工作薄。
Worksheets:是Worksheet的集合,是Workbook的子对象。
Range:是Worksheet的子对象,可以理解为Sheet中一定范围的单元格。Shapes:是Worksheet的子对象,用于存储图片等信息的单元格。
二、VC操作E_cel的初始化过程
1、导入E_cel库文件。
首先打开ClassWizard,点击"Addclass"按钮下的"FromatypeLibrary"导入office安装目录下的"XXX"(适用于E_cel20__),然后选择需要用的一些类,比如_Application,_Workbook,Workbooks,Worksheets,_Wroksheet,Range,Shapes等。点击确定后,系统会在你的程序目录下生成e_cel.h和XXX两个文件,在要使用这些导入的类时加入include"E_cel.h"即可。
2、初始化Application。
首先,初始化COM组件
viewplaincopytoclipboardprint
if(!Af_OleInit())
Af_MessageBo_("无法初始化COM的动态连接库");
returnFALSE;
if(!Af_OleInit())
Af_MessageBo_("无法初始化COM的动态连接库");
returnFALSE;
然后,创建E_cel服务器(启动E_cel)
定义app的全局或成员变量_Applicationapp;
viewplaincopytoclipboardprint
if(!XXX("XXX"))
Af_MessageBo_("无法启动E_cel服务器");
returnFALSE;
if(!XXX("XXX"))
Af_MessageBo_("无法启动E_cel服务器");
returnFALSE;
3、设置E_cel的状态
viewplaincopytoclipboardprint
XXX(bVisble);使E_cel可见
XXX(bControl);允许其他用户控制E_cel
XXX(bVisble);使E_cel可见
XXX(bControl);允许其他用户控制E_cel
三、VC对E_cel的操作
定义变量
viewplaincopytoclipboardprint
Workbooksbooks;
_Workbookbook;
Worksheetssheets;
_Worksheetsheet;
LPDISPATCHlpDisp;
Rangerange;
COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);Workbooksbooks;
_Workbookbook;
Worksheetssheets;
_Worksheetsheet;
LPDISPATCHlpDisp;
Rangerange;
COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
1、打开已有的E_cel文件
viewplaincopytoclipboardprint
XXX(XXXkbooks());
或者也可以
books=XXX();
lpDisp=XXX("D:XXX",covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional);
XXX(XXX());
或者也可以
books=XXX();
lpDisp=XXX("D:XXX",covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional);
2.、新建一个._ls文件,并写入数据
COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);GettheWorkbookscollectionsothatyoucanaddanewworkbook
XXX(XXX());得到Workbooksbook=XXX(covOptional);得到Workbook
GettheWorksheetscollectionsothatyoucangettheIDispatchforthefirstWorksheet
sheets=XXX();得到Worksheets
sheet=XXX(COleVariant((short)1));得到Worksheet
分别向每个单元格添加数据
E_cel20__用函数SetValue()即可,E_cel20__用函数SetValue2()
range=XXX(COleVariant("A1"),covOptional);获取A1Range
XXX(COleVariant("Date"));添加数据
range=XXX(COleVariant("B1"),covOptional);获取B1Range
XXX(COleVariant("Order"));添加数据range=XXX(COleVariant("C1"),covOptional);获取C1Range
XXX(COleVariant("Amount"));添加数据range=XXX(COleVariant("D1"),covOptional);获取D1Range
XXX(COleVariant("Ta_"));添加数据
向单元格中添加公式
range=XXX(COleVariant("D2"),covOptional);获得D2Range
range=XXX(COleVariant((long)NUMROWS),COleVariant((long)1));重新设置D2的大小
XXX(COleVariant("=C20.07"));给D2:D21设置公式
设置单元格的格式
range=XXX(COleVariant("A1"),COleVariant("D1"));获得A1:D1的Range
oFont=XXX();获得Range的字体
XXX(COleVariant((short)TRUE));设置是否粗体
XXX(COleVariant((long)RGB(255,0,0)));设置字体颜色
XXX(COleVariant("黑体"));设置字体类型
range=XXX();获得全部的单元格
XXX();自动适合尺寸
3、合并单元格
思路:1.先获取A1:C1的Range范围,然后重新定义此范围,最后合并2.直接获得A1:C2的Range范围,直接合并。结果和第一种方法一样RangeunionRange;
unionRange=sheXXX(COleVariant("A1"),COleVariant("C1"));vResult=XXX();
unionRange=XXX(COleVariant((long)2),COleVariant((long)3));
XXX(COleVariant((long)0));合并单元格
XXX(COleVariant((short)30));设置单元格的高度XXX(COleVariant((long)-4108));水平居中对齐
4、向单元格中插入图片(支持BMP、JPG格式,其他没试)
Shapesshapes=XXX();从Sheet对象上获得一个Shapes
range=XXX(COleVariant("B16"),COleVariant("J22"));获得Range对象,用来插入图片
rgMyRge1=range;
XXX("D:XXX",false,true,
(float)XXX().dblVal,(float)XXX().dblVal,从本地添加一个图片
(float)XXX().dblVal,(float)XXX().dblVal);
ShapeRangesRange=XXX(_variant_t(long(1)));XXX(float(30));