DELPHI中四种EXCEL访问技术实现
一、引言
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访问技术实现的更多相关文章
- [转]C++中四种类型转换符的总结
C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression) reinterpret_cast操 ...
- thinkphp四种url访问方式详解
本文实例分析了thinkphp的四种url访问方式.分享给大家供大家参考.具体分析如下: 一.什么是MVC thinkphp的MVC模式非常灵活,即使只有三个中和一个也可以运行. M -Model 编 ...
- [翻译]比较ADO.NET中的不同数据访问技术(Performance Comparison:Data Access Techniques)
Performance Comparison: Data Access Techniques Priya DhawanMicrosoft Developer Network January 2002 ...
- thinkPHP四种URL访问方式(二)
原文:thinkPHP四种URL访问方式(二) 四.url的4种访问方式 1.PATHINFO 模式 -- (重点) http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/ ...
- c++ --> c++中四种类型转换方式
c++中四种类型转换方式 c风格转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少缺点, 1)它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向 ...
- C#中四种常用集合的运用(非常重要)
C#中4个常用的集合 1.ArrayList ArrayList类似于数组,有人也称它为数组列表.ArrayList可以动态维护,而数组的容量是固定的. 它的索引会根据程序的扩展而重新进行分配和调整. ...
- java中四种引用类型(对象的强、软、弱和虚引用)
对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2 ...
- 四种会话跟踪技术以及jstl介绍
四种会话跟踪技术 page:代表与一个页面相关的对象和属性.一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示.这既包括 ...
- 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 ...
随机推荐
- 三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略
转自:http://blog.csdn.net/gao5528/article/details/6256119 三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略(K5系列产品篇) 一年 ...
- ubuntu openfire Server install
1.首先登录到ubuntu server.在安装openfire 服务器之前,先确保你的系统已经更新到最新.然后输入下面的命令,一行一行执行,最后安装可用的更新 sudo apt-get update ...
- 【安装.net framework4.0】之安装失败,“安装时发生严重错误”
在网上查了很多资料都说改什么文件名和注册表什么的,根本没用,后来查到一篇文章,提供了下面的解决办法: 地址:<Microsoft .NET Framework 4.0安装时发生严重错误 无法安装 ...
- 【Atheros】网卡驱动速率调整算法概述
我做网卡驱动,最主要的内容就是设计和改进速率调整算法,随着802.11协议簇的新标准越来越多,速率越来越高,调制编码方式也越来越多,一般来说,速率越高越可能丢包,速率越低越稳定,这是整体状况,但不是必 ...
- The following classes could not be found: - android.support.v7.internal.widget.ActionBarOverlayLayout
升级android-studio之后,出现这个问题,一直解决不了. 无意间,在布局文件的Design界面中,修改原来的AppTheme为Base.Theme.AppCompat就修复了此问题. 暂时不 ...
- zookeeper的python客户端安装
项目中使用了python,需要使用到zookeeper的功能,这里记录一下安装过程. 内核版本:2.6.32 发行版:CentOs-6.6 64bit 1.由于python客户端依赖c的客户端所以要先 ...
- 承载(Host)通用语言执行时
承载(Host)通用语言执行时(CLR) 还有一种使用COM 的方法是是把须要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起.开成自己定义的承载通用语言执行时.通用语言执行时就是 C++ ...
- 嵌套SQL语句訪问DB2中SQLCA的调用技巧
在IBM的关系型数据库产品DB2中,使用SQL Communication Area(SQLCA)将程序中嵌套的SQL语句执行情况返回给程序. 在程序中有针对性地对SQLCA实施调用,可对程序中各类S ...
- 【CodeM初赛B轮】F 期望DP
[CodeM初赛B轮]F 题目大意:有n个景点,m条无向边,经过每条边的时间需要的时间是li,在第i个景点游览花费的时间是ti,游览完第i个景点可以获得的满意度是hi.你的总时间为k,起初你等概率的选 ...
- android菜鸟学习笔记22----ContentProvider(二)ContentObserver的简单使用
现在有这样一个应用A通过ContentProvider提供自己的数据给其他应用,应用B通过ContentResolver获取应用A中提供的数据,并将其展示在ListView中,而应用C通过Conten ...