当前位置:Linux教程 - Linux - OLE技术实现“中国式”报表

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 来自: