C++ Builder5.0基于OLE技术对Excel 2000的调用(转贴资料并提问)

windtransient 2002-11-26 04:37:33
摘要:利用C++ Builder 5.0可视化的设计工具,强大方便的数据库开发功能和Excel强大的电子表格处理功能,为处理多重报表和复杂报表提供一个良好的方法。
关键词:OLE 自动化客户程序 电子表格
Abstract: The paper provides a good method to make use of powerful database exploitation function of C++ Builder and powerful electron table management function of Excel 2000.
Key words: OLE,automation client programs,electron table

一 引言
C++ builder 5.0是Inprise公司推出的基于C++语言的可视化开发语言,不仅具有新颖的可视化设计工具,还配有数据库引擎,可以通过SQL连接或ODBC访问多种数据库,并具有开发基于Client/Server模式的数据库应用程序的能力。当我们进行数据库软件开发的时候,一般要进行大量报表设计,尤其当涉及到设计多重报表或交叉报表时,我们会觉得力不从心。利用EXCEL强大的电子表格处理功能,可以解决C++ Builder 自带报表工具功能少的缺陷。
C++ Builder调用Excel常用的方法有两种:一种是利用OLE技术调用Excel。OLE(对象的连接和嵌入)是微软公司提出的标准,它提供了一种用源于不同应用程序的信息创建复合文档的强有力方法。第二种是利用ODBC数据库技术调用Excel。第一种方法比较简单,方便,本文讨论的是第一种方法。
二 系统功能要求
随着电子化办公的推广和保险业务的全面开展,账本式的管理方法已不能对数据庞大的电子化设备进行合理有效的管理,这就要求电子化的管理方式,通过计算机和公司局域网实现对设备进行管理。我们开发的电子化管理软件由电子化设备管理数据库、电子化设备耗材管理数据库组成,信息技术管理人员可以对本数据库进行添加、删除、修改、查询等操作,并且可以打印各种查询表格,表格按照EXCEL格式进行打印,并且保存归档。
C++Builder软件自带创建报表工具,如QReport控件。但是相对于EXCEL强大的电子表格处理功能和方便的操作而言,QReport控件功能就显得很苍白。在该管理软件中,我们将查询结果自动生成EXCEL表格,然后在EXCEL环境下进行打印或者保存文件。具体函数实现在下面的段落中进行详细说明,并且都给出示例。
三 函数的实现
要在应用程序中控制Excel2000的运行,首先必须在编制自动化客户程序时使其头文件要包含Comobj.hpp和Utilcls.h。
即:#include<Comobj.hpp>
#include<Utilcls.h>
C++ Builder开发者把Excel自动化对象的功能包装在下面的四个Ole Object Class函数中,应用人员可以很方便地进行调用。
设置对象属性:Variant OlePropertySet(属性名,参数……);
获得对象属性:void OlePropertyGet(属性名,参数……);
调用对象方法:1) Variant OleFunction(函数名,参数……);
2) void OleProcedure(过程名,参数……);
C++ Builder中使用OLE控制Excel2000,必须掌握Excel2000的自动化对象及Microsoft Word Visual Basic帮助文件中的关于Excel的对象、方法和属性。对象是一个Excel元素,属性是对象的一个特性或操作的一个方面,方法是对象可以进行的动作。
1、Excel中常用的对象是:Application,Workbooks,Worksheets等。
(1) 创建应用对象:如:
Variant ex;
ex=Variant::CreateObject ("Excel.Application");
或者 ex=CreateOleObject ("Excel.Application");
(2) 创建工作簿对象:
Variant wb;
wb=ex.OlePropertyGet("ActiveWorkBook");
(3) 创建工作表对象:
Variant sheet;
sheet=wb.OlePropertyGet("ActiveSheet");
(4) 创建区域对象:
Variant range;
range=sheet.OlePropertyGet("Range","A1:A10");
2、常用的属性操作:
(1)新建EXCEL文件:
(a):新建系统模板的工作簿
ex.OlePropertyGet("workbooks").OleFunction("Add") //默认工作簿
ex.OlePropertyGet("workbooks").OleFunction("Add",1) //单工作表
ex.OlePropertyGet("workbooks").OleFunction("Add",2) //图表
ex.OlePropertyGet("workbooks").OleFunction("Add",3) //宏表
ex.OlePropertyGet("workbooks").OleFunction("Add",4) //国际通用宏表
ex.OlePropertyGet("workbooks").OleFunction("Add",5) //与默认的相同
ex.OlePropertyGet("workbooks").OleFunction("Add",6) //工作簿且只有一个表
(b):新建自己创建的模板的工作簿
ex.OlePropertyGet("workbooks").OleFunction("Add","C:\\WINDOWS\\Profiles\\test2\\Application Data\\Microsoft\\Templates\\result.xlt"); // 后面写上模板的完全路径,注意“\\”
(2)打开工作簿:
ex.OlePropertyGet("workbooks").OleFunction("open","路径名.xls")
(3)保存工作簿:
wb.OleFunction("Save"); //表格保存
wb..OleFunction("SaveAs","文件名"); //表格保存为,文件路径注意用“\\”
(4)退出EXCEL:
ex.OleFunction ("Quit");
(5)设置字体:
(a):设置单元格字体
sheet.OlePropertyGet("Cells",1,1).OlePropertyGet("Font").OlePropertySet("Name","隶书");
sheet.OlePropertyGet("Cells",2,3).OlePropertyGet("Font").OlePropertySet("size",28);
(b):设置所选区域字体
range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("size",28); range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("Color",
RGB(0,0,255));
其中参数的设置:
Font---Name : “隶书” //字体名称
----Size : 12 //字体大小
----Color : RGB(*,*,*) //颜色
-----Underline : true/false //下划线
-----Italic: true/false //斜体
(6)单元格的合并:
(a) range1=sheet.OlePropertyGet("Range", "A1:A2"); //A1和A2单元格合并
(b) AnsiString Str="A"+IntToStr(j)+":"+"C"+IntToStr(j);
range1=sheet.OlePropertyGet("Range",Str); //可以用变量控制单元格合并
range1.OleFunction("Merge" , false);
(7)赋值语句:
(a):指定单元格赋值
sheet.OlePropertyGet("Cells",3,6).OlePropertySet("Value",str);
sheet.OlePropertyGet("Cells",j,1).OlePropertySet("Value","共查到记录:"+IntToStr(j-6));
(b):所选区域单元格赋值
range.OlePropertyGet("Cells").OlePropertySet("Value",10);
(c):所选区域行赋值
range.OlePropertyGet("Rows",1).OlePropertySet("Value",1234);
(d):工作表列赋值
sheet.OlePropertyGet("Columns",1).OlePropertySet("Value",1234);
(8)取值语句:
AnsiString abc=sheet.OlePropertyGet("Cells",120,1).OlePropertyGet("Value");
(9)区域选择:
range.OlePropertyGet("Cells").OleFunction("Select");
(10)窗口属性:
(a)显示属性
ex.OlePropertySet("Windowstate",3); //最大化显示
参数 1---------xlNormal //正常显示
2---------xlMinimized //最小化显示
3---------xlMaximized //最大化显示
(b)状态栏属性
ex.OlePropertySet ("StatusBar","您好,请您稍等。正在查询!");
ex.OlePropertySet ("StatusBar", false); //还原成默认值
(c)标题属性:
ex.OlePropertySet("Caption","查询系统");
四 结论和展望
我们已将上面的技术应用于我们为某保险公司做的电子化设备管理软件中,运行良好,使用方便,维护性好,人机界面友好,功能强大,既利用C++ Builder 强大的开发数据库软件的功能,又利用了Excel强大的电子表格处理功能和表格打印功能,使我们的软件具有专业水平。上面的程序在C++Builder5.0和Excel2000下调试通过。

