DELPHI中四种EXCEL访问技术实现

本文详细介绍了 Delphi 中的四种 Excel 访问技术,包括 ADO 方式、COM 方式、扩展 OLE 容器方式以及 Delphi 标准组件方式。每种方法都提供了实现代码和具体应用实例,旨在帮助开发者更好地理解和使用这些技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


======================================================
注:本文源代码点此下载
======================================================

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^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值