一、引言

EXCEL在处理中文报表时功能非常强大,EXCEL报表访问也是信息系统开发中的一个重要内容,本文总结以往开发中所用到的几中EXCEL文件访问方法,在实际工作中也得到了很好的验证,本文列举了其中四种方法的实例与读者共享,程序已在WINDOWS2000操作系统、OFFFICE2000应用软件和DELPHI7环境下调试通过。

二、ADO方式访问EXCEL文件

ADO方式访问EXCEL文件时,将EXCEL文件看作一个等同Oracle、MS SQLServer等数据库的一个ODBC数据源本文应用示例主要功能是打开EXCEL文件,并实现对EXCEL文件的编辑修改功能。实现过程及主要源代码如下:

.在工程中新建窗口类TfrmADOEXCEL,在窗口中定义私有变量类型为TADOConnection的组件Conn,加入TADOTable组件ADOTabXLS、TDataSource组件DSXLS、TDBNavigator组件NavXLS 、TDBGrid组件GridXLS和TButton组件btnOpen,使用btnOpen可以打开EXCEL文件,使用NavXLS可以浏览编辑EXCEL文件数据。

.编写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

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[].Name := 'test';

Sheet := XL.WorkBooks[XL.WorkBooks.Count].WorkSheets[Trim('test')];

RecNo := ;

ADOTabXLS.First;

while not ADOTabXLS.Eof do

begin

for I :=  to ADOTabXLS.FieldCount -  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+] := 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], );

Abort;

End;

ExcelApplication1.Visible[]:=True;

ExcelApplication1.Caption := '新建EXCEL文件';

ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,));

aWorksheet:=ExcelWorkbook1.WorkSheets.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam,) as _WorkSheet;

ExcelWorkSheet1.ConnectTo(aWorksheet);

aRowIndex:=;

while not ADOTabXLS.Eof do

begin

for tmpI:= to ADOTabXLS.FieldCount- do

ExcelWorksheet1.Cells.Item[aRowIndex,tmpI+]:=ADOTabXLS.FieldList[tmpI].AsString;

aRowIndex:=aRowIndex+;

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,);

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文件非常有效。

DELPHI中四种EXCEL访问技术实现的更多相关文章

  1. [转]C++中四种类型转换符的总结

    C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression)    reinterpret_cast操 ...

  2. thinkphp四种url访问方式详解

    本文实例分析了thinkphp的四种url访问方式.分享给大家供大家参考.具体分析如下: 一.什么是MVC thinkphp的MVC模式非常灵活,即使只有三个中和一个也可以运行. M -Model 编 ...

  3. [翻译]比较ADO.NET中的不同数据访问技术(Performance Comparison:Data Access Techniques)

    Performance Comparison: Data Access Techniques Priya DhawanMicrosoft Developer Network January 2002 ...

  4. thinkPHP四种URL访问方式(二)

    原文:thinkPHP四种URL访问方式(二) 四.url的4种访问方式      1.PATHINFO 模式 -- (重点) http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/ ...

  5. c++ --> c++中四种类型转换方式

    c++中四种类型转换方式   c风格转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少缺点, 1)它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向 ...

  6. C#中四种常用集合的运用(非常重要)

    C#中4个常用的集合 1.ArrayList ArrayList类似于数组,有人也称它为数组列表.ArrayList可以动态维护,而数组的容量是固定的. 它的索引会根据程序的扩展而重新进行分配和调整. ...

  7. java中四种引用类型(对象的强、软、弱和虚引用)

    对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2 ...

  8. 四种会话跟踪技术以及jstl介绍

    四种会话跟踪技术 page:代表与一个页面相关的对象和属性.一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示.这既包括 ...

  9. httpClient Post例子,Http 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete

    httpclient post方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //----1. HttpPost request = new HttpPost(ur ...

随机推荐

  1. iOS 常用图尺寸 汇总

    iCON 准备一张1024x1024尺寸的图,打开链接 http://www.atool.org/ios_logo.php 在线批量生成各种尺寸的图片 启动图LaunchImage 640x960 2 ...

  2. openWRT自学---对官方的开发指导文档的解读和理解 记录1:编译一个package

    针对的是:http://kamikaze.openwrt.org/docs/openwrt.html#x1-390002 1.If you want, you can also modify the ...

  3. PHP资源,库,工具大全

    内容包括:库.框架.模板.安全.代码分析.日志.第三方库.配置工具.Web 工具.书籍.电子书.经典博文等等. 大家可以搜索其它语言,如awesome-java的https://github.com/ ...

  4. hdu3579(线性同余方程组)

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. Mybatis中的关联映射和查询

    一.商品订单数据模型 1.数据表 这里定义了四个表,分别表示用户,商品,订单,和订单详情. 用户表user CREATE TABLE `user` ( `id` int(11) NOT NULL AU ...

  6. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its 错误解决办法

    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary log ...

  7. iOS 添加震动效果

    开发过程中,有时候会碰到点击按钮或者某个动画会配合震动效果:下面介绍iOS开发过程中的震动添加: 导入:#import <AudioToolbox/AudioToolbox.h> 在需要出 ...

  8. python(pytest)+allure+jenkins 实现接口自动化的思路

    效果图镇楼: 上述各模块作用: python(pytest): 1:用于读测试用例(本次用例写在csv文件中) 2:环境配置相关 3:提取1中的测试数据,组成请求体 4:发送请求 5:获取结果 6:断 ...

  9. Webpack探索【7】--- sourceMap、自动构建刷新功能详解

    本文主要讲sourceMap.自动构建刷新功能.

  10. Django 之ModelForm

    1.Form表单的回顾 Model - 数据库操作 - 验证 class A(MOdel): user = email = pwd = Form - class LoginForm(Form): em ...