rpt_tpl_virtual_summary.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /**
  2. * Created by Tony on 2018/9/4.
  3. */
  4. let virtualSummaryOprObj = {
  5. summaryWorkBook: null,
  6. summaryParentNode: null,
  7. iniSpreadJs: function (summaryParentNode) {
  8. let me = this;
  9. if (me.summaryWorkBook === null) {
  10. me.summaryWorkBook = new GC.Spread.Sheets.Workbook($('#rptTplSummaryWorkbook')[0], {sheetCount: 1});
  11. me.summaryWorkBook.options.tabStripVisible = false;
  12. me.summaryWorkBook.options.allowCopyPasteExcelStyle = false;
  13. me.summaryWorkBook.options.allowUserDragDrop = false;
  14. me.summaryWorkBook.options.allowContextMenu = false;
  15. let sheet = me.summaryWorkBook.getActiveSheet();
  16. sheet.options.allowCellOverflow = false;
  17. sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
  18. sheet.bind(GC.Spread.Sheets.Events.EnterCell, me.onCellEnter);
  19. }
  20. me.summaryParentNode = summaryParentNode;
  21. },
  22. restoreSummary: function () {
  23. let me = this;
  24. let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
  25. me.setupSummary(rptTpl, me.summaryParentNode);
  26. },
  27. setupSummary: function (rptTpl, summaryParentNode) {
  28. let me = this, columnParentNode = null;
  29. let selectedBand = virtualCommonOprObj.getBandEx(summaryParentNode[JV.PROP_BAND_NAME], rptTpl);
  30. if (summaryParentNode && selectedBand) {
  31. let preNode = summaryParentNode.getPreNode();
  32. while (preNode) {
  33. if (preNode[JV.PROP_NAME] === JV.NODE_FLOW_COLUMN) {
  34. columnParentNode = preNode;
  35. break;
  36. } else {
  37. preNode = preNode.getPreNode();
  38. }
  39. }
  40. let fieldNode = summaryParentNode.items[0], textNode = summaryParentNode.items[1];
  41. if (columnParentNode) {
  42. let yColumnPos = [], xPos = [], ySummaryPos = [0], xSummaryPos = [0];
  43. let sheet = me.summaryWorkBook.getActiveSheet();
  44. let columnBand = virtualCommonOprObj.getBandEx(columnParentNode[JV.PROP_BAND_NAME], rptTpl);
  45. let bandH = Math.round(parseFloat(columnBand[JV.BAND_PROP_HEIGHT]) / 2.54 * 96);
  46. let bandW = 700;
  47. let pIdx = JV.PAGES_SIZE_STR.indexOf(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE]);
  48. if (pIdx >= 0) {
  49. bandW = Math.round(JV.PAGES_SIZE[pIdx][0] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) /2.54*96 );
  50. if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE ||
  51. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE_CHN) {
  52. bandW = Math.round(JV.PAGES_SIZE[pIdx][1] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) /2.54*96 );
  53. }
  54. }
  55. //1. 设置column位置(让用户知道位置,后期无需用户再调)
  56. for (let itemNode of columnParentNode.items) {
  57. virtualCommonOprObj.pushPos(itemNode, itemNode[JV.PROP_AREA][JV.PROP_H_CALCULATION], JV.PROP_LEFT, bandW, xPos);
  58. virtualCommonOprObj.pushPos(itemNode, itemNode[JV.PROP_AREA][JV.PROP_H_CALCULATION], JV.PROP_RIGHT, bandW, xPos);
  59. virtualCommonOprObj.pushPos(itemNode, itemNode[JV.PROP_AREA][JV.PROP_V_CALCULATION], JV.PROP_TOP, bandH, yColumnPos);
  60. virtualCommonOprObj.pushPos(itemNode, itemNode[JV.PROP_AREA][JV.PROP_V_CALCULATION], JV.PROP_BOTTOM, bandH, yColumnPos);
  61. }
  62. sheet.setRowCount(yColumnPos.length - 1, GC.Spread.Sheets.SheetArea.colHeader);
  63. sheet.setColumnCount(xPos.length - 1, GC.Spread.Sheets.SheetArea.viewport);
  64. // sheet.clear();
  65. xPos.sort(function(x1, x2){
  66. return (x1 - x2);
  67. });
  68. yColumnPos.sort(function(y1, y2){
  69. return (y1 - y2);
  70. });
  71. for (let idx = 1; idx < xPos.length; idx++) {
  72. sheet.setColumnWidth(idx - 1, xPos[idx] - xPos[idx - 1]);
  73. }
  74. for (let idx = 1; idx < yColumnPos.length; idx++) {
  75. sheet.setRowHeight(idx - 1, yColumnPos[idx] - yColumnPos[idx - 1]);
  76. sheet.getRange(idx - 1, -1, 1, -1).backColor(undefined);
  77. }
  78. for (let itemNode of columnParentNode.items) {
  79. let idx1 = xPos.indexOf(virtualCommonOprObj.getActPosEx(itemNode, itemNode[JV.PROP_AREA][JV.PROP_H_CALCULATION], JV.PROP_LEFT, bandW, xPos));
  80. let idx2 = xPos.indexOf(virtualCommonOprObj.getActPosEx(itemNode, itemNode[JV.PROP_AREA][JV.PROP_H_CALCULATION], JV.PROP_RIGHT, bandW, xPos));
  81. let idy1 = yColumnPos.indexOf(virtualCommonOprObj.getActPosEx(itemNode, itemNode[JV.PROP_AREA][JV.PROP_V_CALCULATION], JV.PROP_TOP, bandH, yColumnPos));
  82. let idy2 = yColumnPos.indexOf(virtualCommonOprObj.getActPosEx(itemNode, itemNode[JV.PROP_AREA][JV.PROP_V_CALCULATION], JV.PROP_BOTTOM, bandH, yColumnPos));
  83. if (idx2 - idx1 > 1 || idy2 - idy1 > 1) {
  84. sheet.addSpan(idy1, idx1, idy2 - idy1, idx2 - idx1, GC.Spread.Sheets.SheetArea.colHeader);
  85. }
  86. me.private_setupCell(sheet.getCell(idy1, idx1, GC.Spread.Sheets.SheetArea.colHeader), rptTpl, itemNode);
  87. }
  88. //2. 设置已有的统计信息
  89. let sumBandH = Math.round(parseFloat(selectedBand[JV.BAND_PROP_HEIGHT]) / 2.54 * 96);
  90. for (let fNode of fieldNode.items) {
  91. virtualCommonOprObj.pushPos(fNode, fNode[JV.PROP_AREA][JV.PROP_H_CALCULATION], JV.PROP_LEFT, bandW, xSummaryPos);
  92. virtualCommonOprObj.pushPos(fNode, fNode[JV.PROP_AREA][JV.PROP_H_CALCULATION], JV.PROP_RIGHT, bandW, xSummaryPos);
  93. virtualCommonOprObj.pushPos(fNode, fNode[JV.PROP_AREA][JV.PROP_V_CALCULATION], JV.PROP_TOP, sumBandH, ySummaryPos);
  94. virtualCommonOprObj.pushPos(fNode, fNode[JV.PROP_AREA][JV.PROP_V_CALCULATION], JV.PROP_BOTTOM, sumBandH, ySummaryPos);
  95. }
  96. for (let tNode of textNode.items) {
  97. virtualCommonOprObj.pushPos(tNode, tNode[JV.PROP_AREA][JV.PROP_H_CALCULATION], JV.PROP_LEFT, bandW, xSummaryPos);
  98. virtualCommonOprObj.pushPos(tNode, tNode[JV.PROP_AREA][JV.PROP_H_CALCULATION], JV.PROP_RIGHT, bandW, xSummaryPos);
  99. virtualCommonOprObj.pushPos(tNode, tNode[JV.PROP_AREA][JV.PROP_V_CALCULATION], JV.PROP_TOP, sumBandH, ySummaryPos);
  100. virtualCommonOprObj.pushPos(tNode, tNode[JV.PROP_AREA][JV.PROP_V_CALCULATION], JV.PROP_BOTTOM, sumBandH, ySummaryPos);
  101. }
  102. sheet.setRowCount(ySummaryPos.length - 1, GC.Spread.Sheets.SheetArea.viewport);
  103. }
  104. }
  105. },
  106. addRow: function () {
  107. let me = this,
  108. sheet = me.summaryWorkBook.getActiveSheet();
  109. sheet.addRows(sheet.getRowCount() - 1, 1);
  110. let rc = sheet.getRowCount();
  111. for (let cc = 0; cc < sheet.getColumnCount(); cc++) {
  112. me.private_setupCellDft(sheet.getCell(rc - 2, cc));
  113. }
  114. },
  115. deleteRow: function () {
  116. let me = this,
  117. sheet = me.summaryWorkBook.getActiveSheet(),
  118. selectedRanges = sheet.getSelections()
  119. ;
  120. if (selectedRanges.length > 0) {
  121. sheet.deleteRows(selectedRanges[0].row, 1);
  122. }
  123. },
  124. onCellEnter: function (sender, args) {
  125. let me = virtualSummaryOprObj,
  126. sheet = me.summaryWorkBook.getActiveSheet();
  127. if (args.row === sheet.getRowCount() - 1) {
  128. } else {
  129. }
  130. },
  131. mergeCells: function () {
  132. let me = virtualSummaryOprObj,
  133. sheet = me.summaryWorkBook.getActiveSheet();
  134. let selectedRanges = sheet.getSelections();
  135. if (selectedRanges.length > 0) {
  136. sheet.suspendPaint();
  137. sheet.addSpan(selectedRanges[0].row, selectedRanges[0].col, selectedRanges[0].rowCount, selectedRanges[0].colCount);
  138. sheet.resumePaint();
  139. }
  140. },
  141. disMergeCells: function () {
  142. let me = virtualSummaryOprObj,
  143. sheet = me.summaryWorkBook.getActiveSheet();
  144. let selectedRanges = sheet.getSelections();
  145. let spans =sheet.getSpans();
  146. if (selectedRanges.length > 0 && spans.length > 0) {
  147. let selectedSpans = [];
  148. for(let i = 0; i < spans.length; i++)
  149. {
  150. for (let j = 0; j < selectedRanges.length; j++) {
  151. if (spans[i].row >= selectedRanges[j].row && spans[i].col >= selectedRanges[j].col &&
  152. spans[i].row <= selectedRanges[j].row + selectedRanges[j].rowCount && spans[i].col <= selectedRanges[j].col + selectedRanges[j].colCount) {
  153. selectedSpans.push(spans[i]);
  154. }
  155. }
  156. }
  157. for (let span of selectedSpans) {
  158. sheet.removeSpan(span.row, span.col, GC.Spread.Sheets.SheetArea.viewport);
  159. }
  160. }
  161. },
  162. changeCtrl: function (dom) {
  163. let me = virtualSummaryOprObj,
  164. sheet = me.summaryWorkBook.getActiveSheet()
  165. ;
  166. let selectedRanges = sheet.getSelections();
  167. for(let i = 0; i < selectedRanges.length; i++){
  168. // let ctrl = me.columnFieldCtrls[selectedRanges[i].col]
  169. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK]] = 'F';
  170. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHOW_ZERO]] = 'F';
  171. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] = 'F';
  172. // ctrl.isNarrow = false;
  173. // ctrl.isAutoHeight = false;
  174. // if ($("#eleShrinkEx")[0].checked) {
  175. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK]] = 'T';
  176. // }
  177. // if ($("#eleShowZeroEx")[0].checked) {
  178. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHOW_ZERO]] = 'T';
  179. // }
  180. // if ($("#eleAutoWrapEx")[0].checked) {
  181. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] = 'T';
  182. // }
  183. // if ($("#eleIsNarrowEx")[0].checked) {
  184. // ctrl.isNarrow = true;
  185. // }
  186. // if ($("#eleIsAutoHeightEx")[0].checked) {
  187. // ctrl.isAutoHeight = true;
  188. // }
  189. //
  190. // if ($("#hOptionLeft")[0].checked) {
  191. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] = JV.OUTPUT_ALIGN.H[0];
  192. // } else if ($("#hOptionCenter")[0].checked) {
  193. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] = JV.OUTPUT_ALIGN.H[1];
  194. // } else {
  195. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] = JV.OUTPUT_ALIGN.H[2];
  196. // }
  197. // if ($("#vOptionUp")[0].checked) {
  198. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] = JV.OUTPUT_ALIGN.V[0];
  199. // } else if ($("#vOptionCenter")[0].checked) {
  200. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] = JV.OUTPUT_ALIGN.V[1];
  201. // } else {
  202. // ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] = JV.OUTPUT_ALIGN.V[2];
  203. // }
  204. }
  205. },
  206. private_setupCellDft: function (cell) {
  207. cell.font(`9pt 宋体`);
  208. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
  209. cell.vAlign(GC.Spread.Sheets.VerticalAlign.center);
  210. cell.wordWrap(true);
  211. cell.value(``);
  212. },
  213. private_setupCell: function (cell, rptTpl, textNode) {
  214. let me = this;
  215. me.private_setCellFont(cell, textNode);
  216. me.private_setCellControl(cell, textNode);
  217. me.private_setCellStyle(cell, textNode);
  218. let value = textNode[JV.PROP_NAME];
  219. if (textNode[JV.PROP_NAME].indexOf(`|`) >= 0) {
  220. value = textNode[JV.PROP_NAME].split('|').join('\n');
  221. }
  222. cell.wordWrap(true);
  223. cell.value(value);
  224. },
  225. private_setCellControl: function (cell, textNode) {
  226. let ctrl = null;
  227. if (typeof textNode[JV.PROP_CONTROL] === 'string') {
  228. let idx = rpt_tpl_cfg_helper.reportCfg.controlArr.indexOf(textNode[JV.PROP_CONTROL]);
  229. ctrl = rpt_tpl_cfg_helper.reportCfg.ctrls[idx];
  230. } else {
  231. ctrl = textNode[JV.PROP_CONTROL];
  232. }
  233. if (ctrl) {
  234. switch (ctrl.Horizon) {
  235. case `center`:
  236. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
  237. break;
  238. case `right`:
  239. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.right);
  240. break;
  241. default:
  242. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
  243. break;
  244. }
  245. switch (ctrl.Vertical) {
  246. case `center`:
  247. cell.vAlign(GC.Spread.Sheets.VerticalAlign.center);
  248. break;
  249. case `bottom`:
  250. cell.vAlign(GC.Spread.Sheets.VerticalAlign.bottom);
  251. break;
  252. default:
  253. cell.vAlign(GC.Spread.Sheets.VerticalAlign.top);
  254. break;
  255. }
  256. }
  257. },
  258. private_setCellStyle: function (cell, textNode) {
  259. //默认是normal,暂时不管
  260. },
  261. private_setCellFont: function (cell, textNode) {
  262. for (let font of rpt_tpl_cfg_helper.reportCfg.fonts) {
  263. if (font.ID === textNode[JV.PROP_FONT]) {
  264. cell.font(Math.round(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]] * 3 / 4) + 'pt ' + font[JV.FONT_PROPS[JV.FONT_PROP_IDX_NAME]]);
  265. break;
  266. }
  267. }
  268. },
  269. applySummaryBack: function () {
  270. let me = this;
  271. let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
  272. if (rptTpl && me.summaryParentNode) {
  273. let sheet = me.summaryWorkBook.getActiveSheet();
  274. let rAmt = sheet.getRowCount(), pixH = [0];
  275. if (rAmt > 0) {
  276. let texts = [], colWidthArr = [], rowHeightArr = [];
  277. virtualCommonOprObj.collectSheetTxt(sheet, texts, colWidthArr, rowHeightArr);
  278. for (let node of summaryParentNode.items) {
  279. dataInfoMapTreeOprObj.treeObj.removeChildNodes(node);
  280. }
  281. let txtNodes = [], fieldNodes = [];
  282. for (let text of texts) {
  283. if (!stringUtil.isEmptyString(text[`text`]) && text[`text`].indexOf(`{`) === 0) {
  284. //创建指标
  285. } else {
  286. //创建文本
  287. let node = virtualCommonOprObj.createTxtNode(text, me.columnParentNode, colWidthArr, rowHeightArr);
  288. txtNodes.push(node);
  289. }
  290. }
  291. //....
  292. let selectedBand = virtualCommonOprObj.getBandEx(summaryParentNode[JV.PROP_BAND_NAME], rptTpl);
  293. selectedBand[JV.BAND_PROP_HEIGHT] = (rowHeightArr[rowHeightArr.length - 1] / 96 * 2.54).toFixed(2);
  294. } else {
  295. displayMessage("模板行数量不足!", "red", 2000, "id_summary_setup_lbl");
  296. }
  297. }
  298. }
  299. };