用quickreport 建立报表来打印查询结果吧

解决方案 »

  1.   

    在Delphi中,编程人员利用Quick Report控件可以方便地设计和实现静态报表,但对动态报表的制作仍有不便之处。如制作一个列表式报表时,如何动态调节每一列的宽度?由于报表在预览情况下不能修改,只能在预览前将宽度设定好,因此,如何比较方便地预先设定宽度,就成了一个需要解决的问题。 
    分析问题 
    首先可想到一种笨办法,就是在确定报表中需要显示的字段后,对每一个字段的宽度赋予一个初始值(比如80),对于需要调整的字段再通过编辑框进行输入修改。这样的确可以达到预期目的,但由于不直观,可能需要多次调整,影响了效率和方便性。 
    笔者通过实践,利用DBGRID解决了这个问题。由于是制作与数据库相关的报表,其报表记录肯定需要通过一个SQL语句来产生,那么这些记录就可以先显示在一个DBGRID中。由于DBGRID的各列宽度可以动态调节,那么将适当的DBGRID的各列宽度赋给报表中的各列,就一次性达到了我们预期的目的,而且操作非常方便。 
    设置窗体 
    建立两个窗体mainform和repform。在mainform上放置edit1、datasource1、query1、dbgrid1、button1(caption为“提取数据”)和button2(caption为“预览报表”),将datasource1.dataset设定为query1,将dbgrid1的datasource设定为datasource1。在repform上放置Quickrep1,并至少将Quickrep1.bands.hascolumnband和Quickrep1.bands.hasdetailband设为true。 
    编程实现 
    运行时,在edit1中输入正确的 SQL语句。点击“提取数据”按钮,将相应记录显示在 dbgrid1中。具体的程序代码如下: 
    procedure Tmainform.button1click(sender:TObject); 
      var s:string; 
      begin 
       s:=edit1.text; 
       with query1 do 
       begin 
        close; 
        sql.clear; 
        sql.add(s); 
        open; 
       end; 
      end; 
    点击“预览报表”按钮,可以看到形成的报表,如果对宽度摆放还有些不满意,可以关闭预览窗口后重新调整。具体的程序代码如下: 
    procedure Tmainform.button2click(sender:TObject); 
    var leftv,i:integer; //leftv为报表起始位置 
    cheader:Tqrlabel; 
    detailtext:Tqrdbtext; 
    ……  
      begin 
       leftv:=0; 
       for i:=0 to dbgrid1.columns.Count-1 do 
        begin 
         cheader:=TQrlabel.Create(repform); 
    with repform.cheader do 
    begin 
    parent:=repform.columnheaderband1; 
    caption:=dbgrid1.columns[i].fieldname; 
    width:=dbgrid1.columns[i].width; 
    height:=repform.columnheaderband1.height; left:=leftv+2; 
    top:=5; 
    end; 
    ……//在leftv 处画表格竖线 
    leftv:=dbgrid1.columns[i].width+leftv; 
    end; 
    ……//画表头栏边框。起始位为0,总宽度为leftv,也就是dbgrid1的各列宽度之和 
    leftv:=0;  
        //显示记录内容 
    for i:=0 to dbgrid1.columns.Count-1 do  
    begin 
    detailtext:=TQrdbtext.create(repform); 
    with repform.detailtext do 
    begin 
    parent:=repform.detailband1; 
    dataset:=query1; 
    datafield:=dbgrid1.columns[i].fieldname; 
    width:=dbgrid1.columns[i].width; 
    height:=repform.detailband1.height; 
    left:=leftv+2; 
    top:=5; 
    end; 
    ……//在leftv 处画表格竖线 
    leftv:=dbgrid1.columns[i].width+leftv; 
    end; 
    ……// 画明晰栏边框。 
    repform.quickrep1.preview();//报表预览 
      end; 
    第二种方法:OLE+Excel 已经调试通过!
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Grids, DBGrids, Db, DBTables, Excel97, OleServer;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Button5: TButton;
        Edit1: TEdit;
        DataSource1: TDataSource;
        Query1: TQuery;
        DBGrid1: TDBGrid;
        ExcelWorksheet1: TExcelWorksheet;
        ExcelWorkbook1: TExcelWorkbook;
        ExcelApplication1: TExcelApplication;
        procedure Button5Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button5Click(Sender: TObject);   
    begin
    Query1.Close;
     Query1.SQL.Clear;
     Query1.SQL.Text :=Edit1.Text ;
     Query1.Open;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    i,row,column:integer;
    begin
    Try
    ExcelApplication1.Connect;
    Except
    MessageDlg('Excel may not be installed',
    mtError, [mbOk], 0);
    Abort;
    End;
    ExcelApplication1.Visible[0]:=True;
    ExcelApplication1.Caption:='Excel Application';
    ExcelApplication1.Workbooks.Add(Null,0);
    ExcelWorkbook1.ConnectTo
    (ExcelApplication1.Workbooks[1]);
    ExcelWorksheet1.ConnectTo
    (ExcelWorkbook1.Worksheets[1] as _Worksheet);
    Query1.Open;
    row:=1;
    While Not(Query1.Eof) do
    begin
    column:=1;
    for i:=1 to Query1.FieldCount do
    begin
    ExcelWorksheet1.Cells.Item[row,column]:
        =Query1.fields[i-1].AsString;
    column:=column+1;
    end;
    Query1.Next;
    row:=row+1;
    end;end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    ExcelWorksheet1.PrintPreview;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
    ExcelWorksheet1.PrintOut;
    end;procedure TForm1.Button4Click(Sender: TObject);
    begin
    ExcelApplication1.Disconnect;
    ExcelApplication1.Quit;
    end;end.