以前有很多这类帖子,找找呀。
你可以自己写程序,或者试一试Ehlib等第三方控件,转贴一篇例子给你:
interfaceuses Windows, SysUtils, Messages, Classes, Graphics, Controls,
  StdCtrls, ExtCtrls, Forms, Quickrpt, QRCtrls;type
  TQRBRep1 = class(TQuickRep)
    QRBand1: TQRBand;
    detailBand1: TQRBand;
    QRLabel1: TQRLabel;
    QRGroup1: TQRGroup;
    QRMemo1: TQRMemo;
    procedure QRBRepBeforePrint(Sender: TCustomQuickRep;
      var PrintReport: Boolean);
    procedure QRBRepNeedData(Sender: TObject; var MoreData: Boolean);
  private
  public
  end;var
  QRBRep1: TQRBRep1;
  QRLabel: array of array of TQRLabel;
  QRShape: array of array of TQRShape;
  xzjlst: integer;
implementationuses QRBank1, Unit1;{$R *.DFM}
procedure TQRBRep1.QRBRepBeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
var
i,j: integer;
begin{
  SetLength(QRLabel,xzjlsn+2,8);  //xzjlsn为全局变量,为要打印的StringGrid行数
  SetLength(QRShape,xzjlsn+2,8);
}  SetLength(QRLabel,22+1,8);  // xzjlsn为StringGrid的行数,而此处应该是生成每页打印的行数,
  SetLength(QRShape,22+1,8);  // 应该是22行,另加一个标题行  xzjlst:=1;                  // xzjlst是StringGrid的当前打印行号  for j:=0 to 22 do           // 见上
  begin
    for i:=0 to 7 do
      begin
        QRShape[j,i]:=TQRShape.Create(QRBRep1);
        with QRShape[j,i] do
          begin
            Parent:=DetailBand1;
            Left:=i*92;
            Top:=j*24;
            Height:=25;
            Width:=93;
            Enabled:=True;
            Visible:=True;
          end;
        QRLabel[j,i]:=TQRLabel.Create(QRBRep1);
        with QRLabel[j,i] do
          begin
            Parent:=DetailBand1;
            Left:=i*92+2;
            Top:=j*24+6;
            Height:=16;
            Width:=90;
            Alignment:=TaCenter;
            AutoSize:=True;
            Caption:='';
            Enabled:=True;
            Visible:=True;
          end;
        end;
{   
  ******************
      这里加入 
      if (j<>0) and ((j mod 22)=0) then
      quickRep1.NewPage; //运行时出现非法调用错误
    ****************************
}
      end;
  QRLabel[0,0].Caption:='序号';
  QRLabel[0,1].Caption:='帐号';
  QRLabel[0,2].Caption:='销帐日期';
  QRLabel[0,3].Caption:='话费月份';
  QRLabel[0,4].Caption:='话费';
  QRLabel[0,5].Caption:='上次余额';
  QRLabel[0,6].Caption:='本次余额';
  QRLabel[0,7].Caption:='滞纳金';
  xzjlst:=1;
end;procedure TQRBRep1.QRBRepNeedData(Sender: TObject; var MoreData: Boolean);
var
  i,j: Integer;
begin
  if xzjlst > xzjlsn then  // xzjlsn为全局变量,为要打印的StringGrid行数
    MoreData:=False
  else
  begin
    MoreData:=True;
    for j:=1 to 22 do  // 同上 
    begin
      for i:=0 to 7 do
      begin 
        if xzjlst > xzjlsn then 
          QRLabel[j,i].Caption := ''
        else
          QRLabel[j,i].Caption:=QRBankForm.StringGrid1.Cells[i,xzjlst]; // 打印当前行对应的数据
      end;
    end; 
    Inc(xzjlst);
  end;
end;
end;
end.

