rpt_tpl_vis_jumbo.js 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455
  1. /**
  2. * Created by Tony on 2018/9/10.
  3. */
  4. let visualJumbo = {
  5. tplWorkBook: null,
  6. bandMappingObj: null,
  7. iniSpreadJs: function () {
  8. let me = this;
  9. if (me.tplWorkBook !== null) {
  10. me.tplWorkBook.destroy();
  11. me.tplWorkBook = null;
  12. }
  13. me.tplWorkBook = new GC.Spread.Sheets.Workbook($('#ele_visual_div_main3')[0], {sheetCount: 1});
  14. me.tplWorkBook.options.tabStripVisible = false;
  15. me.tplWorkBook.options.allowCopyPasteExcelStyle = false;
  16. me.tplWorkBook.options.allowUserDragDrop = false;
  17. me.tplWorkBook.options.allowContextMenu = false;
  18. let sheet = me.tplWorkBook.getActiveSheet();
  19. sheet.options.allowCellOverflow = false;
  20. sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
  21. sheet.bind(GC.Spread.Sheets.Events.CellClick, me.onCellEnter);
  22. },
  23. setupTpl: function () {
  24. let me = this;
  25. let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
  26. if (rptTpl && me.tplWorkBook) {
  27. let sheet = me.tplWorkBook.getActiveSheet();
  28. let border = new GC.Spread.Sheets.LineBorder;
  29. border.color = "Black";
  30. border.style = GC.Spread.Sheets.LineStyle.thin;
  31. let pageH, pageW;
  32. let pIdx = JV.PAGES_SIZE_STR.indexOf(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE]);
  33. pageW = 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 );
  34. pageH = Math.round(JV.PAGES_SIZE[pIdx][1] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM])) /2.54*96 );
  35. if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE ||
  36. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE_CHN) {
  37. pageW = 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 );
  38. pageH = Math.round(JV.PAGES_SIZE[pIdx][0] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM])) /2.54*96 );
  39. }
  40. sheet.suspendPaint();
  41. sheet.setRowCount(0);
  42. sheet.setColumnCount(0);
  43. if (rptTpl[JV.NODE_FLOW_INFO] || rptTpl[JV.NODE_BILL_INFO]) {
  44. //流水式/账单式
  45. me.setupFlowBillTpl(rptTpl, sheet, border, pageW, pageH);
  46. } else if (rptTpl[JV.NODE_CROSS_INFO]) {
  47. //交叉式
  48. //目前暂缓
  49. me.setupCrossTpl(rptTpl, sheet, border, pageW, pageH);
  50. }
  51. sheet.clearSelection();
  52. sheet.resumePaint();
  53. }
  54. },
  55. setupFlowBillTpl: function (rptTpl, sheet, border, pageW, pageH) {
  56. let me = this;
  57. //1. put the pos into array
  58. let xPos = [0], yPos = [0];
  59. xPos.push(pageW);
  60. yPos.push(pageH);
  61. let bandMappingObj = {};
  62. me.bandMappingObj = bandMappingObj;
  63. visualCommonOprObj.addBandPos(rptTpl, pageW, pageH, xPos, yPos, bandMappingObj);
  64. visualCommonOprObj.addTplTxtFldPos(rptTpl, dataInfoMapTreeOprObj.treeObj, xPos, yPos, bandMappingObj);
  65. //2. 设置spreadjs
  66. xPos.sort(function(x1, x2){ return (x1 - x2); });
  67. yPos.sort(function(y1, y2){ return (y1 - y2); });
  68. sheet.setRowCount(yPos.length - 1);
  69. sheet.setColumnCount(xPos.length - 1);
  70. for (let idx = 1; idx < xPos.length; idx++) {
  71. sheet.setColumnWidth(idx - 1, xPos[idx] - xPos[idx - 1]);
  72. }
  73. for (let idx = 1; idx < yPos.length; idx++) {
  74. sheet.setRowHeight(idx - 1, yPos[idx] - yPos[idx - 1]);
  75. sheet.getRange(idx - 1, -1, 1, -1).backColor(undefined);
  76. }
  77. visualCommonOprObj.brushSheet(bandMappingObj, sheet, xPos, yPos);
  78. visualCommonOprObj.setupTplTxtFld(rptTpl, dataInfoMapTreeOprObj.treeObj, sheet, xPos, yPos, bandMappingObj)
  79. for (let idx = 1; idx < yPos.length; idx++) {
  80. let bkc = sheet.getCell(idx - 1, 0).backColor();
  81. if (bkc === 'White') {
  82. sheet.setRowHeight(idx - 1, 30);
  83. }
  84. }
  85. for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
  86. for (let iCol = 0; iCol < sheet.getColumnCount(); iCol++) {
  87. let cell = sheet.getCell(iRow, iCol);
  88. if (cell.backColor() === 'LightGray' || cell.backColor() === 'LightCyan') {
  89. visualCommonOprObj.setupBorder(sheet.getCell(iRow, iCol), border);
  90. } else if (cell.backColor() === 'White') {
  91. sheet.addSpan(iRow, 0, 1, sheet.getColumnCount());
  92. break;
  93. }
  94. }
  95. }
  96. },
  97. setupCrossTpl: function (rptTpl, sheet, border) {
  98. },
  99. onCellEnter: function (sender, args) {
  100. let me = visualJumbo,
  101. sheet = me.tplWorkBook.getActiveSheet();
  102. me.setupCfg(sheet, args.row, args.col);
  103. },
  104. setupCfg: function (sheet, row, col) {
  105. let me = visualJumbo,
  106. cell = sheet.getCell(row, col);
  107. if (cell.backColor() !== 'White') {
  108. //0. 设置UI
  109. $(`#visElementFonts`)[0].removeAttribute("disabled");
  110. $("#elementBordersVis")[0].removeAttribute("disabled");
  111. $("#elementControlsVis")[0].removeAttribute("disabled");
  112. $(`#visRdIsText`)[0].removeAttribute("disabled");
  113. $(`#visRdIsField`)[0].removeAttribute("disabled");
  114. $(`#eleIsAutoHeightVis`)[0].removeAttribute("disabled");
  115. $(`#font_other_properties_div`)[0].style.display = "none";
  116. me.private_ShowBandName(cell);
  117. //1. font
  118. let fontAttr = me.bandMappingObj.fontAttr[row + "_" + col + "_font"];
  119. if (fontAttr) {
  120. me._setupFont(fontAttr);
  121. }
  122. let borderAttr = me.bandMappingObj.borderAttr[row + "_" + col + "_border"];
  123. if (borderAttr) {
  124. me._setupBorder(borderAttr);
  125. }
  126. let ctrlAttr = me.bandMappingObj.ctrlAttr[row + "_" + col + "_ctrl"];
  127. if (ctrlAttr) {
  128. me._setupCtrl(ctrlAttr);
  129. }
  130. //2. alignment
  131. switch (cell.hAlign()) {
  132. case GC.Spread.Sheets.HorizontalAlign.center:
  133. $(`#hAlign_left`)[0].className = "btn btn-sm btn-outline-secondary";
  134. $(`#hAlign_center`)[0].className = "btn btn-sm btn-outline-secondary active";
  135. $(`#hAlign_right`)[0].className = "btn btn-sm btn-outline-secondary";
  136. break;
  137. case GC.Spread.Sheets.HorizontalAlign.right:
  138. $(`#hAlign_left`)[0].className = "btn btn-sm btn-outline-secondary";
  139. $(`#hAlign_center`)[0].className = "btn btn-sm btn-outline-secondary";
  140. $(`#hAlign_right`)[0].className = "btn btn-sm btn-outline-secondary active";
  141. break;
  142. case GC.Spread.Sheets.HorizontalAlign.left:
  143. default:
  144. $(`#hAlign_left`)[0].className = "btn btn-sm btn-outline-secondary active";
  145. $(`#hAlign_center`)[0].className = "btn btn-sm btn-outline-secondary";
  146. $(`#hAlign_right`)[0].className = "btn btn-sm btn-outline-secondary";
  147. break;
  148. }
  149. switch (cell.vAlign()) {
  150. case GC.Spread.Sheets.VerticalAlign.bottom:
  151. $(`#vAlign_center`)[0].className = "btn btn-sm btn-outline-secondary";
  152. $(`#vAlign_bottom`)[0].className = "btn btn-sm btn-outline-secondary active";
  153. break;
  154. case GC.Spread.Sheets.VerticalAlign.center:
  155. default:
  156. $(`#vAlign_center`)[0].className = "btn btn-sm btn-outline-secondary active";
  157. $(`#vAlign_bottom`)[0].className = "btn btn-sm btn-outline-secondary";
  158. break;
  159. }
  160. //3. other control
  161. if (cell.shrinkToFit()) {
  162. $(`#vis_shrink`)[0].className = "btn btn-sm btn-outline-secondary active";
  163. } else {
  164. $(`#vis_shrink`)[0].className = "btn btn-sm btn-outline-secondary";
  165. }
  166. if (cell.wordWrap()) {
  167. $(`#vis_wrap`)[0].className = "btn btn-sm btn-outline-secondary active";
  168. } else {
  169. $(`#vis_wrap`)[0].className = "btn btn-sm btn-outline-secondary";
  170. }
  171. let border = cell.borderLeft();
  172. let bottomBorder = cell.borderBottom();
  173. if (border && border.style === GC.Spread.Sheets.LineStyle.thin) {
  174. $(`#vis_outter_border`)[0].className = "btn btn-sm btn-outline-secondary active";
  175. $(`#vis_bottom_border`)[0].className = "btn btn-sm btn-outline-secondary";
  176. $(`#vis_no_border`)[0].className = "btn btn-sm btn-outline-secondary";
  177. } else if (bottomBorder && bottomBorder.style === GC.Spread.Sheets.LineStyle.thin){
  178. $(`#vis_outter_border`)[0].className = "btn btn-sm btn-outline-secondary";
  179. $(`#vis_bottom_border`)[0].className = "btn btn-sm btn-outline-secondary active";
  180. $(`#vis_no_border`)[0].className = "btn btn-sm btn-outline-secondary";
  181. } else {
  182. $(`#vis_outter_border`)[0].className = "btn btn-sm btn-outline-secondary";
  183. $(`#vis_bottom_border`)[0].className = "btn btn-sm btn-outline-secondary";
  184. $(`#vis_no_border`)[0].className = "btn btn-sm btn-outline-secondary active";
  185. }
  186. //4. txt/field
  187. let val = cell.value();
  188. if (cell.cellType() && cell.cellType().typeName === '7') {
  189. $(`#visRdIsField`)[0].checked = true;
  190. $(`#lblIsAutoHeightVis`)[0].style.display = "";
  191. me.private_enable_pre_suff(cell);
  192. me.private_set_field_to_pre_suf(cell);
  193. if (!stringUtil.isEmptyString(val) && val.indexOf(`{`) === 0) {
  194. $(`#eleIsAutoHeightVis`)[0].checked = true;
  195. } else {
  196. $(`#eleIsAutoHeightVis`)[0].checked = false;
  197. }
  198. } else if (stringUtil.isEmptyString(val) && (!border || border.style === GC.Spread.Sheets.LineStyle.empty)) {
  199. $(`#visRdIsBlank`)[0].checked = true;
  200. $(`#lblIsAutoHeightVis`)[0].style.display = "none";
  201. me.private_disable_pre_suff();
  202. } else {
  203. $(`#visRdIsText`)[0].checked = true;
  204. $(`#lblIsAutoHeightVis`)[0].style.display = "none";
  205. me.private_disable_pre_suff();
  206. }
  207. } else {
  208. $("#visElementFonts")[0].disabled = "disabled" ;
  209. $("#elementBordersVis")[0].disabled = "disabled" ;
  210. $("#elementControlsVis")[0].disabled = "disabled" ;
  211. $("#visRdIsText")[0].disabled = "disabled" ;
  212. $("#visRdIsField")[0].disabled = "disabled" ;
  213. $("#eleIsAutoHeightVis")[0].disabled = "disabled" ;
  214. $("#id_vis_setup_lbl")[0].innerHTML = '...';
  215. me.private_disable_pre_suff();
  216. }
  217. },
  218. private_disable_pre_suff: function () {
  219. let ele1 = $(`#elePrefix_Vis`)[0];
  220. let ele2 = $(`#eleFormat_Vis`)[0];
  221. let ele3 = $(`#eleDftValue_Vis`)[0];
  222. let ele4 =$(`#eleSuffix_Vis`)[0];
  223. ele1.disabled = "disabled" ;
  224. ele2.disabled = "disabled" ;
  225. ele3.disabled = "disabled" ;
  226. ele4.disabled = "disabled" ;
  227. ele1.value = ``;
  228. ele2.value = ``;
  229. ele3.value = ``;
  230. ele4.value = ``;
  231. },
  232. private_enable_pre_suff: function (cell) {
  233. $(`#elePrefix_Vis`)[0].removeAttribute("disabled");
  234. $(`#eleFormat_Vis`)[0].removeAttribute("disabled");
  235. $(`#eleDftValue_Vis`)[0].removeAttribute("disabled");
  236. $(`#eleSuffix_Vis`)[0].removeAttribute("disabled");
  237. },
  238. private_set_field_to_pre_suf: function (cell) {
  239. let me = visualJumbo;
  240. let ele1 = $(`#elePrefix_Vis`)[0];
  241. let ele2 = $(`#eleFormat_Vis`)[0];
  242. let ele3 = $(`#eleDftValue_Vis`)[0];
  243. let ele4 =$(`#eleSuffix_Vis`)[0];
  244. let fps = me.bandMappingObj.fieldPreSufAttr[cell.row + "_" + cell.col + "_fieldPreSuf"];
  245. if (fps) {
  246. ele1.value = (stringUtil.isEmptyString(fps[JV.PROP_PREFIX]))?``:fps[JV.PROP_PREFIX];
  247. ele2.value = (stringUtil.isEmptyString(fps[JV.PROP_FORMAT]))?``:fps[JV.PROP_FORMAT];
  248. ele3.value = (stringUtil.isEmptyString(fps[JV.PROP_DFT_VALUE]))?``:fps[JV.PROP_DFT_VALUE];
  249. ele4.value = (stringUtil.isEmptyString(fps[JV.PROP_SUFFIX]))?``:fps[JV.PROP_SUFFIX];
  250. } else {
  251. ele1.value = ``;
  252. ele2.value = ``;
  253. ele3.value = ``;
  254. ele4.value = ``;
  255. }
  256. },
  257. restoreTpl: function () {
  258. let me = visualJumbo;
  259. if (me.tplWorkBook) {
  260. me.setupTpl();
  261. }
  262. },
  263. private_ShowBandName: function (cell) {
  264. let me = visualJumbo;
  265. if (me.bandMappingObj) {
  266. let color = cell.backColor();
  267. if (color && color !== 'White') {
  268. for (let bItem of me.bandMappingObj.items) {
  269. if (bItem[JV.PROP_COLOR] === color) {
  270. $("#id_vis_setup_lbl")[0].innerHTML = bItem[JV.PROP_BAND_NAME];
  271. break;
  272. }
  273. }
  274. } else {
  275. $("#id_vis_setup_lbl")[0].innerHTML = '...';
  276. }
  277. }
  278. },
  279. private_AddCols: function (sheet, col) {
  280. sheet.suspendPaint();
  281. sheet.addColumns(col, 1);
  282. sheet.resumePaint();
  283. },
  284. insertColumn: function () {
  285. let me = visualJumbo,
  286. sheet = me.tplWorkBook.getActiveSheet();
  287. let selectedRanges = sheet.getSelections();
  288. if (selectedRanges.length > 0) {
  289. me.private_AddCols(sheet, selectedRanges[0].col);
  290. }
  291. },
  292. addColumn: function () {
  293. let me = visualJumbo,
  294. sheet = me.tplWorkBook.getActiveSheet();
  295. me.private_AddCols(sheet, sheet.getColumnCount());
  296. },
  297. splitColumn: function (newColAmt) {
  298. let me = visualJumbo,
  299. sheet = me.tplWorkBook.getActiveSheet();
  300. let selectedRanges = sheet.getSelections();
  301. if (selectedRanges.length > 0) {
  302. if (selectedRanges[0].colCount <= newColAmt) {
  303. let width = 0;
  304. for (let iCol = 0; iCol < selectedRanges[0].colCount; iCol++) {
  305. width += sheet.getColumnWidth(selectedRanges[0].col + iCol);
  306. }
  307. let avgW = Math.round(width / newColAmt),
  308. lastW = width - avgW * (newColAmt - 1);
  309. sheet.suspendPaint();
  310. sheet.addColumns(selectedRanges[0].col + selectedRanges[0].colCount, newColAmt - selectedRanges[0].colCount);
  311. sheet.setColumnWidth(selectedRanges[0].col, lastW);
  312. for (let iCol = 1; iCol < newColAmt; iCol++) {
  313. sheet.setColumnWidth(selectedRanges[0].col + iCol, avgW);
  314. }
  315. for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
  316. let cell = sheet.getCell(iRow, selectedRanges[0].col);
  317. for (let iCol = selectedRanges[0].colCount; iCol < newColAmt; iCol++) {
  318. visualCommonOprObj.copyPropertiesForSplittedCell(cell, sheet.getCell(iRow, iCol + selectedRanges[0].col));
  319. }
  320. }
  321. sheet.resumePaint();
  322. } else {
  323. alert(`您选择的列数量比要拆分的数量还大!`);
  324. }
  325. }
  326. },
  327. deleteColumn: function () {
  328. let me = visualJumbo,
  329. sheet = me.tplWorkBook.getActiveSheet();
  330. let selectedRanges = sheet.getSelections();
  331. let cc = sheet.getColumnCount();
  332. if (cc > 1) {
  333. if (selectedRanges.length > 0) {
  334. sheet.deleteColumns(selectedRanges[0].col, 1);
  335. }
  336. } else {
  337. alert('不能删除列!');
  338. }
  339. },
  340. addRow: function () {
  341. let me = visualJumbo,
  342. sheet = me.tplWorkBook.getActiveSheet();
  343. let selectedRanges = sheet.getSelections();
  344. if (selectedRanges.length > 0) {
  345. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  346. let color = cell.backColor();
  347. if (color !== 'White') {
  348. let nextIdx = sheet.getRowCount();
  349. for (let idx = selectedRanges[0].row + 1; idx < sheet.getRowCount(); idx++) {
  350. if (sheet.getCell(idx, selectedRanges[0].col).backColor() !== color) {
  351. nextIdx = idx;
  352. break;
  353. }
  354. }
  355. sheet.suspendPaint();
  356. sheet.addRows(nextIdx, 1);
  357. sheet.getRange(nextIdx, -1, 1, -1).backColor(color);
  358. sheet.resumePaint();
  359. }
  360. }
  361. },
  362. splitRows: function (newRowAmt) {
  363. let me = visualJumbo,
  364. sheet = me.tplWorkBook.getActiveSheet();
  365. let selectedRanges = sheet.getSelections();
  366. if (selectedRanges.length > 0) {
  367. let firstCell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  368. let isSameBand = true;
  369. for (let iRow = 1; iRow < selectedRanges[0].rowCount; iRow++) {
  370. if (sheet.getCell(iRow + selectedRanges[0].row, 0).backColor() !== firstCell.backColor()) {
  371. isSameBand = false;
  372. break;
  373. }
  374. }
  375. if (isSameBand) {
  376. if (firstCell.backColor() !== 'White') {
  377. if (selectedRanges[0].rowCount <= newRowAmt) {
  378. let height = 0;
  379. for (let iRow = 0; iRow < selectedRanges[0].rowCount; iRow++) {
  380. height += sheet.getRowHeight(selectedRanges[0].row + iRow);
  381. }
  382. let avgH = Math.round(height / newRowAmt),
  383. lastH = height - avgH * (newRowAmt - 1);
  384. sheet.suspendPaint();
  385. sheet.addRows(selectedRanges[0].row + selectedRanges[0].rowCount, newRowAmt - selectedRanges[0].rowCount);
  386. sheet.setRowHeight(selectedRanges[0].row, lastH);
  387. for (let iRow = 1; iRow < newRowAmt; iRow++) {
  388. sheet.setRowHeight(selectedRanges[0].row + iRow, avgH);
  389. }
  390. for (let iRow = selectedRanges[0].rowCount; iRow < newRowAmt; iRow++) {
  391. let cell = sheet.getCell(selectedRanges[0].row, 0);
  392. for (let iCol = 0; iCol < sheet.getColumnCount(); iCol++) {
  393. visualCommonOprObj.copyPropertiesForSplittedCell(cell, sheet.getCell(iRow + selectedRanges[0].row, iCol));
  394. }
  395. }
  396. sheet.resumePaint();
  397. } else {
  398. alert(`您选择的行数量比要拆分的数量还大!`);
  399. }
  400. }
  401. } else {
  402. alert(`不能拆分跨界行!`);
  403. }
  404. }
  405. },
  406. deleteRow: function () {
  407. let me = visualJumbo,
  408. sheet = me.tplWorkBook.getActiveSheet();
  409. let selectedRanges = sheet.getSelections();
  410. if (selectedRanges.length > 0) {
  411. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  412. let color = cell.backColor();
  413. if (color !== 'White') {
  414. let amt = 0;
  415. for (let idx = 0; idx < sheet.getRowCount(); idx++) {
  416. if (sheet.getCell(idx, selectedRanges[0].col).backColor() === color) {
  417. amt++
  418. }
  419. }
  420. if (amt > 1) {
  421. sheet.suspendPaint();
  422. sheet.deleteRows(selectedRanges[0].row, 1);
  423. sheet.resumePaint();
  424. }
  425. }
  426. }
  427. },
  428. fitTheWidth: function (factor) {
  429. let me = this, rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
  430. let pIdx = JV.PAGES_SIZE_STR.indexOf(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE]);
  431. let bandW = 700;
  432. if (pIdx >= 0) {
  433. 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 );
  434. if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE ||
  435. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE_CHN) {
  436. 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 );
  437. }
  438. }
  439. bandW *= factor;
  440. let currentWidth = 0;
  441. let sheet = me.tplWorkBook.getActiveSheet();
  442. for (let idx = 0; idx < sheet.getColumnCount(); idx++) {
  443. currentWidth += sheet.getColumnWidth(idx);
  444. }
  445. let actFactor = bandW / currentWidth;
  446. for (let idx = 0; idx < sheet.getColumnCount(); idx++) {
  447. sheet.setColumnWidth(idx, Math.round(sheet.getColumnWidth(idx) * actFactor));
  448. }
  449. },
  450. mergeCells: function () {
  451. let me = visualJumbo,
  452. sheet = me.tplWorkBook.getActiveSheet();
  453. let selectedRanges = sheet.getSelections();
  454. if (selectedRanges.length > 0) {
  455. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  456. let color = cell.backColor();
  457. let isDifferent = false;
  458. for (let idx = 1; idx < selectedRanges[0].rowCount; idx++) {
  459. if (sheet.getCell(selectedRanges[0].row + idx, 0).backColor() !== color) {
  460. isDifferent = true;
  461. break;
  462. }
  463. }
  464. if (!isDifferent) {
  465. sheet.suspendPaint();
  466. sheet.addSpan(selectedRanges[0].row, selectedRanges[0].col, selectedRanges[0].rowCount, selectedRanges[0].colCount);
  467. sheet.resumePaint();
  468. } else {
  469. alert(`不能合并跨界单元格!`)
  470. }
  471. }
  472. },
  473. disMergeCells: function () {
  474. let me = visualJumbo,
  475. sheet = me.tplWorkBook.getActiveSheet();
  476. let selectedRanges = sheet.getSelections();
  477. let spans = sheet.getSpans();
  478. if (selectedRanges.length > 0 && spans.length > 0) {
  479. let selectedSpans = [];
  480. for(let i = 0; i < spans.length; i++)
  481. {
  482. for (let j = 0; j < selectedRanges.length; j++) {
  483. if (spans[i].row >= selectedRanges[j].row && spans[i].col >= selectedRanges[j].col &&
  484. spans[i].row < selectedRanges[j].row + selectedRanges[j].rowCount && spans[i].col < selectedRanges[j].col + selectedRanges[j].colCount) {
  485. selectedSpans.push(spans[i]);
  486. }
  487. }
  488. }
  489. for (let span of selectedSpans) {
  490. sheet.removeSpan(span.row, span.col, GC.Spread.Sheets.SheetArea.viewport);
  491. }
  492. }
  493. },
  494. changeFontSet: function (dom) {
  495. let me = visualJumbo, fontAttr = dom.value,
  496. sheet = me.tplWorkBook.getActiveSheet();
  497. let selectedRanges = sheet.getSelections();
  498. if (selectedRanges.length > 0) {
  499. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  500. if (fontAttr === "自定义") {
  501. fontAttr = {};
  502. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_NAME]] = "宋体";
  503. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]] = 12;
  504. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_COLOR]] = "BLACK";
  505. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] = "F"; //bold
  506. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] = "F"; //italic
  507. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]] = "F"; //underline
  508. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_STRIKEOUT]] = "F"; //strikeout
  509. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ANGLE]] = 0; //angle
  510. }
  511. me.bandMappingObj.fontAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_font"] = fontAttr;
  512. me._setupFont(fontAttr);
  513. if (typeof fontAttr === 'string') {
  514. let idx = rpt_tpl_cfg_helper.reportCfg.fontArr.indexOf(fontAttr);
  515. fontAttr = rpt_tpl_cfg_helper.reportCfg.fonts[idx];
  516. }
  517. me.private_setup_cell_font(cell, fontAttr);
  518. }
  519. },
  520. setupCellFont: function () {
  521. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  522. let selectedRanges = sheet.getSelections();
  523. if (selectedRanges.length > 0) {
  524. let fontAttr = $(`#visElementFonts`)[0].value;
  525. if (fontAttr === "自定义") {
  526. fontAttr = {};
  527. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_NAME]] = $(`#visElementFontNames`)[0].value;
  528. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]] = $(`#visEleFontSize`)[0].value;
  529. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] = ($("#vis_font_bold")[0].className === "btn btn-sm btn-outline-secondary")?'F':'T'; //bold
  530. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] = ($("#vis_font_italic")[0].className === "btn btn-sm btn-outline-secondary")?'F':'T'; //italic
  531. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]] = ($("#vis_font_underline")[0].className === "btn btn-sm btn-outline-secondary")?'F':'T'; //underline
  532. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_STRIKEOUT]] = "F"; //strikeout
  533. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_COLOR]] = "BLACK";
  534. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ANGLE]] = 0; //angle
  535. me.bandMappingObj.fontAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_font"] = fontAttr;
  536. } else {
  537. let idx = rpt_tpl_cfg_helper.reportCfg.fontArr.indexOf(fontAttr);
  538. fontAttr = rpt_tpl_cfg_helper.reportCfg.fonts[idx];
  539. me.bandMappingObj.fontAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_font"] = fontAttr;
  540. }
  541. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  542. sheet.suspendPaint();
  543. me.private_setup_cell_font(cell, fontAttr);
  544. sheet.resumePaint();
  545. }
  546. },
  547. setupCellAlignment: function () {
  548. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  549. let selectedRanges = sheet.getSelections();
  550. if (selectedRanges.length > 0) {
  551. // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  552. sheet.suspendPaint();
  553. for (let iRow = 0; iRow < selectedRanges[0].rowCount; iRow++) {
  554. for (let iCol = 0; iCol < selectedRanges[0].colCount; iCol++) {
  555. let cell = sheet.getCell(selectedRanges[0].row + iRow, selectedRanges[0].col + iCol);
  556. //1. horizon alignment
  557. if ($(`#hAlign_center`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  558. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
  559. } else if ($(`#hAlign_left`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  560. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
  561. } else if ($(`#hAlign_right`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  562. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.right);
  563. }
  564. //2. vertical alignment
  565. if ($(`#vAlign_center`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  566. cell.vAlign(GC.Spread.Sheets.VerticalAlign.center);
  567. } else if ($(`#vAlign_bottom`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  568. cell.vAlign(GC.Spread.Sheets.VerticalAlign.bottom);
  569. }
  570. //3. shrink
  571. if ($(`#vis_shrink`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  572. cell.shrinkToFit(true);
  573. } else {
  574. cell.shrinkToFit(false);
  575. }
  576. //4. wrap
  577. if ($(`#vis_wrap`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  578. cell.wordWrap(true);
  579. } else {
  580. cell.wordWrap(false);
  581. }
  582. }
  583. }
  584. sheet.resumePaint();
  585. }
  586. },
  587. _setupCtrl: function (ctrlAttr) {
  588. let idx = rpt_tpl_cfg_helper.reportCfg.controlArr.indexOf(ctrlAttr);
  589. let ctrl = rpt_tpl_cfg_helper.reportCfg.ctrls[idx];
  590. $("#elementControlsVis")[0].selectedIndex = idx;
  591. $("#elementAlignmentHorizonVis").get(0).selectedIndex = JV.OUTPUT_ALIGN.H.indexOf(ctrl[JV.CONTROL_PROPS[2]]);
  592. $("#elementAlignmentVerticalVis").get(0).selectedIndex = JV.OUTPUT_ALIGN.V.indexOf(ctrl[JV.CONTROL_PROPS[3]]);
  593. $("#eleShrinkVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK]]);
  594. $("#eleShowZeroVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHOW_ZERO]]);
  595. $("#eleAutoWrapVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]]);
  596. $("#eleIsShrinkFirstVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]]);
  597. $("#eleCloseOutputVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]]);
  598. },
  599. _setupCellCtrlEx: function (ctrlObj) {
  600. // 原:setupCellAlignment
  601. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  602. let selectedRanges = sheet.getSelections();
  603. if (selectedRanges.length > 0) {
  604. // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  605. sheet.suspendPaint();
  606. for (let iRow = 0; iRow < selectedRanges[0].rowCount; iRow++) {
  607. for (let iCol = 0; iCol < selectedRanges[0].colCount; iCol++) {
  608. let cell = sheet.getCell(selectedRanges[0].row + iRow, selectedRanges[0].col + iCol);
  609. //1. horizon alignment
  610. if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === 'center') {
  611. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
  612. } else if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === 'left') {
  613. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
  614. } else {
  615. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.right);
  616. }
  617. //2. vertical alignment
  618. if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
  619. cell.vAlign(GC.Spread.Sheets.VerticalAlign.center);
  620. } else if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
  621. cell.vAlign(GC.Spread.Sheets.VerticalAlign.bottom);
  622. } else {
  623. cell.vAlign(GC.Spread.Sheets.VerticalAlign.top);
  624. }
  625. }
  626. }
  627. sheet.resumePaint();
  628. }
  629. },
  630. _setupBorder: function (borderAttr) {
  631. let idx = rpt_tpl_cfg_helper.reportCfg.borderArr.indexOf(borderAttr);
  632. let border = rpt_tpl_cfg_helper.reportCfg.styles[idx];
  633. $("#elementBordersVis")[0].selectedIndex = idx;
  634. for (let borderLine of border[JV.PROP_BORDER_STYLE]) {
  635. switch (borderLine[JV.PROP_POSITION]) {
  636. case JV.PROP_LEFT:
  637. $("#eleBorderLeftVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
  638. break;
  639. case JV.PROP_RIGHT:
  640. $("#eleBorderRightVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
  641. break;
  642. case JV.PROP_TOP:
  643. $("#eleBorderTopVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
  644. break;
  645. case JV.PROP_BOTTOM:
  646. $("#eleBorderBottomVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
  647. break;
  648. default:
  649. break;
  650. }
  651. }
  652. },
  653. _setupCellBorderEx: function (borderObj) {
  654. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  655. let selectedRanges = sheet.getSelections();
  656. if (selectedRanges.length > 0) {
  657. sheet.suspendPaint();
  658. let borderLine = new GC.Spread.Sheets.LineBorder;
  659. let borderEmpty = new GC.Spread.Sheets.LineBorder;
  660. let borderThick = new GC.Spread.Sheets.LineBorder;
  661. borderLine.color = "Black";
  662. borderEmpty.color = "Black";
  663. borderThick.color = "Black";
  664. borderEmpty.style = GC.Spread.Sheets.LineStyle.empty;
  665. borderLine.style = GC.Spread.Sheets.LineStyle.thin;
  666. borderThick.style = GC.Spread.Sheets.LineStyle.thick;
  667. let cellRange = new GC.Spread.Sheets.CellRange(sheet, selectedRanges[0].row, selectedRanges[0].col, selectedRanges[0].rowCount, selectedRanges[0].colCount);
  668. const _setCB = function (lineThick, borderObj) {
  669. if (lineThick === 0) {
  670. cellRange.setBorder(borderEmpty, borderObj);
  671. } else if (lineThick === 1) {
  672. cellRange.setBorder(borderLine, borderObj);
  673. } else {
  674. cellRange.setBorder(borderThick, borderObj);
  675. }
  676. };
  677. for (let borderLine of borderObj[JV.PROP_BORDER_STYLE]) {
  678. switch (borderLine[JV.PROP_POSITION]) {
  679. case JV.PROP_LEFT:
  680. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {left: true});
  681. break;
  682. case JV.PROP_RIGHT:
  683. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {right: true});
  684. break;
  685. case JV.PROP_TOP:
  686. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {top: true});
  687. break;
  688. case JV.PROP_BOTTOM:
  689. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {bottom: true});
  690. break;
  691. default:
  692. break;
  693. }
  694. }
  695. sheet.resumePaint();
  696. }
  697. },
  698. setupCellBorder: function () {
  699. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  700. let selectedRanges = sheet.getSelections();
  701. if (selectedRanges.length > 0) {
  702. // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  703. sheet.suspendPaint();
  704. let border = new GC.Spread.Sheets.LineBorder;
  705. border.color = "Black";
  706. if ($(`#vis_no_border`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  707. border.style = GC.Spread.Sheets.LineStyle.empty;
  708. } else {
  709. border.style = GC.Spread.Sheets.LineStyle.thin;
  710. }
  711. let cellRange = new GC.Spread.Sheets.CellRange(sheet, selectedRanges[0].row, selectedRanges[0].col, selectedRanges[0].rowCount, selectedRanges[0].colCount);
  712. if ($(`#vis_bottom_border`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  713. let bottomBorder = new GC.Spread.Sheets.LineBorder;
  714. bottomBorder.color = "Black";
  715. bottomBorder.style = GC.Spread.Sheets.LineStyle.empty;
  716. cellRange.setBorder(bottomBorder, {all: true});
  717. cellRange.setBorder(border, {bottom: true});
  718. } else {
  719. cellRange.setBorder(border, {all: true});
  720. }
  721. sheet.resumePaint();
  722. }
  723. },
  724. private_setup_cell_font: function (cell, fontAttr) {
  725. let fontStr = "";
  726. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]])) {
  727. fontStr = 'bold ' + fontStr;
  728. }
  729. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]])) {
  730. fontStr = 'italic ' + fontStr;
  731. }
  732. fontStr = fontStr + Math.round(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]] * 3 / 4) + 'pt ' + fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_NAME]];
  733. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]])) {
  734. cell.textDecoration(GC.Spread.Sheets.TextDecorationType.underline);
  735. } else {
  736. cell.textDecoration(GC.Spread.Sheets.TextDecorationType.none);
  737. }
  738. cell.font(fontStr);
  739. },
  740. _setupFont: function(fontAttr) {
  741. if (typeof fontAttr === "string" && fontAttr !== "自定义") {
  742. $("#visElementFontNames")[0].disabled = "disabled" ;
  743. $("#visEleFontSize")[0].disabled = "disabled" ;
  744. let idx = rpt_tpl_cfg_helper.reportCfg.fontArr.indexOf(fontAttr);
  745. let font = rpt_tpl_cfg_helper.reportCfg.fonts[idx];
  746. $("#visElementFonts")[0].selectedIndex = idx;
  747. $("#visElementFontNames")[0].value = font.Name;
  748. $("#visEleFontSize")[0].value = parseInt(font.FontHeight);
  749. $("#font_other_properties_div")[0].style.display = "none";
  750. $("#vis_font_bold")[0].className = "btn btn-sm btn-outline-secondary";
  751. $("#vis_font_italic")[0].className = "btn btn-sm btn-outline-secondary";
  752. $("#vis_font_underline")[0].className = "btn btn-sm btn-outline-secondary";
  753. } else {
  754. $("#visElementFontNames")[0].removeAttribute("disabled");
  755. $("#visEleFontSize")[0].removeAttribute("disabled");
  756. $("#font_other_properties_div")[0].style.display = "";
  757. $("#visElementFonts")[0].value = "自定义";
  758. $("#visElementFontNames")[0].value = fontAttr.Name;
  759. $("#visEleFontSize")[0].value = parseInt(fontAttr.FontHeight);
  760. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]])) {
  761. $("#vis_font_bold")[0].className = "btn btn-sm btn-outline-secondary active";
  762. }
  763. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]])) {
  764. $("#vis_font_italic")[0].className = "btn btn-sm btn-outline-secondary active";
  765. }
  766. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]])) {
  767. $("#vis_font_underline")[0].className = "btn btn-sm btn-outline-secondary active";
  768. }
  769. }
  770. },
  771. fontBoldChange: function (dom) {
  772. let me = this;
  773. me.private_reverse_class(dom);
  774. me.setupCellFont();
  775. },
  776. fontItalicChange: function (dom) {
  777. let me = this;
  778. me.private_reverse_class(dom);
  779. me.setupCellFont();
  780. },
  781. fontUnderlineChange: function (dom) {
  782. let me = this;
  783. me.private_reverse_class(dom);
  784. me.setupCellFont();
  785. },
  786. changeShrink: function (dom) {
  787. let me = this;
  788. me.private_reverse_class(dom);
  789. me.setupCellAlignment();
  790. },
  791. changeWrap: function (dom) {
  792. let me = this;
  793. me.private_reverse_class(dom);
  794. me.setupCellAlignment();
  795. },
  796. changeIsAutoHeight: function (dom) {
  797. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  798. let selectedRanges = sheet.getSelections();
  799. if (selectedRanges.length > 0) {
  800. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  801. if (cell.cellType() && cell.cellType().typeName === '7') {
  802. sheet.suspendPaint();
  803. let val = cell.value();
  804. if (dom.checked) {
  805. if (val.indexOf(`{`) < 0) {
  806. cell.value(`{` + val + `}`);
  807. }
  808. } else {
  809. if (val.indexOf(`{`) === 0) {
  810. cell.value(val.replace('{', '').replace('}',''));
  811. }
  812. }
  813. sheet.resumePaint();
  814. }
  815. }
  816. },
  817. private_reverse_class: function (dom) {
  818. if (dom.className === "btn btn-sm btn-outline-secondary") {
  819. dom.className = "btn btn-sm btn-outline-secondary active";
  820. } else {
  821. dom.className = "btn btn-sm btn-outline-secondary";
  822. }
  823. },
  824. changeBorderEx: function (dom) {
  825. let me = visualJumbo, borderAttr = dom.value,
  826. sheet = me.tplWorkBook.getActiveSheet();
  827. let selectedRanges = sheet.getSelections();
  828. if (selectedRanges.length > 0) {
  829. // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  830. me.bandMappingObj.borderAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_border"] = borderAttr;
  831. me._setupBorder(borderAttr);
  832. // 然后要设置相关Cell的边框
  833. if (typeof borderAttr === 'string') {
  834. let idx = rpt_tpl_cfg_helper.reportCfg.borderArr.indexOf(borderAttr);
  835. borderAttr = rpt_tpl_cfg_helper.reportCfg.styles[idx];
  836. }
  837. me._setupCellBorderEx(borderAttr);
  838. }
  839. },
  840. changeControlEx: function (dom) {
  841. let me = visualJumbo, ctrlAttr = dom.value,
  842. sheet = me.tplWorkBook.getActiveSheet();
  843. let selectedRanges = sheet.getSelections();
  844. if (selectedRanges.length > 0) {
  845. me.bandMappingObj.ctrlAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_ctrl"] = ctrlAttr;
  846. me._setupCtrl(ctrlAttr);
  847. // 然后要设置相关Cell的上下左右控制(就是原setupCellAlignment)
  848. if (typeof ctrlAttr === 'string') {
  849. let idx = rpt_tpl_cfg_helper.reportCfg.controlArr.indexOf(ctrlAttr);
  850. ctrlAttr = rpt_tpl_cfg_helper.reportCfg.ctrls[idx];
  851. }
  852. me._setupCellCtrlEx(ctrlAttr);
  853. }
  854. },
  855. changeHAlign: function (dom) {
  856. let me = this;
  857. if (dom.className === "btn btn-sm btn-outline-secondary") {
  858. dom.className = "btn btn-sm btn-outline-secondary active"
  859. let hKeys = [`hAlign_left`, `hAlign_center`, `hAlign_right`];
  860. let domIdx = hKeys.indexOf(dom.id);
  861. if (domIdx >= 0) {
  862. for (let idx = 0; idx < hKeys.length; idx++) {
  863. if (idx !== domIdx) {
  864. $(`#` + hKeys[idx])[0].className = "btn btn-sm btn-outline-secondary";
  865. }
  866. }
  867. }
  868. me.setupCellAlignment();
  869. }
  870. },
  871. changeVAlign: function (dom) {
  872. let me = this;
  873. if (dom.className === "btn btn-sm btn-outline-secondary") {
  874. dom.className = "btn btn-sm btn-outline-secondary active"
  875. let hKeys = [`vAlign_top`, `vAlign_center`, `vAlign_bottom`];
  876. let domIdx = hKeys.indexOf(dom.id);
  877. if (domIdx >= 0) {
  878. for (let idx = 0; idx < hKeys.length; idx++) {
  879. if (idx !== domIdx) {
  880. $(`#` + hKeys[idx])[0].className = "btn btn-sm btn-outline-secondary";
  881. }
  882. }
  883. }
  884. me.setupCellAlignment();
  885. }
  886. },
  887. changeBorder: function (dom) {
  888. let me = this;
  889. if (dom.className === "btn btn-sm btn-outline-secondary") {
  890. dom.className = "btn btn-sm btn-outline-secondary active"
  891. let hKeys = [`vis_outter_border`, `vis_no_border`, `vis_bottom_border`];
  892. let domIdx = hKeys.indexOf(dom.id);
  893. if (domIdx >= 0) {
  894. for (let idx = 0; idx < hKeys.length; idx++) {
  895. if (idx !== domIdx) {
  896. $(`#` + hKeys[idx])[0].className = "btn btn-sm btn-outline-secondary";
  897. }
  898. }
  899. }
  900. me.setupCellBorder();
  901. }
  902. },
  903. changeCellType: function (newType) {
  904. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  905. let selectedRanges = sheet.getSelections();
  906. if (selectedRanges.length > 0) {
  907. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  908. switch (newType) {
  909. case `field`:
  910. let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
  911. let cellType = new GC.Spread.Sheets.CellTypes.ComboBox();
  912. // let selectableFields = me.getSelectedFields(rptTpl);
  913. let selectableFields = visualCommonOprObj.getAllSelectedFields();
  914. cellType.items(selectableFields);
  915. cell.cellType(cellType);
  916. break;
  917. case `text`:
  918. default:
  919. cell.cellType(new GC.Spread.Sheets.CellTypes.Text());
  920. cell.value(``);
  921. break;
  922. }
  923. }
  924. },
  925. changePreSuf: function (typeStr, dom) {
  926. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  927. let selectedRanges = sheet.getSelections();
  928. if (selectedRanges.length > 0) {
  929. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  930. let fps = me.bandMappingObj.fieldPreSufAttr[cell.row + "_" + cell.col + "_fieldPreSuf"];
  931. if (!fps) {
  932. fps = visualCommonOprObj.createDftFieldPreSuf();
  933. me.bandMappingObj.fieldPreSufAttr[cell.row + "_" + cell.col + "_fieldPreSuf"] = fps;
  934. }
  935. fps[typeStr] = dom.value;
  936. }
  937. },
  938. applyBack: function () {
  939. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  940. let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
  941. let xPos = [0], yPos = [0];
  942. for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
  943. xPos.push(sheet.getRowHeight(iRow) + xPos[xPos.length - 1]);
  944. for (let iCol = 0; iCol < sheet.getColumnCount(); iCol++) {
  945. yPos.push(sheet.getColumnWidth(iCol) + yPos[yPos.length - 1]);
  946. }
  947. }
  948. if (rptTpl[JV.NODE_FLOW_INFO]) {
  949. //流水式
  950. me.applyBack_Flow(rptTpl, sheet, xPos, yPos);
  951. } else if (rptTpl[JV.NODE_BILL_INFO]) {
  952. //账单式
  953. me.applyBack_Bill(rptTpl, sheet, xPos, yPos);
  954. } else if (rptTpl[JV.NODE_CROSS_INFO]) {
  955. //交叉式
  956. //目前暂缓
  957. me.applyBack_Cross(rptTpl, sheet, xPos, yPos);
  958. }
  959. },
  960. applyBack_Flow: function (rptTpl, sheet, xPos, yPos) {
  961. let me = this;
  962. let startRow = -1, handledBands = [];
  963. let discreteNodesArr = [];
  964. //先清除所有相关text/field节点,然后再重新生成
  965. me.private_clear_flow_txt_fld_nodes();
  966. let textFldArr = [], colWidthArr = [], rowHeightArr = [];
  967. //1. 锚定column / content(& grouping)
  968. let columnBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_COLUMN][JV.PROP_BAND_NAME], rptTpl);
  969. handledBands.push(columnBand[JV.PROP_NAME]);
  970. me.private_setup_bandHeight(columnBand[JV.PROP_NAME], columnBand, sheet);
  971. startRow = me.collectSheetTxtFldByArea(sheet, me.bandMappingObj[columnBand[JV.PROP_NAME]][JV.PROP_COLOR] , textFldArr, colWidthArr, rowHeightArr);
  972. let columnNodes = [];
  973. let columnDisFieldArr = null;
  974. for (let txtFld of textFldArr) {
  975. if (txtFld.isField) {
  976. if (columnDisFieldArr === null) {
  977. columnDisFieldArr = {Name: "子项", BandName: columnBand[JV.PROP_NAME], items: [[],[]], isParent: true};
  978. discreteNodesArr.push(columnDisFieldArr);
  979. }
  980. let fldNode = me.private_create_field_param_node(sheet, txtFld, startRow, colWidthArr, rowHeightArr, rptTpl);
  981. columnDisFieldArr.items[0].push(fldNode);
  982. } else {
  983. let node = me.createTxtNode(txtFld, sheet, startRow, colWidthArr, rowHeightArr);
  984. columnNodes.push(node);
  985. }
  986. }
  987. let cotentBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_BAND_NAME], rptTpl);
  988. handledBands.push(cotentBand[JV.PROP_NAME]);
  989. me.private_setup_flow_content_height(rptTpl, cotentBand[JV.PROP_NAME], sheet);
  990. textFldArr = [];
  991. colWidthArr = [];
  992. rowHeightArr = [];
  993. startRow = me.collectSheetTxtFldByArea(sheet, me.bandMappingObj[cotentBand[JV.PROP_NAME]][JV.PROP_COLOR] , textFldArr, colWidthArr, rowHeightArr);
  994. let contentNodes = [];
  995. for (let field of textFldArr) {
  996. if (field.isField) {
  997. let node = me.private_create_field_param_node(sheet, field, startRow, colWidthArr, rowHeightArr, null);
  998. contentNodes.push(node);
  999. }
  1000. }
  1001. //2. 锚定 统计类型
  1002. let pageTotalBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM][JV.PROP_BAND_NAME], rptTpl);
  1003. let pageSummaryNodes = [[], []];
  1004. if (pageTotalBand) {
  1005. handledBands.push(pageTotalBand[JV.PROP_NAME]);
  1006. me.private_setup_bandHeight(pageTotalBand[JV.PROP_NAME], pageTotalBand, sheet);
  1007. me.private_build_txt_fld_nodes(pageTotalBand, sheet, rptTpl, pageSummaryNodes);
  1008. }
  1009. let segTotalBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM][JV.PROP_BAND_NAME], rptTpl);
  1010. let segSummaryNodes = [[], []];
  1011. if (segTotalBand) {
  1012. handledBands.push(segTotalBand[JV.PROP_NAME]);
  1013. me.private_setup_bandHeight(segTotalBand[JV.PROP_NAME], segTotalBand, sheet);
  1014. me.private_build_txt_fld_nodes(segTotalBand, sheet, rptTpl, segSummaryNodes);
  1015. }
  1016. //3. 其他就归类到离散去了
  1017. if (me.bandMappingObj && me.bandMappingObj.items && me.bandMappingObj.items.length > 0) {
  1018. for (let sBandMap of me.bandMappingObj.items) {
  1019. if (handledBands.indexOf(sBandMap[JV.PROP_BAND_NAME]) < 0 && sBandMap[JV.PROP_COLOR] !== 'White') {
  1020. let sArr = {Name: "子项", BandName: sBandMap[JV.PROP_BAND_NAME], items: [[],[]], isParent: true};
  1021. let sBand = visualCommonOprObj.getBandEx(sBandMap[JV.PROP_BAND_NAME], rptTpl);
  1022. if (sBand) {
  1023. me.private_setup_bandHeight(sBand[JV.PROP_NAME], sBand, sheet);
  1024. me.private_build_txt_fld_nodes(sBand, sheet, rptTpl, sArr.items);
  1025. }
  1026. if (sArr.items[0].length > 0 || sArr.items[1].length > 0) {
  1027. discreteNodesArr.push(sArr);
  1028. }
  1029. }
  1030. }
  1031. }
  1032. //4. 最后生成节点
  1033. me.private_create_tpl_flow_nodes(columnNodes, contentNodes, pageSummaryNodes, segSummaryNodes, null, discreteNodesArr);
  1034. displayMessage("应用提交成功!", "green", 5000, "id_vis_setup_lbl");
  1035. },
  1036. private_build_txt_fld_nodes: function (band, sheet, rptTpl, destNodes) {
  1037. let me = this;
  1038. me.private_setup_bandHeight(band[JV.PROP_NAME], band, sheet);
  1039. let textFldArr = [], colWidthArr = [], rowHeightArr = [];
  1040. let startRow = me.collectSheetTxtFldByArea(sheet, me.bandMappingObj[band[JV.PROP_NAME]][JV.PROP_COLOR] , textFldArr, colWidthArr, rowHeightArr);
  1041. for (let txtFld of textFldArr) {
  1042. if (txtFld.isField) {
  1043. let fldNode = me.private_create_field_param_node(sheet, txtFld, startRow, colWidthArr, rowHeightArr, rptTpl);
  1044. destNodes[0].push(fldNode);
  1045. } else {
  1046. let txtNode = me.createTxtNode(txtFld, sheet, startRow, colWidthArr, rowHeightArr);
  1047. destNodes[1].push(txtNode);
  1048. }
  1049. }
  1050. },
  1051. private_create_tpl_flow_nodes: function (columnNodes, contentNodes, pageSummaryNodes, segSummaryNodes, groupSummaryNodes, discreteNodesArr) {
  1052. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1053. for (let node of nodes) {
  1054. if (node[JV.PROP_NAME].indexOf('_列') >= 0) {
  1055. //列
  1056. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, columnNodes, true);
  1057. } else if (node[JV.PROP_NAME].indexOf('数据') >= 0) {
  1058. //数据
  1059. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, contentNodes, true);
  1060. } else if (node[JV.PROP_NAME].indexOf('_页统计') >= 0) {
  1061. //页统计
  1062. if (pageSummaryNodes[0].length > 0) {
  1063. dataInfoMapTreeOprObj.treeObj.addNodes(node.items[0], -1, pageSummaryNodes[0], true);
  1064. }
  1065. if (pageSummaryNodes[1].length > 0) {
  1066. dataInfoMapTreeOprObj.treeObj.addNodes(node.items[1], -1, pageSummaryNodes[1], true);
  1067. }
  1068. } else if (node[JV.PROP_NAME].indexOf('_段统计') >= 0) {
  1069. //章统计
  1070. if (segSummaryNodes[0].length > 0) {
  1071. dataInfoMapTreeOprObj.treeObj.addNodes(node.items[0], -1, segSummaryNodes[0], true);
  1072. }
  1073. if (segSummaryNodes[1].length > 0) {
  1074. dataInfoMapTreeOprObj.treeObj.addNodes(node.items[1], -1, segSummaryNodes[1], true);
  1075. }
  1076. } else if (node[JV.PROP_NAME].indexOf('_分组') >= 0) {
  1077. //分组统计
  1078. // for (let subNode of node.items) {
  1079. // dataInfoMapTreeOprObj.treeObj.removeChildNodes(subNode);
  1080. // }
  1081. } else if (node[JV.PROP_NAME].indexOf('离散') >= 0) {
  1082. //离散信息
  1083. if (discreteNodesArr) {
  1084. for (let dNode of discreteNodesArr) {
  1085. let discreteNode = {"Name": "子项", "BandName": dNode[JV.PROP_BAND_NAME], "items": [{"Name": "离散字段集", "items": [], "isParent": true},{"Name": "离散文本集", "items": [], "isParent": true}], "isParent": true};
  1086. if (dNode.items[0].length > 0) {
  1087. // dataInfoMapTreeOprObj.treeObj.addNodes(node.items[0], -1, segSummaryNodes[0], true);
  1088. discreteNode.items[0].items = dNode.items[0];
  1089. }
  1090. if (dNode.items[1].length > 0) {
  1091. // dataInfoMapTreeOprObj.treeObj.addNodes(node.items[1], -1, segSummaryNodes[1], true);
  1092. discreteNode.items[1].items = dNode.items[1];
  1093. }
  1094. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, discreteNode, true);
  1095. }
  1096. }
  1097. }
  1098. }
  1099. },
  1100. private_create_field_param_node: function (sheet, field, startRow, colWidthArr, rowHeightArr, rptTpl) {
  1101. let me = this;
  1102. let isAutoHeight = false;
  1103. if (field.text && field.text.indexOf(`{`) === 0) {
  1104. isAutoHeight = true;
  1105. field.text = field.text.replace('{', '').replace('}','');
  1106. }
  1107. let rst = {"Name": field.text, "Title": '', "FieldID": -1, "font": "Content", "control": "Column", "style" : "Default_Normal", "isAutoHeight" : false,
  1108. "area" : {"Left" : 0, "Right" : 100, "Top" : 0, "Bottom" : 100, "H_CalculationType" : "percentage", "V_CalculationType" : "percentage"}
  1109. };
  1110. //1. 设置FieldID
  1111. let hasChkField = false;
  1112. let native_chk_field_param = function (fpArr) {
  1113. for (let rptField of fpArr) {
  1114. if (rptField[JV.PROP_NAME] === field.text) {
  1115. rst.FieldID = rptField[JV.PROP_ID];
  1116. rst["Title"] = "ID: " + rptField[JV.PROP_ID];
  1117. hasChkField = true;
  1118. break;
  1119. }
  1120. }
  1121. };
  1122. if (rptTpl) {
  1123. if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS] !== undefined && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS].length > 0) {
  1124. native_chk_field_param(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]);
  1125. }
  1126. if (!hasChkField && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS] !== undefined && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS].length > 0) {
  1127. native_chk_field_param(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]);
  1128. }
  1129. if (!hasChkField && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS] !== undefined && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS].length > 0) {
  1130. native_chk_field_param(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]);
  1131. }
  1132. if (!hasChkField && rptTpl[JV.NODE_NO_MAPPING_FIELDS] !== undefined && rptTpl[JV.NODE_NO_MAPPING_FIELDS].length > 0) {
  1133. native_chk_field_param(rptTpl[JV.NODE_NO_MAPPING_FIELDS]);
  1134. }
  1135. if (!hasChkField && rptTpl[JV.NODE_DISCRETE_PARAMS] !== undefined && rptTpl[JV.NODE_DISCRETE_PARAMS].length > 0) {
  1136. native_chk_field_param(rptTpl[JV.NODE_DISCRETE_PARAMS]);
  1137. if (hasChkField) {
  1138. rst.ParamID = rst.FieldID;
  1139. delete rst.FieldID;
  1140. }
  1141. }
  1142. } else {
  1143. let nodes1 = fieldMapTreeOprObj.treeObj.getNodes();
  1144. for (let node of nodes1) {
  1145. if (node.items && node.items.length > 0) {
  1146. native_chk_field_param(node.items);
  1147. }
  1148. if (hasChkField) break;
  1149. }
  1150. if (!hasChkField) {
  1151. let nodes2 = discreteFieldParamTreeOprObj.treeObj.getNodes();
  1152. for (let node of nodes2) {
  1153. if (node.items && node.items.length > 0) {
  1154. native_chk_field_param(node.items);
  1155. }
  1156. if (hasChkField) break;
  1157. }
  1158. }
  1159. }
  1160. let cell = sheet.getCell(field.row, field.col);
  1161. //2. 字体
  1162. rst[JV.PROP_FONT] = me.private_getFontByCellProperties(cell);
  1163. rst[JV.PROP_STYLE] = me.private_getBorderByCellProperties(cell);
  1164. rst[JV.PROP_CONTROL] = me.private_getCtrlByCellProperties(cell);
  1165. //3. 自动行高
  1166. rst[JV.PROP_IS_AUTO_HEIGHT] = isAutoHeight;
  1167. //4. 左右位置%
  1168. me.setupHeightWidth(rst, field, startRow, colWidthArr, rowHeightArr);
  1169. //5. 其他(前后缀、Format、默认值)
  1170. let preSufCfg = me.bandMappingObj.fieldPreSufAttr[field.row + "_" + field.col + "_fieldPreSuf"];
  1171. if (preSufCfg) {
  1172. if (preSufCfg[JV.PROP_PREFIX]) {
  1173. rst[JV.PROP_PREFIX] = preSufCfg[JV.PROP_PREFIX];
  1174. }
  1175. if (preSufCfg[JV.PROP_SUFFIX]) {
  1176. rst[JV.PROP_SUFFIX] = preSufCfg[JV.PROP_SUFFIX];
  1177. }
  1178. if (preSufCfg[JV.PROP_FORMAT]) {
  1179. rst[JV.PROP_FORMAT] = preSufCfg[JV.PROP_FORMAT];
  1180. }
  1181. if (preSufCfg[JV.PROP_DFT_VALUE]) {
  1182. rst[JV.PROP_DFT_VALUE] = preSufCfg[JV.PROP_DFT_VALUE];
  1183. }
  1184. }
  1185. return rst;
  1186. },
  1187. private_clear_flow_txt_fld_nodes: function () {
  1188. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1189. for (let node of nodes) {
  1190. if (node[JV.PROP_NAME].indexOf('_列') >= 0 || node[JV.PROP_NAME].indexOf('数据') >= 0) {
  1191. //1. 列 / 数据
  1192. dataInfoMapTreeOprObj.treeObj.removeChildNodes(node);
  1193. } else if (node[JV.PROP_NAME].indexOf('_页统计') >= 0 || node[JV.PROP_NAME].indexOf('_段统计') >= 0) {
  1194. //3. 页统计 / 章统计
  1195. for (let subNode of node.items) {
  1196. dataInfoMapTreeOprObj.treeObj.removeChildNodes(subNode);
  1197. }
  1198. } else if (node[JV.PROP_NAME].indexOf('_分组') >= 0) {
  1199. //5. 分组统计
  1200. for (let subNode of node.items) {
  1201. dataInfoMapTreeOprObj.treeObj.removeChildNodes(subNode);
  1202. }
  1203. } else if (node[JV.PROP_NAME].indexOf('离散') >= 0) {
  1204. //6. 离散信息
  1205. dataInfoMapTreeOprObj.treeObj.removeChildNodes(node);
  1206. }
  1207. }
  1208. },
  1209. applyBack_Bill: function (rptTpl, sheet, xPos, yPos) {
  1210. let me = this;
  1211. // let pageWith = xPos[xPos.length - 1];
  1212. //先清除所有相关text/field节点,然后再重新生成
  1213. me.private_clear_bill_txt_fld_nodes();
  1214. //1. 锚定content
  1215. let cotentBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT][JV.PROP_BAND_NAME], rptTpl);
  1216. let textFldArr = [], colWidthArr = [], rowHeightArr = [];
  1217. let startRow = me.collectSheetTxtFldByArea(sheet, me.bandMappingObj[cotentBand[JV.PROP_NAME]][JV.PROP_COLOR] , textFldArr, colWidthArr, rowHeightArr);
  1218. let contentNodes = [];
  1219. for (let field of textFldArr) {
  1220. if (field.isField) {
  1221. let node = me.private_create_field_param_node(sheet, field, startRow, colWidthArr, rowHeightArr, rptTpl);
  1222. contentNodes.push(node);
  1223. }
  1224. }
  1225. //2. 其他就归类到离散去了
  1226. let discreteNodesArr = [];
  1227. if (me.bandMappingObj && me.bandMappingObj.items && me.bandMappingObj.items.length > 0) {
  1228. for (let sBandMap of me.bandMappingObj.items) {
  1229. let sArr = {Name: "子项", BandName: sBandMap[JV.PROP_BAND_NAME], items: [[],[]], isParent: true};
  1230. let sBand = visualCommonOprObj.getBandEx(sBandMap[JV.PROP_BAND_NAME], rptTpl);
  1231. if (sBand) {
  1232. me.private_setup_bandHeight(sBand[JV.PROP_NAME], sBand, sheet);
  1233. me.private_build_txt_fld_nodes(sBand, sheet, rptTpl, sArr.items);
  1234. if (sBand[JV.PROP_NAME] === cotentBand[JV.PROP_NAME]) {
  1235. sArr.items[0] = []; //清除指标集合(因与步骤1的结果有重叠了)
  1236. }
  1237. }
  1238. if (sArr.items[0].length > 0 || sArr.items[1].length > 0) {
  1239. discreteNodesArr.push(sArr);
  1240. }
  1241. }
  1242. }
  1243. //3. 最后生成节点
  1244. me.private_create_tpl_bill_nodes(contentNodes, discreteNodesArr);
  1245. displayMessage("应用提交成功!", "green", 5000, "id_vis_setup_lbl");
  1246. },
  1247. private_clear_bill_txt_fld_nodes: function () {
  1248. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1249. for (let node of nodes) {
  1250. dataInfoMapTreeOprObj.treeObj.removeChildNodes(node);
  1251. //bill类型可以直接remove child nodes
  1252. }
  1253. },
  1254. private_create_tpl_bill_nodes: function (contentNodes, discreteNodesArr) {
  1255. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1256. for (let node of nodes) {
  1257. if (node[JV.PROP_NAME].indexOf('数据') >= 0) {
  1258. //数据
  1259. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, contentNodes, true);
  1260. } else if (node[JV.PROP_NAME].indexOf('离散') >= 0) {
  1261. //离散信息
  1262. if (discreteNodesArr) {
  1263. for (let dNode of discreteNodesArr) {
  1264. let discreteNode = {"Name": "子项", "BandName": dNode[JV.PROP_BAND_NAME], "items": [{"Name": "离散字段集", "items": [], "isParent": true},{"Name": "离散文本集", "items": [], "isParent": true}], "isParent": true};
  1265. if (dNode.items[0].length > 0) {
  1266. // dataInfoMapTreeOprObj.treeObj.addNodes(node.items[0], -1, segSummaryNodes[0], true);
  1267. discreteNode.items[0].items = dNode.items[0];
  1268. }
  1269. if (dNode.items[1].length > 0) {
  1270. // dataInfoMapTreeOprObj.treeObj.addNodes(node.items[1], -1, segSummaryNodes[1], true);
  1271. discreteNode.items[1].items = dNode.items[1];
  1272. }
  1273. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, discreteNode, true);
  1274. }
  1275. }
  1276. }
  1277. }
  1278. },
  1279. applyBack_Cross: function (rptTpl, sheet, xPos, yPos) {
  1280. let me = this;
  1281. let pageWith = xPos[xPos.length - 1];
  1282. //先清除所有相关text/field节点,然后再重新生成
  1283. me.private_clear_cross_txt_fld_nodes();
  1284. //1. 锚定...
  1285. },
  1286. private_clear_cross_txt_fld_nodes: function () {
  1287. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1288. for (let node of nodes) {
  1289. //
  1290. }
  1291. },
  1292. private_setup_flow_content_height: function (rptTpl, bandName, sheet) {
  1293. let me = visualJumbo;
  1294. if (me.bandMappingObj[bandName]) {
  1295. let bandColor = me.bandMappingObj[bandName][JV.PROP_COLOR];
  1296. for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
  1297. if (sheet.getCell(iRow, 0).backColor() === bandColor) {
  1298. rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] = (sheet.getRowHeight(iRow) / unitFactor).toFixed(2);
  1299. $(`#element_content_height`)[0].value = (sheet.getRowHeight(iRow) / unitFactor).toFixed(2);
  1300. }
  1301. }
  1302. }
  1303. },
  1304. private_setup_bandHeight: function (bandName, band, sheet) {
  1305. let me = visualJumbo;
  1306. if (band && me.bandMappingObj[bandName]) {
  1307. let bandColor = me.bandMappingObj[bandName][JV.PROP_COLOR];
  1308. let isFirst = true, firstRowIdx = -1, lastRowIdx = -1;
  1309. for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
  1310. if (sheet.getCell(iRow, 0).backColor() === bandColor) {
  1311. lastRowIdx = iRow;
  1312. if (isFirst) {
  1313. firstRowIdx = iRow;
  1314. isFirst = false;
  1315. }
  1316. }
  1317. }
  1318. if (firstRowIdx >= 0) {
  1319. let bH = 0;
  1320. for (let idx = firstRowIdx; idx <= lastRowIdx; idx++) {
  1321. bH += sheet.getRowHeight(idx);
  1322. }
  1323. let bandH = (bH / unitFactor).toFixed(2);
  1324. band[JV.BAND_PROP_HEIGHT] = bandH;
  1325. bandTreeOprObj.changeBandHeight(bandName, bandH);
  1326. }
  1327. }
  1328. },
  1329. collectSheetTxtFldByArea: function (sheet, backColor, textArr, colWidthArr, rowHeightArr) {
  1330. let me = this, allSpans = sheet.getSpans();
  1331. let startRow = -1, endRow = -1;
  1332. let isFirst = true;
  1333. for (let idx = 0; idx < sheet.getRowCount(); idx++) {
  1334. if (sheet.getCell(idx, 0).backColor() === backColor) {
  1335. if (isFirst) {
  1336. startRow = idx;
  1337. isFirst = false;
  1338. }
  1339. endRow = idx;
  1340. }
  1341. }
  1342. let spans = [];
  1343. for (let span of allSpans) {
  1344. if (span.row >= startRow && span.row <= endRow) {
  1345. spans.push(span);
  1346. }
  1347. }
  1348. for (let span of spans) {
  1349. me.private_build_pre_text(sheet, textArr, span.row, span.col, span.rowCount, span.colCount);
  1350. }
  1351. for (let iRow = startRow; iRow <= endRow; iRow++) {
  1352. rowHeightArr.push(sheet.getRowHeight(iRow));
  1353. if (iRow > startRow) {
  1354. rowHeightArr[iRow - startRow] = rowHeightArr[iRow - startRow] + rowHeightArr[iRow - startRow - 1];
  1355. }
  1356. for (let jCol = 0; jCol < sheet.getColumnCount(); jCol++) {
  1357. if (iRow === startRow) {
  1358. colWidthArr.push(sheet.getColumnWidth(jCol));
  1359. if (jCol > 0) {
  1360. colWidthArr[jCol] = colWidthArr[jCol] + colWidthArr[jCol - 1];
  1361. }
  1362. }
  1363. if (!visualCommonOprObj.checkInSpan(spans, iRow, jCol)) {
  1364. me.private_build_pre_text(sheet, textArr, iRow, jCol, 1, 1);
  1365. }
  1366. }
  1367. }
  1368. return startRow;
  1369. },
  1370. private_build_pre_text: function (sheet, textArr, row, col, rowCount, colCount) {
  1371. let cell = sheet.getCell(row, col);
  1372. let textValue = sheet.getValue(row, col);
  1373. let isField = false, isBlank = false;
  1374. if (textValue && cell.cellType() && cell.cellType().typeName === '7') {
  1375. isField = true;
  1376. } else {
  1377. isBlank = stringUtil.isEmptyString(textValue);
  1378. if (isBlank) {
  1379. let border = cell.borderBottom();
  1380. if (border && border.style === GC.Spread.Sheets.LineStyle.thin) {
  1381. isBlank = false;
  1382. }
  1383. }
  1384. }
  1385. if (!isBlank) {
  1386. textArr.push({"row": row, "col": col, "rowCount": rowCount, "colCount": colCount, "text": textValue, "isField": isField});
  1387. }
  1388. },
  1389. createTxtNode: function (text, sheet, startRow, colWidthArr, rowHeightArr) {
  1390. let me = this, rst = dataInfoMapTreeOprObj.getDummyTextNode(null);
  1391. me.setupHeightWidth(rst, text, startRow, colWidthArr, rowHeightArr);
  1392. if (stringUtil.isEmptyString(text[`text`])) {
  1393. rst[JV.PROP_NAME] = '';
  1394. } else {
  1395. rst[JV.PROP_NAME] = stringUtil.replaceAll(stringUtil.replaceAll(text[`text`].toString(), '\n', '|'), '\r', '');
  1396. }
  1397. rst[JV.PROP_LABEL] = rst[JV.PROP_NAME];
  1398. //then setup font/border/control
  1399. let cell = sheet.getCell(text.row, text.col);
  1400. rst[JV.PROP_FONT] = me.private_getFontByCellProperties(cell);
  1401. rst[JV.PROP_STYLE] = me.private_getBorderByCellProperties(cell);
  1402. rst[JV.PROP_CONTROL] = me.private_getCtrlByCellProperties(cell);
  1403. return rst;
  1404. },
  1405. setupHeightWidth: function (dest, text, startRow, colWidthArr, rowHeightArr) {
  1406. let width = colWidthArr[colWidthArr.length - 1], height = rowHeightArr[rowHeightArr.length - 1];
  1407. dest[JV.PROP_AREA][JV.PROP_RIGHT] = (colWidthArr[text.col + text.colCount - 1] / width * 100).toFixed(2);
  1408. if (text.col > 0) {
  1409. dest[JV.PROP_AREA][JV.PROP_LEFT] = (colWidthArr[text.col - 1] / width * 100).toFixed(2);
  1410. } else {
  1411. dest[JV.PROP_AREA][JV.PROP_LEFT] = 0;
  1412. }
  1413. dest[JV.PROP_AREA][JV.PROP_BOTTOM] = (rowHeightArr[text.row - startRow + text.rowCount - 1] / height * 100).toFixed(2);
  1414. if (text.row > startRow) {
  1415. dest[JV.PROP_AREA][JV.PROP_TOP] = (rowHeightArr[text.row - startRow - 1] / height * 100).toFixed(2);
  1416. } else {
  1417. dest[JV.PROP_AREA][JV.PROP_TOP] = 0;
  1418. }
  1419. },
  1420. private_getFontByCellProperties: function (cell) {
  1421. let me = this, rst = 'Content';
  1422. if (me.bandMappingObj.fontAttr[cell.row + "_" + cell.col + "_font"]) {
  1423. rst = me.bandMappingObj.fontAttr[cell.row + "_" + cell.col + "_font"];
  1424. }
  1425. return rst;
  1426. },
  1427. private_getBorderByCellProperties: function (cell) {
  1428. let me = this, rst = 'Default_None';
  1429. if (me.bandMappingObj.borderAttr[cell.row + "_" + cell.col + "_border"]) {
  1430. rst = me.bandMappingObj.borderAttr[cell.row + "_" + cell.col + "_border"];
  1431. }
  1432. return rst;
  1433. },
  1434. private_getCtrlByCellProperties: function (cell) {
  1435. let me = this, rst = 'Default';
  1436. if (me.bandMappingObj.ctrlAttr[cell.row + "_" + cell.col + "_ctrl"]) {
  1437. rst = me.bandMappingObj.ctrlAttr[cell.row + "_" + cell.col + "_ctrl"]; }
  1438. return rst;
  1439. }
  1440. };