Delphi功能强大,常被选择用来开发数据库管理软件的首选工具。在开发数据库管理软件时,经常涉及到报表的制作与输出。而Excel又特别擅长于报表和数据处理,且Excel能为Delphi或其他应用程序通过OLE所控制,因此,我们可以通过OLE向Excel传数据,作为数据库管理软件中,制作报表的又一范例。 首先,我们来了解一下Excel的自动化对象,Excel有一个Application对象,一个WorkBook对象,一个Range对象和一个Sheet对象,当然你可以从MicroSoft
Excel Visual
Basic的帮助中了解更多的内容,因此,我们可以从Delphi的应用程序中通过OLE轻松的使用Excel的优点。 由于,Delphi无法对某个OLE方法或属性的调用进行运行时的语法检查。例如:以下这段代码,虽然Delphi可以对它进行成功的编译,但在运行时它却不能被正确的执行,因为在Excel
Basic中没有FormatDriveC这个函数: var V:variant;Begin V:=CreateOleObject(‘Excel.Application’) V.FormatDriveC;End; 以下为一个例子,说明如何使用Delphi将数据表中的数据传送给Excel的。 注意:运行本程序,你的机器中必须已经安装了Excel。 unit
Unit1; interface uses Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,olectnrs, StdCtrls, Buttons, Grids,
DBGrids, ExtCtrls, Db, DBTables,ComObj; type TMainForm =
class(TForm) DataSource1: TDataSource; Table1: TTable; Panel1:
TPanel; DBGrid1: TDBGrid; Panel2: TPanel; BitBtn1:
TBitBtn; BitBtn2: TBitBtn; CheckBox1: TCheckBox; procedure
BitBtn2Click(Sender: TObject); procedure BitBtn1Click(Sender:
TObject); procedure FormShow(Sender: TObject); procedure
FormClose(Sender: TObject; var Action: TCloseAction); procedure
FormCreate(Sender: TObject); private { Private declarations
} public { Public declarations } end; var MainForm:
TMainForm; implementation {$R *.DFM} procedure
TMainForm.BitBtn2Click(Sender: TObject);begin close;end; procedure
TMainForm.BitBtn1Click(Sender: T
ect);var v:variant; s:string; i,j:integer;begin s:="c:\gz\example.xls";
//文件名 if fileexists(s) then
deletefile(s); v:=CreateOLEObject("Excel.Application");
//建立OLE对象 V.WorkBooks.Add; if Checkbox1.Checked
then begin V.Visible:=True; MainForm.WindowState:=wsMinimized; //使Excel可见,并将本程序最小化,以观察Excel的运行情况 end
else begin V.Visible:=False; end; //使Excel窗口不可见 Application.BringToFront;
//程序前置 try try Cursor:=crSQLWait; Table1.DisableControls; For
i:=0 to Table1.FieldCount-1 do //字段数 //注意:Delphi中的数组的下标是从0开始的, //
而Excel的表格是从1开始编号 begin V.Goto("R1"+"C"+IntToStr(i+1));
//Excel的表格是从1开始编号 V.ActiveCell.FormulaR1C1:=Table1.Fields[i].FieldName;//传送字段名 end; j:=2; Table1.First; while
not Table1.EOF do begin For i:=0 to Table1.FieldCount-1 do
//字段数 begin V.Goto("R"+IntToStr(j)+"C"+IntToStr(i+1)); V.ActiveCell.FormulaR1C1:=Table1.Fields[i].AsString;//传送内容 end; Table1.Next; j:=j+1; end; V.ActiveSheet.Protect(DrawingObjects:=True,
Contents:=True, Scenarios:=True);//设置保护 ShowMessage("数据库到Excel的数据传输完毕!");
v.ActiveWorkBook.Saveas(filename:=s);//文件存盘 except
//发生错误时 ShowMessage("没有发现Excel!"); end; finally Cursor:=crDefault; Table1.First; Table1.EnableControls; v.quit;
//退出OLE对象 MainForm.WindowState:=wsNormal; end;end; procedure
TMainForm.FormShow(Sender: TObject);begin Table1.Open;end; procedure
TMainForm.FormClose(Sender: TObject; var Action:
TCloseAction);begin Table1.Close;end; procedure
TMainForm.FormCreate(Sender: TObject);var sl:TStringList;
{字符串列表变量} i:Integer;begin sl:=TStringlist.Create; Session.GetAliasNames(sl);
{取得别名列表} if (sl.IndexOf("EXAMPLE")=-1) then
{判断别名是否存在} begin i:=Application.MessageBox("别名EXAMPLE不存在,现在创建吗?","BDE信息窗口",mb_OKCancel); {增加一个名为EXAMPLE的数据库别名} if
i=IDCANCEL then begin sl.Free; Application.Terminate;
//程序终止 end; Session.AddStandardAlias("EXAMPLE","C:\GZ","Paradox");
//增加别名 Session.SaveConfigFile; {BDE配置文件存盘} end
;end; end.执行本程序,就把数据表中内容输出到C:\GZ下的example.xls文件中了,你可以用Excel对本文件进行编辑等操作。 本程序只要拷贝到C:\GZ下运行即可,程序判断后自动增加数据库别名。 本文只是对Delphi中OLE的简单认识,程序的功能比较简单,当然你可以增加别的内容,以丰富本程序,如:可以增加选取数据库别名,再从别名中选取任何数据表,以增加程序的通用性,或者在程序中使用Excel的函数等。
|