解决方案 »

  1.   

    以前我用StringGrid打印的时候是很复杂的,而且,总是导入的一个临时表里,才进行打印,不知道你有没有什么好的办法?如果有的话,呵呵,给我说一声:)
      

  2.   

    试试下面的方法,可能有些笨但是还是可以解决问题的。
    大致的思路就是:
    在detail band中,先放n(n等于你要显示的字段的个数)个TQRShape,并把shape,属性设置为tangle;
    然后在TQRShape中放入你的TQRDBText,调整他们之间的位置,使TQRDBText位于QRShape的中间,对齐了QRShape,调整detailband的高度使得其高度和qrshape一致。然后就可以模拟出网格了。
    不过这是一个非常精细的活,需要一定的耐心。
    让各位见笑了。
      

  3.   

    多创建一个表
    把stringgrid的值全部添加到这个表里    with frmwsqkprn1.ADOQuery1 do
         begin
            close;
            sql.Clear;
            sql.Add('delete  from wspbqk1');
            execsql;
            close;
            sql.Clear;
            sql.Add('select * from wspbqk1');
            open;
         end;
         with frmwsqkprn1.ADOQuery1 do
          begin
           for i:=1 to frmwsqkliul.StringGrid1.RowCount-1 do
             begin
                append;
                fieldbyname('bianhao').asstring:=trim(stringgrid1.Cells[0,i]);
                fieldbyname('pbtime').asstring:=trim(stringgrid1.Cells[1,i]);
                fieldbyname('zdefen').asstring:=trim(stringgrid1.Cells[2,i]);
                fieldbyname('mingci').asstring:=trim(stringgrid1.Cells[3,i]);
                post;
             end;
            updatebatch;
            first;
          end;然后用这个表关联报表
    搞定
      

  4.   

    to  ihihonline(小小-&gt;充电中……) :我的显示结果如下所示,
    你说这种是建立表好呢还是不的好?你说的方法我想过,根本就不行,
    后来才换这种的,现在我已经把stringgrid中的内容导入到excel中
    如果要求不高,可以了,但是我想能够不导入excel也能打印!
                         计算机学院
    领队:XXXX
    教练:XXXX
    男运动员:XXXX XXXX XXXX XXXXX XXXXX
              XXXX XXXX XXXX XXXXX XXXXX
    女运动员:XXXX XXXX XXXX XXXXX XXXXX
              XXXX XXXX XXXX XXXXX XXXXX
                        管理学院
    领队:XXXX
    教练:XXXX
    男运动员:XXXX XXXX XXXX XXXXX XXXXX
              XXXX XXXX XXXX XXXXX XXXXX
    女运动员:XXXX XXXX XXXX XXXXX XXXXX
              XXXX XXXX XXXX XXXXX XXXXX
      

  5.   

    TO cqwty(笨小孩) 
    不好意思,你试过了吗?
    你看,这个表是存储的StringGrid里的内容,根本就不是按固定的字段格试走的,而表里边的字段名只是一个意义上的像征,也就是说,它有可能字段名是姓名,但是实际上存储的却是"管理学院"几个字,所以说,它一切都是以StringGrid服务的,而不是常规上的表;这和你导入Execl的区别是什么?是时间上的节约和资源上的节约,不过,你自己也可以自己新的方法;祝你成功,嗯,如果有好的方法,请给我说一声,谢谢; 
    [email protected]//不过,这种方法的确很麻烦,特别是在多次的导入;
      

  6.   

    to ihihonline(小小-&gt;充电中……) :呵呵,我试过,不行的,
    我导入excel的原因是为了方便打印,我已经实现了上面的显示结果,
    这种显示结果是满足要求的,现在就是打印的问题,直接打印stringgrid
    的话,有点费劲,现在我还没有找到好的办法打印,所以就先导入
    到excel,这个是为了打印而做的。由于我做的这个毕业设计是学校
    要使用的一个系统,所以尽量不使用第三方控件!
      

  7.   

    OK,我是服了你了;
    你说不行就不行吧;但是想知道为什么不行?
    我用这段程序N次了,你的提法信息是什么?我给你调式
      

  8.   

    如果你能隐式的调用EXCEL的话,那么的确很好,如果不是的话,就有点多有一举,而表你也可以在程序中建 ,对于用户完全是个隐式的过程,其中字段都可以是char类型的(保存数字),没有主键,如果有的话,让其自动增加,删除时用delete
      

  9.   

    to  ihihonline(小小-&gt;充电中……) :谢谢你,我终于搞定了,也就是你说的方法,是我想复杂了,呵呵,以后多多指点阿!