stgExcelExport.pas 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. unit stgExcelExport;
  2. interface
  3. uses
  4. Classes, OExport, OExport_Vcl, OExport_VclForms, stgGatherDm, sdDB,
  5. stgGatherCacheData, stgGatherUtils, sdIDTree, Graphics;
  6. type
  7. TstgExcelExport = class
  8. private
  9. FTempFile: string;
  10. FGatherData: TstgGatherData;
  11. FOExport: TOExport;
  12. FOExportor: TOCustomExporter;
  13. protected
  14. function AddHeadCell(ARow: TExportRow; const AHead: string; AWidth: Integer): TExportCellString;
  15. function GetExportor(const AFileType: string): TOCustomExporter;
  16. procedure SaveFile(const AFileName: string);
  17. procedure BeforeExport;
  18. procedure AfterExport;
  19. public
  20. constructor Create(AGatherData: TstgGatherData);
  21. property GatherData: TstgGatherData read FGatherData;
  22. property OExport: TOExport read FOExport;
  23. end;
  24. TstgErrorExcelExport = class(TstgExcelExport)
  25. private
  26. procedure InitSheet(ASheet: TExportWorkSheet);
  27. procedure ExportSubTenderToSheet(ATenderID: Integer; ASheet: TExportWorkSheet);
  28. public
  29. procedure ExportSubTender(ARec: TsdDataRecord; const AFileName: string);
  30. procedure ExportAll(const AFileName: string);
  31. end;
  32. TstgGatherExcelExport = class(TstgExcelExport)
  33. private
  34. procedure InitSheet(ASheet: TExportWorkSheet);
  35. procedure ExportTreeNodeToSheet(ANode: TsdIDTreeNode; ASheet: TExportWorkSheet);
  36. procedure ExportGatherToSheet(ASheet: TExportWorkSheet);
  37. public
  38. procedure ExportGather(const AFileName: string);
  39. end;
  40. implementation
  41. uses SysUtils, UtilMethods, ZhAPI;
  42. { TstgErrorExcelExport }
  43. procedure TstgErrorExcelExport.ExportAll(const AFileName: string);
  44. var
  45. i: Integer;
  46. vRec: TsdDataRecord;
  47. begin
  48. BeforeExport;
  49. try
  50. GetExportor(ExtractFileExt(AFileName));
  51. for i := 0 to FGatherData.sddSubTenders.RecordCount - 1 do
  52. begin
  53. vRec := FGatherData.sddSubTenders.Records[i];
  54. ExportSubTenderToSheet(vRec.ValueByName('ID').AsInteger, FOExport.AddWorkSheet(vRec.ValueByName('Name').AsString));
  55. end;
  56. SaveFile(AFileName);
  57. finally
  58. AfterExport;
  59. end;
  60. end;
  61. procedure TstgErrorExcelExport.ExportSubTender(ARec: TsdDataRecord;
  62. const AFileName: string);
  63. begin
  64. BeforeExport;
  65. try
  66. GetExportor(ExtractFileExt(AFileName));
  67. ExportSubTenderToSheet(ARec.ValueByName('ID').AsInteger, FOExport.AddWorkSheet(ARec.ValueByName('Name').AsString));
  68. SaveFile(AFileName);
  69. finally
  70. AfterExport;
  71. end;
  72. end;
  73. procedure TstgErrorExcelExport.ExportSubTenderToSheet(ATenderID: Integer;
  74. ASheet: TExportWorkSheet);
  75. procedure ExportErrorRecord(ARec: TsdDataRecord);
  76. var
  77. vRow: TExportRow;
  78. vCell: TExportCell;
  79. begin
  80. vRow := ASheet.AddRow;
  81. vCell := vRow.AddCellString(ARec.ValueByName('RelaCode').AsString);
  82. vCell := vRow.AddCellString(ARec.ValueByName('RelaSerialNo').AsString);
  83. vCell.SetAlignment(cahCenter);
  84. vCell := vRow.AddCellString(ARec.ValueByName('DetailCode').AsString);
  85. vCell := vRow.AddCellString(ARec.ValueByName('DetailSerialNo').AsString);
  86. vCell.SetAlignment(cahCenter);
  87. vCell := vRow.AddCellString(GetErrorTypeText(ARec.ValueByName('ErrorType').AsInteger));
  88. end;
  89. var
  90. vIdx: TsdIndex;
  91. i, iBegin, iEnd: Integer;
  92. vRec: TsdDataRecord;
  93. begin
  94. InitSheet(ASheet);
  95. vIdx := GatherData.sddErrorDetail.FindIndex('idxTenderID');
  96. iBegin := vIdx.FindKeyIndex(ATenderID);
  97. iEnd := vIdx.FindKeyLastIndex(ATenderID);
  98. if iBegin = -1 then Exit;
  99. for i := iBegin to iEnd do
  100. ExportErrorRecord(vIdx.Records[i]);
  101. end;
  102. procedure TstgErrorExcelExport.InitSheet(ASheet: TExportWorkSheet);
  103. var
  104. vRow: TExportRow;
  105. vCell: TExportCellString;
  106. begin
  107. vRow := ASheet.AddRow;
  108. vCell := AddHeadCell(vRow, '出错源', 120);
  109. vCell.ColSpan := 2;
  110. vCell := AddHeadCell(vRow, '可计量清单', 80);
  111. vCell.ColSpan := 2;
  112. vCell := AddHeadCell(vRow, '错误原因', 200);
  113. vCell.RowSpan := 2;
  114. vRow := ASheet.Rows.Items[vRow.RowIndex + 1];
  115. vCell := AddHeadCell(vRow, '编号', 120);
  116. vCell := AddHeadCell(vRow, '行号', 50);
  117. vCell := AddHeadCell(vRow, '编号', 80);
  118. vCell := AddHeadCell(vRow, '行号', 50);
  119. end;
  120. { TstgExcelExport }
  121. function TstgExcelExport.AddHeadCell(ARow: TExportRow; const AHead: string;
  122. AWidth: Integer): TExportCellString;
  123. begin
  124. Result := ARow.AddCellString(AHead);
  125. Result.SetAlignment(cahCenter);
  126. Result.SetVAlignment(cavCenter);
  127. Result.Font.Name := '黑体';
  128. Result.Font.Size := 10;
  129. Result.Width := AWidth;
  130. end;
  131. procedure TstgExcelExport.AfterExport;
  132. begin
  133. FOExport.Free;
  134. if Assigned(FOExportor) then
  135. FOExportor.Free;
  136. if FileExists(FTempFile) then
  137. DeleteFile(FTempFile);
  138. end;
  139. procedure TstgExcelExport.BeforeExport;
  140. begin
  141. FOExport := TOExport.Create;
  142. FOExport.UseProgress := False;
  143. FTempFile := GetTempFileName;
  144. end;
  145. constructor TstgExcelExport.Create(AGatherData: TstgGatherData);
  146. begin
  147. FGatherData := AGatherData;
  148. end;
  149. function TstgExcelExport.GetExportor(
  150. const AFileType: string): TOCustomExporter;
  151. begin
  152. if SameText(AFileType, '.xls') then
  153. FOExportor := TOCustomExporterXLS.Create
  154. else //if SameText(AFileType, '.xlsx') then
  155. FOExportor := TOCustomExporterXLSX.Create;
  156. end;
  157. procedure TstgExcelExport.SaveFile(const AFileName: string);
  158. begin
  159. FOExport.SaveToFile(FTempFile, FOExportor);
  160. if not FileExists(AFileName) or QuestMessage('存在同名文件,是否替换?') then
  161. CopyFileOrFolder(FTempFile, AFileName);
  162. end;
  163. { TstgGatherExcelExport }
  164. procedure TstgGatherExcelExport.ExportGather(const AFileName: string);
  165. begin
  166. BeforeExport;
  167. try
  168. GetExportor(ExtractFileExt(AFileName));
  169. ExportGatherToSheet(OExport.AddWorkSheet('分包数据汇总'));
  170. SaveFile(AFileName);
  171. finally
  172. AfterExport;
  173. end;
  174. end;
  175. procedure TstgGatherExcelExport.ExportGatherToSheet(
  176. ASheet: TExportWorkSheet);
  177. var
  178. vTree: TsdIDTree;
  179. begin
  180. InitSheet(ASheet);
  181. vTree := TsdIDTree.Create;
  182. try
  183. vTree.KeyFieldName := 'ID';
  184. vTree.ParentFieldName := 'ParentID';
  185. vTree.NextSiblingFieldName := 'NextSiblingID';
  186. vTree.DataView := GatherData.sdvGatherTree;
  187. ExportTreeNodeToSheet(vTree.FirstNode, ASheet);
  188. finally
  189. vTree.Free;
  190. end;
  191. end;
  192. procedure TstgGatherExcelExport.ExportTreeNodeToSheet(ANode: TsdIDTreeNode;
  193. ASheet: TExportWorkSheet);
  194. procedure AddCellString(ARow: TExportRow; const AStr: string; AColor: TColor);
  195. var
  196. vCell: TExportCellString;
  197. begin
  198. vCell := ARow.AddCellString(AStr);
  199. vCell.Font.Color := AColor;
  200. end;
  201. procedure AddCellNumber(ARow: TExportRow; const ANum: Double; AColor: TColor);
  202. var
  203. vCell: TExportCellNumber;
  204. begin
  205. vCell := ARow.AddCellNumber(ANum);
  206. vCell.Font.Color := AColor;
  207. vCell.EmptyIfZero := True;
  208. end;
  209. var
  210. vColor: TColor;
  211. vRow: TExportRow;
  212. vCell: TExportCellNumber;
  213. begin
  214. if not Assigned(ANode) then Exit;
  215. if ANode.Rec.ValueByName('IsSubTender').AsBoolean then
  216. vColor := $00D5D5D5
  217. else
  218. vColor := clWindowText;
  219. vRow := ASheet.AddRow;
  220. AddCellString(vRow, ANode.Rec.ValueByName('Code').AsString, vColor);
  221. AddCellString(vRow, ANode.Rec.ValueByName('B_Code').AsString, vColor);
  222. AddCellString(vRow, ANode.Rec.ValueByName('Name').AsString, vColor);
  223. AddCellString(vRow, ANode.Rec.ValueByName('Units').AsString, vColor);
  224. AddCellNumber(vRow, ANode.Rec.ValueByName('DealQuantity').AsFloat, vColor);
  225. AddCellNumber(vRow, ANode.Rec.ValueByName('QcQuantity').AsFloat, vColor);
  226. ExportTreeNodeToSheet(ANode.FirstChild, ASheet);
  227. ExportTreeNodeToSheet(ANode.NextSibling, ASheet);
  228. end;
  229. procedure TstgGatherExcelExport.InitSheet(ASheet: TExportWorkSheet);
  230. var
  231. vRow: TExportRow;
  232. begin
  233. vRow := ASheet.AddRow;
  234. AddHeadCell(vRow, '项目节编号', 180);
  235. AddHeadCell(vRow, '清单编号', 80);
  236. AddHeadCell(vRow, '名称', 240);
  237. AddHeadCell(vRow, '单位', 50);
  238. AddHeadCell(vRow, '合同计量', 100);
  239. AddHeadCell(vRow, '数量变更计量', 100);
  240. end;
  241. end.