DELPHI中四种EXCEL访问技术实现
来源:互联网 发布:最好的摄像头软件 编辑:程序博客网 时间:2024/06/01 08:43
======================================================
注:本文源代码点此下载
======================================================
delphi中四种excel访问技术实现
发布者:秦方钰发布时间:2007-7-24 21:26:00
内容摘要
excel是制作中文报表的一个非常重要的工具,文章介绍并分析了包括ado方式访问excel文件、com方式动态访问excel文件、扩展olecontainer方式访问excel文件、delphi标准组件访问excel文件在内的四种delphi实现的访问excel文件的方法及实现代码。
正文
文字大小:大 中 小
delphi中四种excel访问技术实现
摘 要 excel是制作中文报表的一个非常重要的工具,文章介绍并分析了包括ado方式访问excel文件、com方式动态访问excel文件、扩展olecontainer方式访问excel文件、delphi标准组件访问excel文件在内的四种delphi实现的访问excel文件的方法及实现代码。
关键词 excel文件,ado,com
一、引言
excel在处理中文报表时功能非常强大,excel报表访问也是信息系统开发中的一个重要内容,本文总结以往开发中所用到的几中excel文件访问方法,在实际工作中也得到了很好的验证,本文列举了其中四种方法的实例与读者共享,程序已在windows2000操作系统、offfice2000应用软件和delphi7环境下调试通过。
二、ado方式访问excel文件
ado方式访问excel文件时,将excel文件看作一个等同oracle、ms sqlserver等数据库的一个odbc数据源本文应用示例主要功能是打开excel文件,并实现对excel文件的编辑修改功能。实现过程及主要源代码如下:
1.在工程中新建窗口类tfrmadoexcel,在窗口中定义私有变量类型为tadoconnection的组件conn,加入tadotable组件adotabxls、tdatasource组件dsxls、tdbnavigator组件navxls 、tdbgrid组件gridxls和tbutton组件btnopen,使用btnopen可以打开excel文件,使用navxls可以浏览编辑excel文件数据。
2.编写btnopen组件的onclick事件。需要注意两点,conn组件的extend properties属性要定义成excel 8.0,另外,excel文件中的表单名“人员信息表”作为表明时要写成“[人员信息表$]”。
procedure tfrmadoexcel.btnopenclick(sender: tobject);
//打开excel文件代码
begin
conn:=tadoconnection.create(nil);
conn.connectionstring:='provider=microsoft.jet.oledb.4.0;data source='+extractfiledir(application.exename)+'\persondata.xls;extended properties=excel 8.0;persist security info=false';
conn.loginprompt:=false;
conn.connected:=true;
adotabxls.connection:=conn;
adotabxls.tablename:='['+'人员信息表'+'$]';
adotabxls.active:=true;
dsxls.dataset:=adotabxls;
gridxls.datasource:=dsxls;
except;
freeandnil(conn);
end;
end;
三、com方式动态访问excel文件
com方式动态访问excel文件时,基本方法是利用组件复用技术调用office软件平台提供的com服务组件,充分利用com组件提供的方法操纵excel文件。本文应用示例简单演示了如何利用com技术将dataset数据集的数据输出到excel文件。实现过程及主要源代码如下:
在工程中新建窗口类tfrmcomexcel,在窗口中定义私有变量类型为tadoconnection的组件conn,加入tadotable组件adotabxls和tbutton组件btnopen,使用btnopen可以将数据输出到excel文件。编写btnopen组件的onclick事件代码如下:
procedure tfrmcomexcel.btnopenclick(sender: tobject);
var
xl: variant; //打开excel文件的variant变量
sheet: variant;//指向excel表单的variant变量
recno,i: integer;//记录数据表的当前记录号
begin
try
conn:=tadoconnection.create(nil);
conn.connectionstring:='provider=microsoft.jet.oledb.4.0;data source='+extractfiledir(application.exename)+'\persondata.xls;extended properties=excel 8.0;persist security info=false';
conn.loginprompt:=false;
conn.connected:=true;
adotabxls.connection:=conn;
adotabxls.tablename:='[人员信息表$]';
adotabxls.active:=true;
except
freeandnil(conn);
end;
xl := createoleobject('excel.application');
xl.visible := true;
if fileexists(extractfiledir(application.exename)+'\test.xls') then
begin
xl.workbooks.open(extractfiledir(application.exename)+'\test.xls');
end
else xl.workbooks.add;
xl.workbooks[xl.workbooks.count].worksheets[1].name := 'test';
sheet := xl.workbooks[xl.workbooks.count].worksheets[trim('test')];
recno := 1;
adotabxls.first;
while not adotabxls.eof do
begin
for i := 0 to adotabxls.fieldcount - 1 do
if not (adotabxls.fields[i].datatype in [ftblob, ftgraphic,
ftparadoxole, ftdbaseole, fttypedbinary,
ftreference, ftdataset, ftorablob, ftoraclob, ftinterface,
ftidispatch]) then
begin
sheet.cells.numberformat := '@';
sheet.cells[recno, i+1] := adotabxls.fields[i].asstring;
end;
inc(recno);
adotabxls.next;
end;
try
xl.workbooks[xl.workbooks.count].saveas(extractfiledir(application.exename)+'\test.xls');
except ;
end;
end;
四、扩展olecontainer方式访问excel文件
在使用ole方式访问excel文件时,ole容器在失去焦点会屏蔽正在访问的excel文件操作;另外,使用in_place方式激活ole容器时,会另外打开一个窗口,程序执行显得有些混乱,造成这些问题的主要原因是因为ole容器响应了cm_uideactivate消息,ole容器不能始终保持激活状态。为此可将此消息结果使ole容器始终处于激活状态。解决方法是重载ole容器的cm_uideactivate消息。在程序中临时创建重载后扩展ole容器olecontainerex。代码如下:
type
tolecontainerex=class(tolecontainer)
private
fjh: boolean;
//重写cm_uideactivate消息响应
procedure cmuideactivate(var message: tmessage); message cm_uideactivate;
published
property jh: boolean read fjh write fjh;
end;
// 过程cmuideactivate的代码实现
procedure tolecontainerex.cmuideactivate(var message: tmessage);
begin
if not jh then
inherited;
end;
在使用tolecontainerex时,可采用临时创建的方式,也可进一步封装成可安装组建以便设计期使用。本文应用示例采用了临时创建的方式。在工程中新建窗口类tfrmexoleexcel,并定义public变量 olecon,类型为: tolecontainerex;在窗口中定一个tpanel类型组件panel1和tbutton类型变量btnopen,编写btnopen的click事件,主要源程序代码如下:
procedure tfrmexoleexcel.btnopenclick(sender: tobject);
begin
//创建并显示扩展ole类组件
olecon := tolecontainerex.create(nil);
olecon.parent := panel1;
olecon.align:=alclient;
olecon.allowactivedoc := true;
olecon.allowinplace := true;
olecon.autoactivate := aagetfocus;
olecon.anchors := [aktop,akleft,akright,akbottom];
olecon.visible := true;
olecon.sizemode := smclip;
olecon.createobjectfromfile(extractfiledir(application.exename)+
'\persondata.xls',false);
tolecontainerex(olecon).jh := true;
olecon.setfocus;
end;
五、delphi标准组件访问excel文件
delphi中封装了一组microsoft office自动化对象(automation servers)。它使得我们很容易地把office中的应用程序(excel等)当作一个com应用服务器进行控制。使用这组vcl组件可以在设计时进行属性设置,也可以在运行时动态访问excel。利用标准组件动态访问excel文件时,充分利用vcl组件提供的方法操纵excel文件。本文应用示例简单演示了如何利用vcl组件将dataset数据集的数据输出到excel文件。实现过程及主要源代码如下:
在工程中新建窗口类tfrmstdcntrexcel,在窗口中加入tadoconnection组件adoconnxls,tadotable组件adotabxls、tbutton组件btnopen、texcelapplication组件excelapplication1,texcelworkbook类组件excelworkbook1和texcelworksheet1类组件excelworksheet1,使用btnopen可以将数据输出到excel文件。编写btnopen组件的onclick事件代码如下。
procedure tfrmstdcntrexcel.btnopenclick(sender: tobject);
var
aworksheet: _worksheet;
tmpi,arowindex:integer;
astr:string;
begin
adoconnxls.connectionstring:='provider=microsoft.jet.oledb.4.0;data source='+extractfiledir(application.exename)+'\persondata.xls;extended properties=excel 8.0;persist security info=false';
adoconnxls.loginprompt:=false;
adoconnxls.connected:=true;
adotabxls.connection:=adoconnxls;
adotabxls.tablename:='[人员信息表$]';
adotabxls.active:=true;
if adotabxls.isempty then exit;
try
excelapplication1.connect;
except
messagedlg('你还没有安装microsoft excel,请先安装microsoft excel!',mterror, [mbok], 0);
abort;
end;
excelapplication1.visible[0]:=true;
excelapplication1.caption := '新建excel文件';
excelworkbook1.connectto(excelapplication1.workbooks.add(emptyparam,0));
aworksheet:=excelworkbook1.worksheets.add(emptyparam,emptyparam,emptyparam,emptyparam,0) as _worksheet;
excelworksheet1.connectto(aworksheet);
arowindex:=1;
while not adotabxls.eof do
begin
for tmpi:=0 to adotabxls.fieldcount-1 do
excelworksheet1.cells.item[arowindex,tmpi+1]:=adotabxls.fieldlist[tmpi].asstring;
arowindex:=arowindex+1;
adotabxls.next;
end;
//保存excel文件,并关闭excel应用程序
try
astr:=extractfiledir(application.exename)+'\excel文件.xls';
excelworkbook1.saveas(astr,emptyparam,emptyparam, emptyparam,emptyparam,emptyparam ,
xlnochange ,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,0);
excelworksheet1.disconnect;
excelworkbook1.disconnect;
excelapplication1.disconnect;
adotabxls.active:=false;
adoconnxls.connected:=false;
except
excelworksheet1.disconnect;
excelworkbook1.disconnect;
excelapplication1.disconnect;
adotabxls.active:=false;
adoconnxls.connected:=false;
end;
end;
六、总结
综上所讲,本文分别举例讨论了excel文件访问的几种方法,包括ado、com、扩展olecontainer和delphi标准组件方式。在实际应用过程中,这几种方法也各有特色。ado方式访问excel文件适用于以数据库访问方式维护excel文件,com方式动态访问编程设计与vba访问接口方式相似,此种方法适用于excel文件数据维护和复杂报表输出,扩展ole方式访问excel文件时能够保持excel应用程序的友好界面,delphi标准组件访问方式与com访问方式相似,但delphi对各类接口进行了更加友好的封装,在对com方式不是很长熟悉的情况下,使用这种方式访问和输出数据到excel文件非常有效。笔者结合自己的工作经历简单的总结了几种excel文件的访问,在今后的工作中会进一步深入的研究总结。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
- DELPHI中四种EXCEL访问技术实现
- DELPHI中四种EXCEL访问技术实现
- delphi 用别名的方式访问excel写入数据,实现非标格式报表输出
- 基于Delphi的Excel动态报表技术
- 基于Delphi的Excel动态报表技术
- 用Delphi实现自己的Excel报表
- 用Delphi实现自己的Excel报表
- Delphi 实现 Excel导SQL Server
- 在DELPHI中使用ADO直接访问Excel数据文件
- 在DELPHI中使用ADO直接访问Excel数据文件
- 在DELPHI中使用ADO直接访问Excel数据文件
- DELPHI中使用ADO直接访问Excel数据文件
- Delphi中停靠技术的实现
- Delphi中停靠技术的实现
- Delphi中停靠技术的实现
- Delphi中停靠技术的实现
- Delphi中停靠技术的实现[转]
- POI技术实现EXCEL的导入导出
- Delphi的常量
- 我的ASP.NET AJAX控件——PopupNotificationExtender:实现OWA或Messenger样式的信息提示窗口
- 征服ASP.NET Ajax典型应用 (试读)
- 004Delphi题库系统与试卷生成
- AJAX -简介
- DELPHI中四种EXCEL访问技术实现
- html符号标签
- Jason Koo
- 【转】Delphi XE 随想
- jQuery Ajax 鼠标离开 验证用户名是否存在(简单)
- 关于jQuery在Asp.Net Mvc 框架下Ajax文件上传的实现
- 用vs2005开发比delphi快多了
- 好消息不断——ASP.NET AJAX (Atlas) V1.0 Beta 发布了
- Delphi作为客户端调用.Net写的WCF服务端?