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^)/
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 香港购物超5000被海关扣怎么办 浅色衣服被深色衣服染色了怎么办 金立手机微信不能发语音怎么办 吃鸡买的账号密码邮箱忘记了怎么办 氩弧焊枪管带里进水了怎么办 绝地求生穿头盔的时候连衣帽怎么办 开车不小心把光缆线给挂断了怎么办 脚刺到了生锈钢钉没打针怎么办 一加3t背壳螺丝掉了怎么办 30万美金美金中国被扣怎么办 电脑使用迅雷变的很卡怎么办 优盘拷贝过程中失去优盘路径怎么办 用百度云上传视频文件太慢了怎么办 网易云音乐云盘电脑上传很慢怎么办 路由器的宽带账号密码忘记了怎么办 蚂蚁邦路由器管理密码忘记了怎么办 红米2a刷机失败怎么办 小米手机开机图案锁忘记了怎么办 小米6进水无限闪屏开机重启怎么办 红米手机一直卡在开机画面怎么办 红米4卡在开机画面怎么办 红米手机一直在开机画面怎么办 红米手机一直跳开机画面怎么办 红米note3锁屏密码忘记怎么办 红米手机忘记锁屏密码怎么办 红米4锁屏密码忘了怎么办 红米note忘记锁屏密码怎么办 红米note2锁屏密码忘了怎么办 机打发票抬头名字少写一个字怎么办 卷式发票名字写错了怎么办 发票丢失了销售方不给补手续怎么办 总是把单词归不成句孑怎么办 白色踏板摩托车把漆刮了怎么办 苹果手机用流量缓冲很难怎么办 谷歌浏览器安卓手机版打不开怎么办 怀孕四个月检查高型半氨酸高怎么办 猎豹cs9怎么打不开车门怎么办 孩子在学校被老师冤枉打板子怎么办 么司福利体检暗地查乙肝怎么办 上体育课时被老师罚了腿疼怎么办 义务兵学技术不好班长打他怎么办