2023年11月30日发(作者:)

vc操作Excel保存和Excel的退出

公司给了我⼀个任务,⽤excel调⽤模版⽣成结帐单并进⾏打印。我在努⼒的n天以后终于完成了。现在总结⼀下:

1.速度问题,vc读写excel的时候速度是很慢的,如果⼀个⼀个单元格的读写,能把你给急死。所以在读取和写⼊excel的时候,我使⽤了安全数组,这样能够将对应的数据

⼀次性从⽂件中读出或者是写⼊。

2.关于屏蔽掉最后确定改变⽂件的对话框,⽤Bookclose⽅法

//定义变量

COleVariant covTrue((short)TRUE),

covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

//关闭book, 不保存

m_(covFalse,COleVariant(strExcelName),covOptional);

3.关于关闭excel进程的问题,即在

m_ExcelApp->Quit(); 以后系统中仍然有⼀个excel进程,这种情况绝对是excel中有没有释放的对象,注意这⾥说的对象不仅仅是⾃⼰定义的对象,在系统的运⾏中

excel可能会⾃⼰隐性的创建⼀些对象,对于这些对象也⼀定要释放。

excel中的函数 select, m_ge, 等都会创建新的对象,在不⽤了以后⼀定要释放.通⽤的调试⽅法是,⽤创建到最后退出当中要⼀条⼀条的进⾏语句的

添加,这样就可以保证最后系统能够顺利退出了.我的程序就是因为在copy操作之前有⼀个m_ge的函数在copy结束之后没有释放,所以造成excel进程⽆法释放.

上关于如果杀死excel进程的⽂章其实是不负责任的做法,对于真正的程序员来说是不可能⽤那些⽅法的.就好像修炼的⼈的⼼魔⼀样,⼀旦⽤了这种⽅法,以后⾃⼰的技术就不会

再有进步了

1.彻底关闭Excel进程

eDispath();

eDispath();

eDispath();

eDispath();

eDispath();

();//ExcelApp,_Applacation对象,以上⼏个对象同理。

eDispath();

注意:最后两⾏代码顺序不要反了,否则不能彻底关闭Excel进程,这是关键

2.Excel⽂件保存为HTML⽹页

(strFileName,ColeVariant((long)44),vtMissing,...后⾯参数全是vtMissing);

(strFileName,vtMissing,vtMissing,...后⾯参数全是vtMissing);

3.不显⽰任何警告对话框

在保存⽂件代码之前加上下⾯语句

rtBeforeOverwritting(false);

playAlert(false);

/

最近在做个数据库程序,因为有些数据⽤户要求导出到Excel⽂件显⽰(需要报给其他单位)。所以查阅了⼀下相关的VCExcel编程操作,总结⼀下吧:(所有资料来源

于⽹络)

利⽤VC操作Excel的⽅法⾄少有两种

1 .利⽤ODBCExcel⽂件当成数据库⽂件,来进⾏读、写、修改等操作,⽹上有⼈编写了CSpreadSheet类,提供⽀持。

2. 利⽤AutomationOLD Automation)⽅法。将Excel当成组件服务器,利⽤VBA。⼜分为基于MFC的和SDK两种。

主要研究了⼀下第⼆种基于MFCOLE编程⽅法。

⼀、Excel的对象模型

在对Excel编程之前⾸先要了解微软Excel 对象(Object)模型。(Parent-Child关系)

Office 应⽤程序对象模型

1 Office 应⽤程序对象模型(ExcelFrom msdn

其中:

Application:代表应⽤程序本⾝。即Excel应⽤程序

Workbooks:是Workbook 的集合,代表了⼯作薄。

Worksheets:是Worksheet的集合,是Workbook的⼦对象。

Range:是Worksheet的⼦对象,可以理解为Sheet中⼀定范围的单元格。

Shapes:是Worksheet的⼦对象,⽤于存储图⽚等信息的单元格。

⼆、VC操作Excel的初始化过程

1、导⼊Excel库⽂件。

⾸先打开Class Wizard,点击"Add class"按钮下的"From a type Library"导⼊ office安装⽬录下的""(适⽤于 Excel2003),然后选择需要⽤的⼀些类,⽐如

_Application, _Workbook, Workbooks, Worksheets,_Wroksheet,Range,Shapes等。点击确定后,系统会在你的程序⽬录下⽣成excel.h两个⽂件,在要使⽤这些

导⼊的类时加⼊#include "Excel.h"即可。

2、初始化Application

⾸先, 初始化COM组件

[cpp:nogutter]

1. if(!AfxOleInit())

2. {

3. AfxMessageBox("⽆法初始化COM的动态连接库");

4. return FALSE;

5. }

然后,创建Excel 服务器(启动Excel)

定义app的全局或成员变量 _Application app;

[cpp:nogutter]

1. if (!Dispatch("ation"))

2. {

3. AfxMessageBox("⽆法启动Excel服务器");

4. return FALSE;

5. }

3、设置Excel的状态

[cpp:nogutter]

1. ible(bVisble); // 使Excel可见

2. rControl(bControl); // 允许其他⽤户控制Excel

三、VCExcel的操作

定义变量

[cpp:nogutter]

1. Workbooks books;

2. _Workbook book;

3. Worksheets sheets;

4. _Worksheet sheet;

5. LPDISPATCH lpDisp;

6. Range range;

7. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

1、打开已有的Excel⽂件

[cpp:nogutter]

1. Dispatch(kbooks());

2. // 或者也可以

3. // books = kbooks();

4. lpDisp = ("D:", covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,

5. covOptional, covOptional, covOptional, covOptional);

2. 新建⼀个.xls⽂件,并写⼊数据

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

// Get the Workbooks collection so that you can add a new workbook

Dispatch(kbooks()); // 得到Workbooks

book = (covOptional); // 得到Workbook

// Get the Worksheets collection so that you can get the IDispatch for the first Worksheet

sheets = ksheets(); // 得到Worksheets

sheet = m(COleVariant((short)1)); // 得到Worksheet

// 分别向每个单元格添加数据

// Excel2000 ⽤函数SetValue()即可, Excel2003⽤函数SetValue2()

//

range = ge(COleVariant("A1"), covOptional); // 获取A1 Range

ue2( COleVariant("Date")); // 添加数据

range = ge(COleVariant("B1"), covOptional); // 获取B1 Range

ue2(COleVariant("Order")); // 添加数据

range = ge(COleVariant("C1"), covOptional); // 获取C1 Range

ue2(COleVariant("Amount")); // 添加数据

range = ge(COleVariant("D1"), covOptional); // 获取D1 Range

ue2(COleVariant("Tax")); // 添加数据

// 向单元格中添加公式

range = ge(COleVariant("D2"), covOptional); // 获得D2 Range

range = ize(COleVariant((long)NUMROWS), COleVariant((long)1)); // 重新设置D2的⼤⼩

mula(COleVariant("=C2*0.07")); // D2D21设置公式

// 设置单元格的格式

range = ge(COleVariant("A1"), COleVariant("D1")); // 获得A1:D1Range

oFont = t(); // 获得Range的字体

d(COleVariant((short)TRUE)); // 设置是否粗体

or(COleVariant((long)RGB(255, 0, 0))); // 设置字体颜⾊

e(COleVariant("⿊体")); // 设置字体类型

//设置单元格尺⼨根据内容⾃适应

range = ireColumn(); // 获得全部的单元格

t(); // ⾃动适合尺⼨

3 合并单元格

// 思路:1.先获取A1C1Range范围,然后重新定义此范围,最后合并

// 2.直接获得A1:C2Range范围,直接合并。结果和第⼀种⽅法⼀样

Range unionRange;

unionRange = ge(COleVariant("A1"), COleVariant("C1"));

vResult = geCells();

unionRange = ize(COleVariant((long)2), COleVariant((long)3));

(COleVariant((long)0)); //合并单元格

Height(COleVariant((short)30)); //设置单元格的⾼度

izontalAlignment(COleVariant((long)-4108));// ⽔平居中对齐

4、向单元格中插⼊图⽚(⽀持BMPJPG格式,其他没试)

Shapes shapes = pes(); // Sheet对象上获得⼀个Shapes

range = ge(COleVariant("B16"),COleVariant("J22")); // 获得Range对象,⽤来插⼊图⽚

rgMyRge1 = range;

ture("D://" , false , true ,

(float)range .GetLeft().dblVal, (float)range .GetTop().dblVal, // 从本地添加⼀个图⽚

(float)range .GetWidth().dblVal, (float)range .GetHeight().dblVal);

ShapeRange sRange = ge(_variant_t(long(1)));

ght(float(30));

th(float(30));

5、将已建的.xls⽂件另存为

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

(COleVariant("D://"),covOptional,covOptional,

covOptional,covOptional,covOptional,0,

covOptional,covOptional,covOptional,covOptional,covOptional);

6、关闭Excel服务

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

ed(TRUE); // Workbook的保存状态设置为已保存,即不让系统提⽰是否⼈⼯保存

eDispatch(); // 释放Range对象

eDispatch(); // 释放Sheet对象

eDispatch(); // 释放Sheets对象

eDispatch(); // 释放Workbook对象

eDispatch(); // 释放Workbooks对象

(covOptional, covOptional,covOptional);// 关闭Workbook对象

(); // 关闭Workbooks对象

(); // 退出_Application

eDispatch (); // 释放_Application

先写这么多吧,以后再添加!