• 使用EXCEL制作通用打印模块


    {
    eclApp.ActiveSheet.PageSetup.PaperSize := xlPaperA3;       //设置纸张的类型
       eclApp.ActiveSheet.PageSetup.Orientation := xlLandscape; //设置是横向打印还是纵向打印
       eclApp.ActiveSheet.PageSetup.PrintTitleRows := '$3:$5';  //设置表头重复如果多页的情况下
       eclApp.ActiveSheet.PageSetup.CenterFooter := '第&P页,共 &N 页'; //设置页码问题
       }

    unit U_general_print;
    {$WARNINGS OFF}
    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons, ExtCtrls, ComCtrls, Db, variants, comobj, excelxp;

    type
      TfrmPrint = class(TForm)
        Panel1: TPanel;
        SrcLabel: TLabel;
        DstLabel: TLabel;
        IncludeBtn: TSpeedButton;
        IncAllBtn: TSpeedButton;
        ExcludeBtn: TSpeedButton;
        ExAllBtn: TSpeedButton;
        SrcList: TListBox;
        DstList: TListBox;
        Panel2: TPanel;
        btnOK: TSpeedButton;
        btnCancel: TSpeedButton;
        Label6: TLabel;
        procedure IncludeBtnClick(Sender: TObject);
        procedure ExcludeBtnClick(Sender: TObject);
        procedure IncAllBtnClick(Sender: TObject);
        procedure ExcAllBtnClick(Sender: TObject);
        procedure FormActivate(Sender: TObject);
        procedure ExAllBtnClick(Sender: TObject);
        procedure DstListDblClick(Sender: TObject);
        procedure SrcListDblClick(Sender: TObject);
        procedure btnCancelClick(Sender: TObject);
        procedure btnOKClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        FDataSet: TDataSet;
        FHeader1: string; //单据头
        FHeader2: string;
        FHeader3: string;
        FFooter1: string; //单据尾
        FFooter2: string;
        FFooter3: string;
        varexcel: variant; //变体变量,指向创建的EXCEL对象
        range: variant; //变体变量,作为EXCEL一块区域的对象
        procedure ExportDataToExcel; //打印数据
        function GetFieldName(const s:string):string;
      public
        { Public declarations }
        procedure MoveSelected(List: TCustomListBox; Items: TStrings);
        procedure SetItem(List: TListBox; Index: Integer);
        function GetFirstSelection(List: TCustomListBox): Integer;
        procedure SetButtons;
      end;

    var
      frmPrint: TfrmPrint;

    procedure Execute(DataSet: TDataSet; DefFeildList:TStringList;
      const Header1, Header2, Header3, Footer1, Footer2, Footer3: string);

    implementation

    {$R *.DFM}

    var
      myStr: string;

    procedure Execute(DataSet: TDataSet; DefFeildList:TStringList;
      const Header1, Header2, Header3, Footer1, Footer2, Footer3: string);
    var
      i: Integer;
    begin
      frmPrint := TfrmPrint.Create(nil);
      frmPrint.FDataSet := DataSet;
      if DefFeildList<>nil then frmPrint.DstList.Items.Assign(DefFeildList);
      frmPrint.FHeader1 := Header1;
      frmPrint.FHeader2 := Header2;
      frmPrint.FHeader3 := Header3;
      frmPrint.FFooter1 := Footer1;
      frmPrint.FFooter2 := Footer2;
      frmPrint.FFooter3 := Footer3;
      frmPrint.SrcList.Items.Clear;
      for i := 0 to DataSet.FieldCount - 1 do begin
        frmPrint.SrcList.Items.Add(DataSet.Fields[i].DisplayLabel);
      end;
      frmPrint.ShowModal;
    end;

    //操作两个列表框之间的数据移动
    procedure TfrmPrint.IncludeBtnClick(Sender: TObject);
    var
      Index: Integer;
    begin
      Index := GetFirstSelection(SrcList);
      MoveSelected(SrcList, DstList.Items);
      SetItem(SrcList, Index);
    end;

    procedure TfrmPrint.ExcludeBtnClick(Sender: TObject);
    var
      Index: Integer;
    begin
      Index := GetFirstSelection(DstList);
      MoveSelected(DstList, SrcList.Items);
      SetItem(DstList, Index);
    end;

    procedure TfrmPrint.IncAllBtnClick(Sender: TObject);
    var
      I: Integer;
    begin
      for I := 0 to SrcList.Items.Count - 1 do
        DstList.Items.AddObject(SrcList.Items[I],
          SrcList.Items.Objects[I]);
      SrcList.Items.Clear;
      SetItem(SrcList, 0);
    end;

    procedure TfrmPrint.ExcAllBtnClick(Sender: TObject);
    var
      I: Integer;
    begin
      for I := 0 to DstList.Items.Count - 1 do
        SrcList.Items.AddObject(DstList.Items[I], DstList.Items.Objects[I]);
      DstList.Items.Clear;
      SetItem(DstList, 0);
    end;

    procedure TfrmPrint.ExAllBtnClick(Sender: TObject);
    var
      I: Integer;
    begin
      for I := 0 to DstList.Items.Count - 1 do
        SrcList.Items.AddObject(DstList.Items[I], DstList.Items.Objects[I]);
      DstList.Items.Clear;
      SetItem(DstList, 0);
    end;

    procedure TfrmPrint.DstListDblClick(Sender: TObject);
    begin
      excludebtn.click;
    end;

    procedure TfrmPrint.SrcListDblClick(Sender: TObject);
    begin
      includebtn.click;
    end;

    procedure TfrmPrint.MoveSelected(List: TCustomListBox; Items: TStrings);
    var
      I: Integer;
    begin
      for I := List.Items.Count - 1 downto 0 do
        if List.Selected[I] then
        begin
          Items.AddObject(List.Items[I], List.Items.Objects[I]);
          List.Items.Delete(I);
        end;
    end;

    procedure TfrmPrint.SetButtons;
    var
      SrcEmpty, DstEmpty: Boolean;
    begin
      SrcEmpty := SrcList.Items.Count = 0;
      DstEmpty := DstList.Items.Count = 0;
      IncludeBtn.Enabled := not SrcEmpty;
      IncAllBtn.Enabled := not SrcEmpty;
      ExcludeBtn.Enabled := not DstEmpty;
      ExAllBtn.Enabled := not DstEmpty;
    end;

    function TfrmPrint.GetFieldName(const s: string): string;
    var
      i: Integer;
    begin
      for i := 0 to FDataSet.FieldCount -1 do begin
        if FDataSet.Fields[i].DisplayLabel = s then begin
          Result := FDataSet.Fields[i].FieldName;
          Break;
        end;
      end;
    end;

    function TfrmPrint.GetFirstSelection(List: TCustomListBox): Integer;
    begin
      for Result := 0 to List.Items.Count - 1 do
        if List.Selected[Result] then Exit;
      Result := LB_ERR;
    end;

    procedure TfrmPrint.SetItem(List: TListBox; Index: Integer);
    var
      MaxIndex: Integer;
    begin
      with List do
      begin
        SetFocus;
        MaxIndex := List.Items.Count - 1;
        if Index = LB_ERR then Index := 0
        else if Index > MaxIndex then Index := MaxIndex;
        Selected[Index] := True;
      end;
      SetButtons;
    end;

    //===============================

    //当窗体激活的时候

    procedure TfrmPrint.FormActivate(Sender: TObject);
    begin
      if srclist.Items.count > 0 then
      begin
        includebtn.Enabled := true;
        IncAllBtn.Enabled := true;
      end;
      if dstlist.Items.count > 0 then
      begin
        ExcludeBtn.Enabled := True;
        ExAllBtn.Enabled := true;
      end;
    end;

    procedure TfrmPrint.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
      frmPrint := nil;
    end;

    //将数据导入到EXCEL中

    procedure TfrmPrint.ExportDataToExcel;
    var
      i, j, k: integer;
      xxx1: string;
      xr: string;
    begin
      if frmPrint.dstlist.items.count = 0 then
      begin
        application.messagebox('没有选择目标字段!', '提示信息', mb_iconwarning + mb_defbutton1);
        exit;
      end;
      Label6.Caption := '正在载入Excel,请稍候......';
      Label6.Refresh;
      try
        screen.cursor := crHourGlass;
        try
          //创建EXCEL对象
          varexcel := createoleobject('excel.application');
          if not varisempty(varexcel) then
          begin
            //添加工作簿
            varexcel.workbooks.add;
            varexcel.workbooks[1].worksheets[1].name := '数据库信息';
          end;
        except
          application.messagebox('请确认是否安装Excel?', '提示信息:', mb_iconquestion + mb_defbutton1);
          exit;
        end;
        begin
          //写入列标题
          range := varexcel.workbooks[1].worksheets[1].columns;
          for i := 0 to frmPrint.dstlist.Items.count - 1 do begin
            varexcel.workbooks[1].worksheets[1].cells[4, i + 1].value := frmPrint.dstlist.items.strings[i];
            varexcel.workbooks[1].worksheets[1].cells[4, i + 1].Font.bold := true;
            range.columns[i + 1].columnwidth := 10;
          end;
          try
            try
              //循环写入数据到EXCEL中
              frmPrint.FDataSet.first;
              j := 5;
              while not frmPrint.FDataSet.eof do begin
                for i := 0 to frmPrint.dstlist.Items.count - 1 do begin
                  xr := '''' + frmPrint.FDataSet.fieldbyname(GetFieldName(frmPrint.dstlist.items.strings[i])).AsString;
                  varexcel.workbooks[1].worksheets[1].cells[j, i + 1].value := xr;
                end;
                frmPrint.FDataSet.next;
                j := j + 1;
              end;
              //写入单据尾
              varexcel.workbooks[1].worksheets[1].cells[j, 1].value := Self.FFooter1;
              varexcel.workbooks[1].worksheets[1].cells[j + 1, 1].value := Self.FFooter2;
              varexcel.workbooks[1].worksheets[1].cells[j + 2, 1].value := Self.FFooter3;
            except
            end;
          finally
            frmPrint.FDataSet.enablecontrols;
            frmPrint.Label6.Caption := '';
            //数据表格画线
            k := i - 1 + ord('A');
            xxx1 := chr(k);
            myStr := xxx1;
            xxx1 := 'A4:' + xxx1 + inttostr(j - 1);
            range := varexcel.workbooks[1].worksheets[1].range[xxx1];
            range.borders.linestyle := xlcontinuous;
            //单据尾区域合并
            xxx1 := 'a' + inttostr(j) + ':' + myStr + inttostr(j);
            range := varexcel.workbooks[1].worksheets[1].range[xxx1];
            range.MergeCells := True;
            xxx1 := 'a' + inttostr(j + 1) + ':' + myStr + inttostr(j + 1);
            range := varexcel.workbooks[1].worksheets[1].range[xxx1];
            range.MergeCells := True;
            xxx1 := 'a' + inttostr(j + 2) + ':' + myStr + inttostr(j + 2);
            range := varexcel.workbooks[1].worksheets[1].range[xxx1];
            range.MergeCells := True;
            //单据头区域合并  标题列居中
            xxx1 := 'a1:' + myStr + '1';
            range := varexcel.workbooks[1].worksheets[1].range[xxx1];
            range.HorizontalAlignment := xlCenter;
            range.VerticalAlignment := xlCenter;
            range.MergeCells := True;
            xxx1 := 'a2:' + mystr + '2';
            range := varexcel.workbooks[1].worksheets[1].range[xxx1];
            range.MergeCells := True;
            xxx1 := 'a3:' + mystr + '3';
            range := varexcel.workbooks[1].worksheets[1].range[xxx1];
            range.MergeCells := True;
            //写入单据头
            varexcel.workbooks[1].worksheets[1].range['a1:a1'] := Self.FHeader1;
            varexcel.workbooks[1].worksheets[1].range['a2:a2'] := Self.FHeader2;
            varexcel.workbooks[1].worksheets[1].range['a3:a3'] := Self.FHeader3;
            //对报表标题进行修饰
            varexcel.workbooks[1].worksheets[1].range['a1:a1'].font.name := '楷体';
            varexcel.workbooks[1].worksheets[1].range['a1:a1'].font.size := '18';
            varexcel.workbooks[1].worksheets[1].range['a1:a1'].font.fontstyle := 'bold';
            varexcel.ActiveSheet.PageSetup.CenterFooter := '第&P页,共&N页';
            varexcel.visible := true;
          end;
        end;
      finally
        screen.cursor := crArrow;
      end;
    end;

    procedure TfrmPrint.btnCancelClick(Sender: TObject);
    begin
      close;
    end;


    procedure TfrmPrint.btnOKClick(Sender: TObject);
    begin
      //导入数据到EXCEL
      ExportDataToExcel;
    end;
    end.

    object frmPrint: TfrmPrint
      Left = 287
      Top = 111
      BorderIcons = [biSystemMenu]
      BorderStyle = bsDialog
      Caption = #25171#21360#36873#25321#31383#21475
      ClientHeight = 348
      ClientWidth = 363
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      Position = poScreenCenter
      OnActivate = FormActivate
      OnClose = FormClose
      PixelsPerInch = 96
      TextHeight = 13
      object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 363
        Height = 317
        Align = alClient
        BevelInner = bvLowered
        TabOrder = 0
        object SrcLabel: TLabel
          Left = 12
          Top = 10
          Width = 48
          Height = 12
          Caption = #21407#26377#23383#27573
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          ParentFont = False
        end
        object DstLabel: TLabel
          Left = 206
          Top = 10
          Width = 48
          Height = 12
          Caption = #30446#26631#23383#27573
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          ParentFont = False
        end
        object IncludeBtn: TSpeedButton
          Left = 171
          Top = 38
          Width = 24
          Height = 22
          Caption = '>'
          Enabled = False
          Flat = True
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          ParentFont = False
          OnClick = IncludeBtnClick
        end
        object IncAllBtn: TSpeedButton
          Left = 171
          Top = 88
          Width = 24
          Height = 22
          Caption = '>>'
          Enabled = False
          Flat = True
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          ParentFont = False
          OnClick = IncAllBtnClick
        end
        object ExcludeBtn: TSpeedButton
          Left = 171
          Top = 136
          Width = 24
          Height = 22
          Caption = '<'
          Enabled = False
          Flat = True
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          ParentFont = False
          OnClick = ExcludeBtnClick
        end
        object ExAllBtn: TSpeedButton
          Left = 171
          Top = 186
          Width = 24
          Height = 22
          Caption = '<<'
          Enabled = False
          Flat = True
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          ParentFont = False
          OnClick = ExAllBtnClick
        end
        object SrcList: TListBox
          Left = 11
          Top = 29
          Width = 150
          Height = 276
          Cursor = crArrow
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          ImeName = #20013#25991' ('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861
          ItemHeight = 12
          MultiSelect = True
          ParentFont = False
          TabOrder = 0
          OnDblClick = SrcListDblClick
        end
        object DstList: TListBox
          Left = 206
          Top = 29
          Width = 150
          Height = 276
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          ImeName = #20013#25991' ('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861
          ItemHeight = 12
          MultiSelect = True
          ParentFont = False
          TabOrder = 1
          OnDblClick = DstListDblClick
        end
      end
      object Panel2: TPanel
        Left = 0
        Top = 317
        Width = 363
        Height = 31
        Align = alBottom
        BevelInner = bvLowered
        TabOrder = 1
        object btnOK: TSpeedButton
          Left = 208
          Top = 4
          Width = 68
          Height = 22
          Caption = #30830' '#23450
          Flat = True
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          Glyph.Data = {
            76010000424D7601000000000000760000002800000020000000100000000100
            04000000000000010000120B0000120B00001000000000000000000000000000
            800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
            FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00555555555555
            555555555555555555555555555555555555555555FF55555555555559055555
            55555555577FF5555555555599905555555555557777F5555555555599905555
            555555557777FF5555555559999905555555555777777F555555559999990555
            5555557777777FF5555557990599905555555777757777F55555790555599055
            55557775555777FF5555555555599905555555555557777F5555555555559905
            555555555555777FF5555555555559905555555555555777FF55555555555579
            05555555555555777FF5555555555557905555555555555777FF555555555555
            5990555555555555577755555555555555555555555555555555}
          NumGlyphs = 2
          ParentFont = False
          OnClick = btnOKClick
        end
        object btnCancel: TSpeedButton
          Left = 286
          Top = 4
          Width = 68
          Height = 22
          Caption = #21462' '#28040
          Flat = True
          Font.Charset = GB2312_CHARSET
          Font.Color = clBlack
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          Glyph.Data = {
            76010000424D7601000000000000760000002800000020000000100000000100
            04000000000000010000130B0000130B00001000000000000000000000000000
            800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
            FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
            3333333333FFFFF3333333333999993333333333F77777FFF333333999999999
            33333337777FF377FF3333993370739993333377FF373F377FF3399993000339
            993337777F777F3377F3393999707333993337F77737333337FF993399933333
            399377F3777FF333377F993339903333399377F33737FF33377F993333707333
            399377F333377FF3377F993333101933399377F333777FFF377F993333000993
            399377FF3377737FF7733993330009993933373FF3777377F7F3399933000399
            99333773FF777F777733339993707339933333773FF7FFF77333333999999999
            3333333777333777333333333999993333333333377777333333}
          NumGlyphs = 2
          ParentFont = False
          OnClick = btnCancelClick
        end
        object Label6: TLabel
          Left = 11
          Top = 10
          Width = 6
          Height = 12
          Font.Charset = ANSI_CHARSET
          Font.Color = clWindowText
          Font.Height = -12
          Font.Name = #23435#20307
          Font.Style = []
          ParentFont = False
        end
      end
    end

    procedure TFormRuKu.dxBarButton2Click(Sender: TObject);
    var
      h1, h2, h3, f1, f2, f3: string;
      list: TStringList;
      zje: Double;
    begin
      inherited;
      h1 := gShop + '进(退)货单';
      h2 := '日期:' + formatdatetime('yyyy-mm-dd', cxDateEdit1.Date) + '    单号:' + cxtextedit1.Text + '    供应商:' + cxbuttonedit1.Text;
      h3 := '单据类型:' + cxcombobox1.Text + '    备注:' + cxtextedit2.Text;
      zje := Double(cxGrid1DBTableView1.DataController.Summary.FooterSummaryValues[1]);
      f1 := '合计金额小写:' + floattostr(zje) + '(元)';
      f2 := '合计金额大写:' + getrmb(zje);
      f3 := '制表:' + guser.name + '    验收:          ' + '主管:';
      list := TStringList.Create;
      list.Delimiter := ',';
      list.DelimitedText := '编码,品名规格,单位,数量,进价,金额';
      U_general_print.Execute(dm1.qryRuKu, list, h1, h2, h3, f1, f2, f3);
      list.Free;
    end;

  • 相关阅读:
    区块链学习(2)钱包
    区块链学习(1)密钥,公钥和地址
    Ubuntu下安装和开启telnet
    ubuntu下的ppa源使用
    tensorflow中手写识别笔记
    交叉熵解读
    Ubuntu下对executable (application/x-executable)文件创建快捷方式
    Numpy学习笔记(四)
    pycharm问题总结
    Numpy学习笔记(三)
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940603.html
Copyright © 2020-2023  润新知