OLE技术实现“中国式”报表
OLE技术实现“中国式”报表
——Delphi外调Excel 实现特殊结构表格打印
Windows环境下的应用程序快速开发工具Delphi,其可视化的优势已被大多数的程序所共识,开发Windows应用程序有其得天独厚VCL资源,对数据库应用程序的开发也不例外。其TTable组件和TDataSource组件提供了数据库和其他组件的通信接口,可很方便的对数据库进行各种操作(查找,添加,修改,删除等);TQuery组件可直接访问数据库,并可通过其SQL属性,既方便有灵活的对数据库里的不同数据表进行操作;TDBGrid组件可显示数据记录,也可以对记录进行操作;TQuickRep组件可对数据表格进行打印报表(有打印预览,打印机设置等功能),还有其它很多的数据组件,这些组件让您只需写少量的代码就能完成很强大的功能,在此就不提了。下面就介绍Delphi外调Excel 实现特殊结构表格打印的技术。
其实TQuickRep组件的功能是很强的,但在实际的工作中有时会遇到结构复杂的表格(我称其为“中国式”的表格)需要打印,这样TQuickRep组件就很难胜任。记得我当时处理这类表格是先考虑TQuickRep组件,然后又考虑第三方提供的各类组件,其结果总是不那么令人如意,几番周折后才考虑到OLE技术。下面用一个简单的例子来说明OLE技术的威力,其制作步骤如下:
1、 设计应用程序窗口
窗口如上图示,所有组件用其默认名称(可看下列源码),将DBGrid1添加8个Columns,相应的标题名称如上图示,将Query1的DatabaseName设为“D:\”(因为我将本例的数据表格放在D盘根目录下),右击Query1组件,在下拉菜单中选“SQL Builder…”设置Query1的SQL属性,还有就是将Query1,DataSource1和DBGrid1连在一起以便能实现相互通信。
2、 Excel表格
下图是本例子中要用到的Excel表格(可能您会认为没有什么特殊,主要是表达其意)
先画好表格中比较特殊的地方,其中的数据可通过程序填充,并将该表格存到合适的位置。
3、 编写程序
下面是程序源码:
unit UntMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables, StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
BitBtn1: TBitBtn;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
ComboBox1: TComboBox;
BitBtn2: TBitBtn;
Query1: TQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure BitBtn2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
Uses
ComObj; // CreateOLEObject函数所在的单元
{$R *.DFM}
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Query1.Open; //显示数据记录
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.Add(张三); //初始化下拉选择框
ComboBox1.Items.Add(李四);
ComboBox1.Items.Add(王五);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
Const
{用于设置Excel单元格的地址}
Rang:array[1..26] of String= (A,B,C,D,E,F,G,H,I,J,K,L,M,N);
{动态添加Query的SQL属性}
SQLStr=SELECT BookID, BookName, BookAuthor, BookPublish, BookPublishDate, BookGetInDate, BookPrice, BookPages FROM "d:\\BookInfo.DB" Bookinfo;
Var
XlsPrint:Variant; // Variant型变量
I,J:integer;
cellposition:string; //设置Excel单元格地址,如A3,G7等
begin
XlsPrint:=CreateOLEObject(Excel.Application); //调用Excel应用程序
XlsPrint.WorkBooks.Open(D:\NewBook); //打开第二步创建的Excel工作表
Query1.Close; //重新设置打印字段
Query1.SQL.Clear;
Query1.SQL.Add(SQLStr);
Query1.Open;
Query1.First; //指到首记录
for I := 0 to DBGrid1.FieldCount-1 do
{初始化标题}
begin
cellposition:=Rang[I+1]+3;
XlsPrint.Range[cellposition].Value:=DBGrid1.Columns[i].Title.Caption;
End;
{特殊情况需要填充Excel的指定位置}
XlsPrint.Range[G1].Value:=Edit1.Text;
XlsPrint.Range[G2].Value:=ComboBox1.Text;
{将Query1中的数据传到Excel表格中}
for J:=0 to Query1.RecordCount-1 do
begin
for I :=0 to Query1.FieldCount-1 do
begin
cellposition:=Rang[I+1]+IntToStr(J+4); //设置要填充的单元格地址
XlsPrint.Range[cellposition].Value:=Query1.Fields[I].AsString; //数据传送
end;
Query1.Next; //填充下一个记录
end;
XlsPrint.application.Visible:=True; //使Excel应用程序可见
XlsPrint.activesheet.printpreview; //打印预览表格
end;
end.
4、 查看结果
程序运行结果如下图
填充数据以后的Excel如下图
最后,需要说明一点,调用CreateOLEObject函数将返回一个称为Idispatch的COM对象,函数参数就是指定想得到的COM对象名称,此例参数为Excel.Application,就得到一个主Excel Automation对象。如果熟悉注册表,你可以在那里找到“Excel.Application”字符串。例子中定义了XlsPrint变量,它实际就像VBA(Visual Basic Application)中的Application对象,其下一个对象称为WorkBooks,在下一个对象为WorkSheets和Charts。具体情况可参见VBA的相关书目。本例在Windows98/2000,Delphi4.0/5.0(C/S)版下调试通过,稍加改动即可在BCB中运行。有兴趣的朋友可给我发Email: [email protected]发布人:jollier 来自: