怎么样实现打印stringGrid中的数据

怎么样实现打印stringGrid中的数据 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061225135512119.html
怎么样才能实再打印stringGrid中的数据啊,那位高人指点一下,谢谢了

用PRINTER对象!

能不能详细的说一下啊  
   
   
 

给你代码  
  ===========================  
  打印StringGrid内容  
  Procedure   TACDListerMain.PrintTable;  
  Var  
  margins:   TRect;  
  spacing:   Integer;  
  Cols:   TList;  
  Dlg:   TPrintProgressDlg;  
   
  Procedure   SetColumnWidth;  
  Var  
  i,   k,   w:   Integer;  
  Begin  
      Printer.Canvas.Font.Style   :=   [   fsBold   ];  
      For   i   :=   0   To   Pred(   Grid.ColCount   )   Do  
       
      Cols.Add(   Pointer(   Printer.Canvas.TextWidth(   Grid.Cells[   i,0   ]   )));  
       
      Printer.Canvas.Font.Style   :=   [];  
      For   i   :=   1   To   Pred(   Grid.RowCount   )   Do  
      For   k   :=   0   To   Pred(   Grid.ColCount   )   Do   Begin  
          w:=   Printer.Canvas.TextWidth(   Grid.Cells[   k,   i   ]   );  
          If   w   >   Integer(   Cols[   k   ]   )   Then  
          Cols[   k   ]   :=   Pointer(   w   );  
          End;   {   For   }  
           
          w   :=   2   *   Printer.Canvas.Font.PixelsPerInch   div   3;  
          margins   :=  
          Rect(   w,   w,   Printer.PageWidth-w,   Printer.PageHeight   -   w   );  
          spacing   :=   Printer.Canvas.Font.PixelsPerInch   div   10;  
           
          w   :=   0;  
          For   i   :=   0   To   Pred(cols.Count)   Do  
          w   :=   w   +   Integer(   cols[   i   ]   )   +   spacing;  
          w   :=   w   -   spacing;  
          If   w   >   (margins.right-margins.left   )   Then   Begin  
              w   :=   w   -   (margins.right-margins.left   );  
              cols[   cols.Count-2   ]   :=  
              Pointer(   Integer(   cols[   cols.Count-2   ]   )   -   w   );  
              End;   {   If   }  
               
              w:=   0;  
              For   i   :=   0   To   Pred(cols.Count)   Do  
              w   :=   w   +   Integer(   cols[   i   ]   )   +   spacing;  
              margins.right   :=   w   -   spacing   +   margins.left;  
              End;   {   SetColumnWidth   }  
               
              Procedure   DoPrint;  
              Var  
              i:   Integer;  
              y:   Integer;  
              Procedure   DoLine(lineno:   Integer);  
              Var  
              x,   n:   Integer;  
              r:   TRect;  
              th:   Integer;  
              Begin  
                  If   Length(Grid.Cells[0,lineno])   =   0   Then   Exit;  
                   
                  x:=   margins.left;  
                  With   Printer.Canvas   Do   Begin  
                          th   :=   TextHeight(   '膟'   );  
                          For   n   :=   0   To   Pred(   Cols.Count   )   Do   Begin  
                              r   :=   Rect(   0,   0,   Integer(Cols[   n   ]),   th);  
                              OffsetRect(   r,   x,   y   );  
                              TextRect(   r,   x,   y,   Grid.Cells[   n,   lineno   ]   );  
                              x   :=   r.right   +   spacing;  
                              End;   {   For   }  
                              End;   {   With   }  
                              y   :=   y   +   th;  
                              End;   {   DoLine   }  
                              Procedure   DoHeader;  
                              Begin  
                                  y:=   margins.top;  
                                  With   Printer.Canvas   Do   Begin  
                                          Font.Style   :=   [   fsBold   ];  
                                          DoLine(   0   );  
                                          Pen.Width   :=   Font.PixelsPerInch   div   72;  
                                          Pen.Color   :=   clBlack;  
                                          MoveTo(   margins.left,   y   );  
                                          LineTo(   margins.right,   y   );  
                                          Inc(   y,   2   *   Pen.Width   );  
                                          Font.Style   :=   [   ];  
                                          End;   {   With   }  
                                          End;   {   DoHeader   }  
                                          Begin  
                                              y:=   0;  
                                              For   i   :=   1   To   Pred(   Grid.RowCount   )   Do   Begin  
                                                  Dlg.Progress(   i   );  
                                                  Application.ProcessMessages;  
                                                  If   FPrintAborted   Then   Exit;  
                                                   
                                                  If   y   =   0   Then  
                                                  DoHeader;  
                                                  DoLine(   i   );  
                                                  If   y   >=   margins.bottom   Then   Begin  
                                                      Printer.NewPage;  
                                                      y:=   0;  
                                                      End;   {   If   }  
                                                      End;   {   For   }  
                                                      End;   {   DoPrint   }  
                                                       
                                                      Begin  
                                                          FPrintAborted   :=   False;  
                                                          Dlg   :=   TPrintProgressDlg.Create(   Application   );  
                                                          With   Dlg   Do  
                                                              try  
                                                                  OnAbort   :=   PrintAborted;  
                                                                  Display(   cPrintPreparation   );  
                                                                  SetProgressRange(   0,   Grid.RowCount   );  
                                                                  Show;  
                                                                  Application.ProcessMessages;  
                                                                  Printer.Orientation   :=   poLandscape;  
                                                                   
                                                                  Printer.BeginDoc;  
                                                                  Cols:=   Nil;  
                                                                  try  
                                                                      Cols:=   TLIst.Create;  
                                                                      Printer.Canvas.Font.Assign(   Grid.Font   );  
                                                                      SetColumnWidth;  
                                                                      Display(   cPrintProceeding   );  
                                                                      Application.ProcessMessages;  
                                                                      DoPrint;  
                                                                      finally  
                                                                          Cols.Free;  
                                                                          If   FPrintAborted   Then  
                                                                          Printer.Abort  
                                                                          Else  
                                                                          Printer.EndDoc;  
                                                                      end;  
                                                                      finally  
                                                                          Close;  
                                                                          End;   {   With   }  
                                                                          End;   {   TACDListerMain.PrintTable   }

var  
      TextF:Textfile;  
      S:String;  
      I:integer;  
  begin  
      try  
          AssignFile(TextF,'D:\PrintText.txt');  
          reWrite(TextF);  
          For   i:=0   to   StringGrid1.RowCount-1   do  
          begin  
                S:=StringGrid1.Rows[I].Text;  
                S:=StringReplace(S,#$D#$A,',     ',[rfReplaceAll,rfIgnoreCase]);  
                Showmessage(S);  
                writeln(TextF,S);  
          end;  
      finally  
          CloseFile(TextF);  
      end;  
  end;

在给你一个导入到EXCEL的代码,我自己写的!   仅供参考  
  function   GetExcelCoulmnCaption(num:   Cardinal):   string;  
  var  
      mod_num,div_num:Cardinal;  
  begin  
        if   num=0   then   exit;  
        if   (num   mod   26=0)   then   mod_num:=26  
        else   mod_num:=num   mod   26;  
        div_num:=num   div   26;  
        if   mod_num=26   then   DEC(div_num);  
        if   div_num=0   then  
        Result:=Chr(64+mod_num)  
        else   Result:=Chr(64+div_num)+Chr(64+mod_num);  
  end;  
   
  procedure   PrintSqlDataToExcel;  
  var  
      I:integer;  
      Range,ExcelApp,V:variant;  
  begin  
          Try  
              ExcelApp:=CreateOleObject('Excel.application');  
          Except  
              MessageDlg('没有安装Office   办公软件Excel!',mtinformation,[MBOK],0);  
              exit;  
          End;  
   
          try  
          ExcelApp.WorkBooks.add(Null);  
          V:=ExcelApp.WorkBooks[1].WorkSheets[1];  
   
          //*开始设计标题*/  
          Range:=V.Range['A1',GetExcelCoulmnCaption(DataSet.Fields.Count)+'1'];  
          Range.MergeCells:=true;  
          Range.RowHeight:=24;  
          Range.HoriZontalAlignMent:=xlCenter;  
          Range.VerticalAlignMent:=xlCenter;  
          Range.Font.Name:='新宋体';  
          Range.Font.size:=16;  
          Range.Font.FontStyle:='加粗';  
          Range.Value:=ExcelTitle;         //定义EXCEL的标题是什么?   EXCELTitle是字符型,需要自己定义  
          Range.Borders.LineStyle:=xlContinuous;     //边框  
          Range.Borders.Weight:=xlThin;  
          Range.Borders.ColorIndex:=xlAutomatic;  
   
          //显示标题  
            For   i:=0   To   DataSet.Fields.Count-1   Do  
            begin  
                Range:=V.Range[GetExcelCoulmnCaption(I+1)+'2',GetExcelCoulmnCaption(I+1)+'2'];  
                Range.RowHeight:=24;  
                Range.HoriZontalAlignMent:=xlCenter;  
                Range.VerticalAlignMent:=xlCenter;  
                Range.Font.Name:='新宋体';  
                Range.Font.size:=9;  
                Range.Font.FontStyle:='加粗';  
                Range.Columns.AutoFit;  
                Range.Value:=DataSet.Fields[I].FieldName;  
                Range.Borders.LineStyle:=xlContinuous;     //边框  
                Range.Borders.Weight:=xlThin;  
                Range.Borders.ColorIndex:=xlAutomatic;  
            end;  
            //显示内容  
            //set  
              Range:=V.Range['A3',GetExcelCoulmnCaption(DataSet.FieldCount)+IntToStr(DataSet.recordcount+2)];  
              Range.NumberFormatLocal:=   '@';  
              Range.RowHeight:=20;  
              Range.HoriZontalAlignMent:=xlCenter;  
              Range.VerticalAlignMent:=xlCenter;  
              Range.Borders.LineStyle:=xlContinuous;     //边框  
              Range.Borders.Weight:=xlThin;  
              Range.Borders.ColorIndex:=xlAutomatic;  
              Range.Font.Name:='新宋体';  
              Range.Font.size:=9;  
              Range.Columns.AutoFit;  
   
            DataSet.First;  
            While   (Not   DataSet.Eof)   do  
            begin  
                  For   i:=0   To   DataSet.Fields.Count-1   Do  
                  begin  
                            Range:=V.Range[GetExcelCoulmnCaption(I+1)+IntToStr(DataSet.RecNo+2),GetExcelCoulmnCaption(I+1)+IntToStr(DataSet.RecNo+2)];  
                            if     DataSet.Fields[I].IsNull   then  
                            Range.Value:='   '  
                            else  
                            Range.Value:=DataSet.Fields[I].AsString;  
                            Range.Borders.LineStyle:=xlContinuous;     //边框  
                            Range.Borders.Weight:=xlThin;  
                            Range.Borders.ColorIndex:=xlAutomatic;  
                  end;  
                  DataSet.next;  
            end;  
             
          //显示Excel文档界面  
          ExcelApp.visible:=true;  
          V.Activate;  
          finally  
                //释放接口对象  
                  ExcelApp:=unassigned;  
                  V:=   unassigned;  
                  Range:=unassigned;  
          end;  
  end;

转载于:https://www.cnblogs.com/delphi2007/archive/2008/10/20/1314886.html

reprint 使用说明 本人长期使用delphi数据库的开发,报表控件使用Quickrpt,在打印上经常遇到一些问题,于是自己经常编写一部分打印的程序,经过总结开发了这个控件。 本控件可打印 datasource,dbgrid,stringgrid. 一 、控件属性: 1、colstitle 设置报表的列标题属性 (1)alignment 列标题对齐方式。 (2)font 列标题字体 (3)print 设置是否打印列标题 (4)rowspace 列标题行的高度 2、datasource 选择要打印的datasource 3、dbgrid 选择要打印的dbgrid 4、stringgrid 选择要打印stringgrid 5、detail 设置要打印的明细数据属性 (1)arrange 设置明细字段排列方向 Horizontal 横向打印(默认的一般打印) Vertical 竖向打印(字段竖向排列适合打印字段内容较长的报表如“会议纪录”) (2)aotureturn 打印明细字段时,如果字段超过列的宽度是否允许自动换行 (3)colsline 设置竖线属性引用tpen类 (4)footer 设置明细尾 (5)frame 设置明细边框属性引用tpen类 (6)head 设置明细头同footer (7)rowsline 设置横线属性引用tpen类 (8)rowspace 设置明细行的高度 (9)top 明细与标题的距离 6、page 设置纸张的上下左右边距 7、pagefooter 设置页脚同明细尾 8、pageheader 设置页眉同页脚 9、printobject 选择要打印的对象 (datasource 、dbgridstringgrid ) 10、title 设置标题类页眉、页脚 二 、控件方法: (1) preview 预览 (2) print 打印 (3) SaveToFile() 保存为报表文件 (4) SaveToStream() 保存为流(然后就可把整个报表存到数据库了很方便哦! ~_~) (5) PrintFile() 打印报表文件 (6) PrintStream() 打印流(流的数据库存取就不用多说了吧) (7) PreviewFile() 预览文件 (8) PreviewStream() 预览流 (9) OptionToStream() 报表的属性保存为流 (10) OptionFromStream() 从流得到报表属性 三、 控件事件: AfterPrint 打印后 BeforePrint 打印前 (本来很多事件,但没有预览,后来加上预览以及一些方法后实现很困难就去掉了!) 四、注意事项 (1) text 属性,输入“¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;”打印页码值,如果想打印页码可输入“第¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;页” 输入“¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RecordCount¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;”打印 记录数 (2) 不同的打印机,打印和预览效果可能有一点点不同(保证数据打印完全正确一致)。本人用一台针式和一台激光打印机做测试,开始差别较大后经过调试基本一致,不知其他打印机如何。 就这些个吧基本满足了我的软件开发需要,解决了很多问题,关键是做报表省了很大力气,当然了很复杂的报表还是要其它报表控件来解决。如果有其他问题或好的建议可与我联系。 程序设计:吴进昊 E-mail :jinhaowu@hotmail.com qq :54254770 2003.01.03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值