参考文献:
[1] 朱时银 C++ Builder 5.0编程实例与技巧 机械工业出版社
[2] 张晓东 C++ Builder 5程序设计 中国铁道出版社
[3] [美]Ken Getz Mike Gilbert VBA高级开发指南 电子工业出版社

作者介绍:
李胜广 男 山东大学控制科学与工程学院 1977年出生 在读硕士研究生 研究方向:过程控制与自动化装置
联系地址:山东大学南校区控制学院1#信箱
邮政编码:250061
联系电话:0531-2955081-2719
Email:lishengg@263.net

赵秀娟 女 广东五邑大学 1978年生 在读研究生 研究方向:模式识别与智能系统
联系地址:广东五邑大学37#信箱
邮政编码:529020
联系电话:0750-3299348
Email:zhxj780225@263.net


借花献佛,欢迎补充

提问:
本人因工作需要,通过OLE生成了一个EXCEL表,现在想再通过BCB调用OLE实现对该表的分类汇总!!有请各位高手!!
...全文
77 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
windtransient 2002-12-02
  • 打赏
  • 举报
回复
还是没有我想要的答案,推迟二天结贴
solares1 2002-12-01
  • 打赏
  • 举报
回复
gz
zbc 2002-12-01
  • 打赏
  • 举报
回复
先mark,明天再研究一下
windtransient 2002-12-01
  • 打赏
  • 举报
回复
多谢各位,还有更多的建议吗?
周一中午结贴
zangyang 2002-11-30
  • 打赏
  • 举报
回复
比如以下两句话
(a):设置单元格字体
sheet.OlePropertyGet("Cells",1,1).OlePropertyGet("Font").OlePropertySet("Name","隶书");
sheet.OlePropertyGet("Cells",2,3).OlePropertyGet("Font").OlePropertySet("size",28);
vba中原型为
Sheet1.Cells(1,1).Font.Name="隶书"
Sheet1.Cells(2,3).Font.Size="28"
其中Sheet1是对象 Cells是Sheet1的属性(OlePropertyGet),Font是Cells的属性,Name和Size是要设置的Font对象的属性

关键你要清楚excel对象库中的对象,属性和方法,确定以后就可以使用bcb来控制了
你上面的文章不就是很好的实现吗?
Behard 2002-11-29
  • 打赏
  • 举报
回复
先看一看 Office 的关于 VBA 的帮助
windtransient 2002-11-28
  • 打赏
  • 举报
回复
因为在程序里汇总,那条记录就是死的了,而分类汇总可控制汇总条目的显示。
zangyang() :
你说的我知道,我是问怎么样把仿制好的BCB代码写到EXCEL里面,可以介绍一下具体的实现吗??
我们现在把大的需要打印的表格都不做成WEB页,因为一方面如果打印页多的话版面不好控制,另一方面客户可能需要临时修改表格里的内容。所以我们直接把表格生成excel传给客户。
webmin 2002-11-28
  • 打赏
  • 举报
回复
在程序里汇总好,再写到EXCEL里。
warton 2002-11-28
  • 打赏
  • 举报
回复
关注
zangyang 2002-11-27
  • 打赏
  • 举报
回复
在excel中对该表的分类汇总,并把操作纪录成宏,察看宏的vba 代码,仿照成bcb的代码即可
windtransient 2002-11-27
  • 打赏
  • 举报
回复
当然是通过OLE调用EXCEL的分类汇总功能啦
lovelysmart 2002-11-26
  • 打赏
  • 举报
回复
你是指ole技术本身,还是其他
yuanque 2002-11-26
  • 打赏
  • 举报
回复
这是干什么???

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