Procházet zdrojové kódy

Bug 报表,批量导出Excel,页面设置--纸张失效
将预览、打印、导出选中报表,与批量打印、导出选中报表使用不同报表控件

MaiXinRong před 9 roky
rodič
revize
ef23ff8305
3 změnil soubory, kde provedl 95 přidání a 81 odebrání
  1. 21 10
      Forms/ReportsFrm.dfm
  2. 73 71
      Forms/ReportsFrm.pas
  3. 1 0
      Report/ReportConnection.pas

+ 21 - 10
Forms/ReportsFrm.dfm

@@ -82,23 +82,23 @@ object ReportsForm: TReportsForm
   end
   object pnlReports: TPanel
     Left = 0
-    Top = 76
+    Top = 81
     Width = 1107
-    Height = 430
+    Height = 425
     Align = alClient
     BevelOuter = bvNone
     TabOrder = 6
     object sprReportPreview: TSplitter
       Left = 211
       Top = 0
-      Height = 430
+      Height = 425
       AutoSnap = False
     end
     object pnlReportsList: TPanel
       Left = 0
       Top = 0
       Width = 211
-      Height = 430
+      Height = 425
       Align = alLeft
       BevelOuter = bvNone
       TabOrder = 0
@@ -106,7 +106,7 @@ object ReportsForm: TReportsForm
         Left = 0
         Top = 35
         Width = 211
-        Height = 395
+        Height = 390
         Align = alClient
         Font.Charset = DEFAULT_CHARSET
         Font.Color = clWindowText
@@ -193,7 +193,7 @@ object ReportsForm: TReportsForm
       Left = 214
       Top = 0
       Width = 893
-      Height = 430
+      Height = 425
       HorzScrollBar.Increment = 48
       HorzScrollBar.Tracking = True
       VertScrollBar.Increment = 32
@@ -216,7 +216,7 @@ object ReportsForm: TReportsForm
     Font.Charset = DEFAULT_CHARSET
     Font.Color = clWindowText
     Font.Height = -12
-    Font.Name = #23435#20307
+    Font.Name = 'Microsoft YaHei UI'
     Font.Style = []
     Bars = <
       item
@@ -313,7 +313,7 @@ object ReportsForm: TReportsForm
         Caption = #33539#22260#36755#20986
         DockedDockingStyle = dsTop
         DockedLeft = 0
-        DockedTop = 47
+        DockedTop = 52
         DockingStyle = dsTop
         FloatLeft = 602
         FloatTop = 414
@@ -343,7 +343,7 @@ object ReportsForm: TReportsForm
         Caption = #25253#34920#36873#39033
         DockedDockingStyle = dsTop
         DockedLeft = 308
-        DockedTop = 47
+        DockedTop = 52
         DockingStyle = dsTop
         FloatLeft = 484
         FloatTop = 279
@@ -388,7 +388,7 @@ object ReportsForm: TReportsForm
     DockControlHeights = (
       0
       0
-      76
+      81
       0)
     object xlbPrint: TdxBarLargeButton
       Caption = #25171#21360
@@ -2906,4 +2906,15 @@ object ReportsForm: TReportsForm
       8001800180018001FFFFFFFFFFFFFFFF00000000000000000000000000000000
       000000000000}
   end
+  object BatchPrintXml: TPrintComXML
+    PreviewRows = 1
+    PreviewCols = 1
+    Scaling = 1.000000000000000000
+    OnGetDatasetEvent = PreviewComXMLGetDatasetEvent
+    OnGetDataConnection = PreviewComXMLGetDataConnection
+    OnCrossTabLabelShow = PreviewComXMLCrossTabLabelShow
+    OnContentDisplay = PreviewComXMLContentDisplay
+    Left = 390
+    Top = 89
+  end
 end

+ 73 - 71
Forms/ReportsFrm.pas

@@ -60,6 +60,7 @@ type
     chkExcel2010: TCheckBox;
     dxcciExcelMode: TdxBarControlContainerItem;
     pnlReports: TPanel;
+    BatchPrintXml: TPrintComXML;
     procedure PreviewComXMLGetDataConnection(var ADOCon: TADOConnection);
     procedure xlbRealSizeClick(Sender: TObject);
     procedure xlbOnePageClick(Sender: TObject);
@@ -105,9 +106,9 @@ type
     // 报表数据准备
     FReportDataPrepare: TReportPrepare;
 
-    procedure InitPageSettings;
-    procedure InitFont;
-    procedure InitPaperSettings(ATemplate: TTemplateNode);
+    procedure InitPageSettings(APrintCom: TPrintComXML);
+    procedure InitFont(APrintCom: TPrintComXML);
+    procedure InitPaperSettings(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
 
     function GetHintStr: string;
 
@@ -123,7 +124,7 @@ type
     procedure ResizePreviewBox;
     procedure PreviewReportCurPage;
     procedure RepaintCurPagePreview;
-    procedure LoadTemplet(ATemplate: TTemplateNode);
+    procedure LoadTemplet(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
     procedure LoadTempletAndDisplay;
 
     procedure BeforeExport;
@@ -133,7 +134,7 @@ type
     procedure PrintReport(ATemplateNode: TTemplateNode; isPDF, isExcel: boolean;
       ExcelOutputName, TemplateFileName: string);
 
-    procedure ExportXlsReport(AStartPage, AEndPage: Integer; const AFileName: string);
+    procedure ExportXlsReport(AStartPage, AEndPage: Integer; const AFileName: string; APrintCom: TPrintComXML);
     procedure ExportCurXlsReport;
     procedure ExportAllSelectedXlsReports;
     procedure PrintAllSelectedReports;
@@ -151,7 +152,7 @@ type
     destructor Destroy; override;
 
     procedure InitFormView;
-    procedure InitReportSettings(ATemplate: TTemplateNode = nil);
+    procedure InitReportSettings(APrintCom: TPrintComXML; ATemplate: TTemplateNode = nil);
 
     property ProjectData: TProjectData read FProjectData write SetProjectData;
     // 当前预览的页码
@@ -188,7 +189,7 @@ begin
   {ReportsForm.BorderIcons := ReportsForm.BorderIcons - [biMaximize];
   ReportsForm.WindowState := wsMaximized;}
   ReportsForm.ProjectData := AProjectData;
-  ReportsForm.InitReportSettings;
+  ReportsForm.InitReportSettings(ReportsForm.PreviewComXML);
   ReportsForm.InitFormView;
   try
     ReportsForm.ShowModal;
@@ -297,7 +298,7 @@ begin
 
   Screen.Cursor := crHourGlass;
   try
-    LoadTemplet(vTemplateNode);
+    LoadTemplet(vTemplateNode, PreviewComXML);
     if PreviewComXML.TotalPages > 0 then
       PreviewTemplet
     else
@@ -584,7 +585,7 @@ var
 begin
   sFileName := extvReport.Selected.Text;
   if (PrintStartPage <= PrintEndPage) and SaveFile(sFileName, '.xls') then
-    ExportXlsReport(PrintStartPage, PrintEndPage, sFileName);
+    ExportXlsReport(PrintStartPage, PrintEndPage, sFileName, PreviewComXML);
 end;
 
 procedure TReportsForm.AfterExport;
@@ -762,29 +763,29 @@ begin
     LoadTempletAndDisplay;
 end;
 
-procedure TReportsForm.InitReportSettings(ATemplate: TTemplateNode);
+procedure TReportsForm.InitReportSettings(APrintCom: TPrintComXML; ATemplate: TTemplateNode);
 begin
-  PreviewComXML.FillZero := chkFillZero.Checked;
-  InitPageSettings;
-  InitPaperSettings(ATemplate);
+  APrintCom.FillZero := chkFillZero.Checked;
+  InitPageSettings(APrintCom);
+  InitPaperSettings(ATemplate, APrintCom);
 end;
 
-procedure TReportsForm.InitPageSettings;
+procedure TReportsForm.InitPageSettings(APrintCom: TPrintComXML);
 begin
   // 设置页面大小
-  PreviewComXML.setPageSize(ReportConfig.PageSize);
+  APrintCom.setPageSize(ReportConfig.PageSize);
   if ReportConfig.PageSize = 'A3' then
-    PreviewComXML.PrintPageSizeIdx := DMPAPER_A3
+    APrintCom.PrintPageSizeIdx := DMPAPER_A3
   else if ReportConfig.PageSize = 'A4' then
-    PreviewComXML.PrintPageSizeIdx := DMPAPER_A4;  
+    APrintCom.PrintPageSizeIdx := DMPAPER_A4;
   // 设置边距
-  PreviewComXML.setEdge(0, '', ReportConfig.LeftEdge/10);
-  PreviewComXML.setEdge(1, '', ReportConfig.RightEdge/10);
-  PreviewComXML.setEdge(2, '', ReportConfig.UpEdge/10);
-  PreviewComXML.setEdge(3, '', ReportConfig.DownEdge/10);
+  APrintCom.setEdge(0, '', ReportConfig.LeftEdge/10);
+  APrintCom.setEdge(1, '', ReportConfig.RightEdge/10);
+  APrintCom.setEdge(2, '', ReportConfig.UpEdge/10);
+  APrintCom.setEdge(3, '', ReportConfig.DownEdge/10);
 end;
 
-procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode);
+procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
 
   procedure InitRepBorderLine;
   var
@@ -794,7 +795,7 @@ procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode);
   begin
     ObjList := TList.Create;
     try
-      PreviewComXML.getAllShapeObjs(1, ObjList);
+      APrintCom.getAllShapeObjs(1, ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         ShapeRec := ObjList[i];
@@ -817,7 +818,7 @@ procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode);
           else
              ShapeRec.PenStyle := integer(psSolid)
         end;
-        PreviewComXML.setShapeObj(ShapeRec);
+        APrintCom.setShapeObj(ShapeRec);
       end;
     finally
       ObjList.Free;
@@ -834,25 +835,25 @@ procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode);
   begin
     ObjList := TList.Create;
     try
-      PreviewComXML.getAllFlowShowContentObjs(ObjList);
+      APrintCom.getAllFlowShowContentObjs(ObjList);
       // 设置报表表格横线
       for i := 0 to ObjList.Count - 1 do
       begin
         FlowContentRec := ObjList[i];
         FlowContentRec.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
         FlowContentRec.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
-        PreviewComXML.setFlowContentObj(FlowContentRec);
+        APrintCom.setFlowContentObj(FlowContentRec);
       end;
-      PreviewComXML.getAllCrossContentObjs(ObjList);
+      APrintCom.getAllCrossContentObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         CrossContentRec := ObjList[i];
         CrossContentRec.CrossContent.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
         CrossContentRec.CrossContent.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
-        PreviewComXML.setCrossContentObj(CrossContentRec);
+        APrintCom.setCrossContentObj(CrossContentRec);
       end;
       // 设置报表表格竖线
-      PreviewComXML.getAllFlowShowContentObjs(ObjList);
+      APrintCom.getAllFlowShowContentObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         FlowContentRec := ObjList[i];
@@ -864,10 +865,10 @@ procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode);
             FlowContentRec.LineInfo.LeftThick := 0
           else if (i = ObjList.Count - 1) then
             FlowContentRec.LineInfo.RightThick := 0;
-        PreviewComXML.setFlowContentObj(FlowContentRec);
+        APrintCom.setFlowContentObj(FlowContentRec);
       end;
 
-      PreviewComXML.getAllCrossContentObjs(ObjList);
+      APrintCom.getAllCrossContentObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         CrossContentRec := ObjList[i];
@@ -931,7 +932,7 @@ procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode);
             end;
           end;
         end;
-        PreviewComXML.setCrossContentObj(CrossContentRec);
+        APrintCom.setCrossContentObj(CrossContentRec);
       end;
     finally
       ObjList.Free;
@@ -1029,7 +1030,7 @@ procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode);
             0..2 : SetPTRBorder(PSR.Data); //文本,参数,字段,表栏
             7 : SetPCRBorder(PSR.Data) //Column
           end;
-          PreviewComXML.setActShowElementObj(PSR);
+          APrintCom.setActShowElementObj(PSR);
         end;
       end;
     finally
@@ -1040,7 +1041,7 @@ procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode);
 begin
   if not Assigned(ATemplate) or (ATemplate.SelfFormat = 0) then
   begin
-    InitFont;           // 各类字体
+    InitFont(APrintCom);           // 各类字体
     InitRepBorderLine;  // 报表边框
     InitRepCellLine;    // 报表表格
     InitOtherArea;      // 活动区域
@@ -1094,7 +1095,7 @@ begin
   PreviewReportCurPage;
 end;
 
-procedure TReportsForm.InitFont;
+procedure TReportsForm.InitFont(APrintCom: TPrintComXML);
 
   procedure AssignFontRec(AFontRec: TFontRec; AFont: TFont);
   begin
@@ -1113,7 +1114,7 @@ procedure TReportsForm.InitFont;
     if TitleRec <> nil then
     begin
       AssignFontRec(TitleRec.FontRec, ReportConfig.TitleFont);
-      PreviewComXML.setTitleObj(TitleRec);
+      APrintCom.setTitleObj(TitleRec);
     end;
   end;
 
