您的当前位置:首页VC操作Ecel文件编程相关内容总结

VC操作Ecel文件编程相关内容总结

2024-06-26 来源:爱问旅游网

VC操作Ecel文件编程相关内容总结

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));

显示全文