@@ -1143,23 +1144,23 @@ procedure TReportsForm.InitFont;
   begin
     ObjList := TList.Create;
     try
-      PreviewComXML.getAllColumnHeadObjs(ObjList);
+      APrintCom.getAllColumnHeadObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         ColumnRec := ObjList[i];
         AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
         InitColumnThick(ColumnRec);
-        PreviewComXML.setColumnHeadTailObj(0, ColumnRec);
+        APrintCom.setColumnHeadTailObj(0, ColumnRec);
       end;
-      PreviewComXML.getAllColumnTailObjs(ObjList);
+      APrintCom.getAllColumnTailObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         ColumnRec := ObjList[i];
         AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
         InitColumnThick(ColumnRec);
-        PreviewComXML.setColumnHeadTailObj(1,ColumnRec);
+        APrintCom.setColumnHeadTailObj(1,ColumnRec);
       end;
-      PreviewComXML.getAllActAreaObjs(ObjList);
+      APrintCom.getAllActAreaObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         AAR := ObjList[i];
@@ -1171,7 +1172,7 @@ procedure TReportsForm.InitFont;
             ColumnRec := SER.Data;
             AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
             InitColumnThick(ColumnRec);
-            PreviewComXML.setActShowElementObj(SER);
+            APrintCom.setActShowElementObj(SER);
           end;
         end;
       end;
@@ -1191,45 +1192,45 @@ procedure TReportsForm.InitFont;
     ObjList := TList.Create;
     try
       // 设置表正文
-      PreviewComXML.getAllFlowShowContentObjs(ObjList);
+      APrintCom.getAllFlowShowContentObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         FlowContentRec := ObjList[i];
         if not (FlowContentRec.Fixed) then
         begin
           AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
-          PreviewComXML.setFlowContentObj(FlowContentRec);
+          APrintCom.setFlowContentObj(FlowContentRec);
         end;
       end;
-      PreviewComXML.getAllBillShowContentObjs(ObjList);
+      APrintCom.getAllBillShowContentObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         FlowContentRec := ObjList[i];
         if not(FlowContentRec.Fixed) then
         begin
           AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
-          PreviewComXML.setBillContentObj(FlowContentRec);
+          APrintCom.setBillContentObj(FlowContentRec);
         end;
       end;
-      PreviewComXML.getAllCrossContentObjs(ObjList);
+      APrintCom.getAllCrossContentObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         CrossContentRec := ObjList[i];
         if not(CrossContentRec.CrossContent.Fixed) then
         begin
           AssignFontRec(CrossContentRec.CrossContent.FontRec, ReportConfig.ContentFont);
-          PreviewComXML.setCrossContentObj(CrossContentRec);
+          APrintCom.setCrossContentObj(CrossContentRec);
         end;
       end;
       // 设置表合计
       for i := 0 to 2 do
       begin
-        PreviewComXML.getAllSumObjs(i,ObjList);
+        APrintCom.getAllSumObjs(i,ObjList);
         for j := 0 to ObjList.Count - 1 do
         begin
           SumRec := ObjList[j];
           AssignFontRec(SumRec.FontRec, ReportConfig.GatherFont);
-          PreviewComXML.setSumObj(SumRec);
+          APrintCom.setSumObj(SumRec);
         end;
       end;
     finally
@@ -1245,19 +1246,19 @@ procedure TReportsForm.InitFont;
   begin
     ObjList := TList.Create;
     try
-      PreviewComXML.getAllHeadObjs(ObjList);
+      APrintCom.getAllHeadObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         HeadTailRec := ObjList[i];
         AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
-        PreviewComXML.setHeadTailObj(0, HeadTailRec);
+        APrintCom.setHeadTailObj(0, HeadTailRec);
       end;
-      PreviewComXML.getAllTailObjs(ObjList);
+      APrintCom.getAllTailObjs(ObjList);
       for i := 0 to ObjList.Count - 1 do
       begin
         HeadTailRec := ObjList[i];
         AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
-        PreviewComXML.setHeadTailObj(1, HeadTailRec);
+        APrintCom.setHeadTailObj(1, HeadTailRec);
       end;
     finally
       ObjList.Free;
@@ -1335,14 +1336,14 @@ procedure TReportsForm.PrintReport(ATemplateNode: TTemplateNode;
   begin
     if isPDF then
     begin
-      PreviewComXML.PrintPDFAll;
+      BatchPrintXml.PrintPDFAll;
       while not CheckPrinterReady do
         Sleep(1000);
     end
     else if not isExcel then
-      PreviewComXML.PrintAll(1)
+      BatchPrintXml.PrintAll(1)
     else
-      ExportXlsReport(1, PreviewComXML.TotalPages, ExcelOutputName);
+      ExportXlsReport(1, BatchPrintXml.TotalPages, ExcelOutputName, BatchPrintXml);
   end;
 
 var
@@ -1355,8 +1356,8 @@ begin
 
   Screen.Cursor := crHourGlass;
   try
-    LoadTemplet(ATemplateNode);
-    if PreviewComXML.TotalPages > 0 then
+    LoadTemplet(ATemplateNode, BatchPrintXml);
+    if BatchPrintXml.TotalPages > 0 then
       PrintTemplet
     {else if strRptName <> '' then
     begin
@@ -1369,7 +1370,7 @@ begin
 end;
 
 procedure TReportsForm.ExportXlsReport(AStartPage, AEndPage: Integer;
-  const AFileName: string);
+  const AFileName: string; APrintCom: TPrintComXML);
 
   procedure ExportPagesXlsReport(AStartPage, AEndPage: Integer; const AFileName: string);
   var
@@ -1378,10 +1379,10 @@ procedure TReportsForm.ExportXlsReport(AStartPage, AEndPage: Integer;
     LoadExcelBorder(Border);
     if IsExcel2010 then
       // 康博士代码中写批量打印是,用Printer.Canvas,打印当前时,用PreviewBox.Canvas。不懂为什么
-      PreViewComXML.OutputToExcelRangeXMLEx(PreviewBox.Canvas, AStartPage,
+      APrintCom.OutputToExcelRangeXMLEx(PreviewBox.Canvas, AStartPage,
           AEndPage, GetTemplateXlsFileName, AFileName, Border, ExcelMode)
     else
-      PreViewComXML.OutputToExcelFile(PreviewBox.Canvas, AStartPage,
+      APrintCom.OutputToExcelFile(PreviewBox.Canvas, AStartPage,
           AEndPage, GetTemplateXlsFileName, AFileName, ExcelMode, Border);
   end;
 
@@ -1407,13 +1408,13 @@ begin
       until iStartPage > iEndPage;
     end
     else
-      ExportPagesXlsReport(PrintStartPage, PrintEndPage, AFileName);
+      ExportPagesXlsReport(AStartPage, AEndPage, AFileName);
   finally
     AfterExport;
   end;
 end;
 
-procedure TReportsForm.LoadTemplet(ATemplate: TTemplateNode);
+procedure TReportsForm.LoadTemplet(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
 var
   RptArchiverObj: TReportArchiver;
   Mem: TMemoryStream;
@@ -1428,17 +1429,18 @@ begin
     // 以下代码有顺序限制,不可修改,主要保证在不修改报表模板文件的基础上可以用户定制报表格式
     // 私以为,原因在于这些设置修改后,并不能生效,需要保存再读取方可生效
     // 读取报表模板
-    if not PreviewComXML.ReadReportStream(Mem) then Exit;
+    if not APrintCom.ReadReportStream(Mem) then Exit;
     // 将报表设置中的数据覆盖掉原模板的数据
-    InitReportSettings(ATemplate);
+    InitReportSettings(APrintCom, ATemplate);
     // 保存
-    PreviewComXML.SaveToStream(Mem);
+    APrintCom.SaveToStream(Mem);
     // 再次读取,使报表设置中的设置生效
-    PreviewComXML.ReadReportStream(Mem);
+    APrintCom.ReadReportStream(Mem);
     // ReadReportStream之后会将PreviewComXML的FillZero值赋为True,故再赋值一次
-    PreviewComXML.FillZero := chkFillZero.Checked;
-    PreviewComXML.ReadDBData;
-    PreviewComXML.AnalyseData;
+    APrintCom.FillZero := chkFillZero.Checked;
+    InitPageSettings(APrintCom);
+    APrintCom.ReadDBData;
+    APrintCom.AnalyseData;
   finally
     if Mem <> nil then
       Mem.Free;

+ 1 - 0
Report/ReportConnection.pas

@@ -28,6 +28,7 @@ constructor TReportConnection.Create(AProjectData: TProjectData);
 begin
   FProjectData := AProjectData;
   FCommonGather := TrpgGatherControl.Create(AProjectData.ProjectID);
+  FConnection := AProjectData.ADOConnection;
 end;
 
 destructor TReportConnection.Destroy;