rpt_tpl_vis_jumbo.js 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551
  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. if (fontAttr === "自定义") {
  500. fontAttr = {};
  501. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_NAME]] = "宋体";
  502. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]] = 12;
  503. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_COLOR]] = "BLACK";
  504. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] = "F"; //bold
  505. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] = "F"; //italic
  506. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]] = "F"; //underline
  507. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_STRIKEOUT]] = "F"; //strikeout
  508. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ANGLE]] = 0; //angle
  509. }
  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. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  518. me.private_setup_cell_font(cell, fontAttr);
  519. /*/
  520. me._setupFont(fontAttr);
  521. if (typeof fontAttr === 'string') {
  522. let idx = rpt_tpl_cfg_helper.reportCfg.fontArr.indexOf(fontAttr);
  523. fontAttr = rpt_tpl_cfg_helper.reportCfg.fonts[idx];
  524. }
  525. for (let selIdx = 0; selIdx < selectedRanges.length; selIdx++) {
  526. let startRow = selectedRanges[selIdx].row;
  527. for (let rowIdx = 0; rowIdx < selectedRanges[selIdx].rowCount; rowIdx++) {
  528. let startCol = selectedRanges[selIdx].col;
  529. for (let colIdx = 0; colIdx < selectedRanges[selIdx].colCount; colIdx++) {
  530. if (dom.value === '自定义') {
  531. me.bandMappingObj.fontAttr[(startRow + rowIdx) + "_" + (startCol + colIdx) + "_font"] = fontAttr;
  532. } else {
  533. me.bandMappingObj.fontAttr[(startRow + rowIdx) + "_" + (startCol + colIdx) + "_font"] = dom.value;
  534. }
  535. let cell = sheet.getCell(startRow + rowIdx, startCol + colIdx);
  536. me.private_setup_cell_font(cell, fontAttr);
  537. }
  538. }
  539. }
  540. //*/
  541. }
  542. },
  543. setupCellFont: function () {
  544. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  545. let selectedRanges = sheet.getSelections();
  546. if (selectedRanges.length > 0) {
  547. let fontAttr = $(`#visElementFonts`)[0].value;
  548. if (fontAttr === "自定义") {
  549. fontAttr = {};
  550. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_NAME]] = $(`#visElementFontNames`)[0].value;
  551. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]] = $(`#visEleFontSize`)[0].value;
  552. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] = ($("#vis_font_bold")[0].className === "btn btn-sm btn-outline-secondary")?'F':'T'; //bold
  553. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] = ($("#vis_font_italic")[0].className === "btn btn-sm btn-outline-secondary")?'F':'T'; //italic
  554. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]] = ($("#vis_font_underline")[0].className === "btn btn-sm btn-outline-secondary")?'F':'T'; //underline
  555. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_STRIKEOUT]] = "F"; //strikeout
  556. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_COLOR]] = "BLACK";
  557. fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ANGLE]] = 0; //angle
  558. me.bandMappingObj.fontAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_font"] = fontAttr;
  559. } else {
  560. let idx = rpt_tpl_cfg_helper.reportCfg.fontArr.indexOf(fontAttr);
  561. fontAttr = rpt_tpl_cfg_helper.reportCfg.fonts[idx];
  562. me.bandMappingObj.fontAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_font"] = fontAttr;
  563. }
  564. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  565. sheet.suspendPaint();
  566. me.private_setup_cell_font(cell, fontAttr);
  567. sheet.resumePaint();
  568. }
  569. },
  570. setupCellAlignment: function () {
  571. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  572. let selectedRanges = sheet.getSelections();
  573. if (selectedRanges.length > 0) {
  574. // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  575. sheet.suspendPaint();
  576. for (let iRow = 0; iRow < selectedRanges[0].rowCount; iRow++) {
  577. for (let iCol = 0; iCol < selectedRanges[0].colCount; iCol++) {
  578. let cell = sheet.getCell(selectedRanges[0].row + iRow, selectedRanges[0].col + iCol);
  579. //1. horizon alignment
  580. if ($(`#hAlign_center`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  581. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
  582. } else if ($(`#hAlign_left`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  583. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
  584. } else if ($(`#hAlign_right`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  585. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.right);
  586. }
  587. //2. vertical alignment
  588. if ($(`#vAlign_center`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  589. cell.vAlign(GC.Spread.Sheets.VerticalAlign.center);
  590. } else if ($(`#vAlign_bottom`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  591. cell.vAlign(GC.Spread.Sheets.VerticalAlign.bottom);
  592. }
  593. //3. shrink
  594. if ($(`#vis_shrink`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  595. cell.shrinkToFit(true);
  596. } else {
  597. cell.shrinkToFit(false);
  598. }
  599. //4. wrap
  600. if ($(`#vis_wrap`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  601. cell.wordWrap(true);
  602. } else {
  603. cell.wordWrap(false);
  604. }
  605. }
  606. }
  607. sheet.resumePaint();
  608. }
  609. },
  610. _setupCtrl: function (ctrlAttr) {
  611. let idx = rpt_tpl_cfg_helper.reportCfg.controlArr.indexOf(ctrlAttr);
  612. let ctrl = rpt_tpl_cfg_helper.reportCfg.ctrls[idx];
  613. $("#elementControlsVis")[0].selectedIndex = idx;
  614. $("#elementAlignmentHorizonVis").get(0).selectedIndex = JV.OUTPUT_ALIGN.H.indexOf(ctrl[JV.CONTROL_PROPS[2]]);
  615. $("#elementAlignmentVerticalVis").get(0).selectedIndex = JV.OUTPUT_ALIGN.V.indexOf(ctrl[JV.CONTROL_PROPS[3]]);
  616. $("#eleShrinkVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK]]);
  617. $("#eleShowZeroVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHOW_ZERO]]);
  618. $("#eleAutoWrapVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]]);
  619. $("#eleIsShrinkFirstVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]]);
  620. $("#eleCloseOutputVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]]);
  621. },
  622. _setupCellCtrlEx: function (ctrlObj) {
  623. // 原:setupCellAlignment
  624. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  625. let selectedRanges = sheet.getSelections();
  626. if (selectedRanges.length > 0) {
  627. // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  628. sheet.suspendPaint();
  629. for (let iRow = 0; iRow < selectedRanges[0].rowCount; iRow++) {
  630. for (let iCol = 0; iCol < selectedRanges[0].colCount; iCol++) {
  631. let cell = sheet.getCell(selectedRanges[0].row + iRow, selectedRanges[0].col + iCol);
  632. //1. horizon alignment
  633. if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === 'center') {
  634. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
  635. } else if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === 'left') {
  636. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
  637. } else {
  638. cell.hAlign(GC.Spread.Sheets.HorizontalAlign.right);
  639. }
  640. //2. vertical alignment
  641. if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
  642. cell.vAlign(GC.Spread.Sheets.VerticalAlign.center);
  643. } else if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
  644. cell.vAlign(GC.Spread.Sheets.VerticalAlign.bottom);
  645. } else {
  646. cell.vAlign(GC.Spread.Sheets.VerticalAlign.top);
  647. }
  648. }
  649. }
  650. sheet.resumePaint();
  651. }
  652. },
  653. _setupBorder: function (borderAttr) {
  654. let idx = rpt_tpl_cfg_helper.reportCfg.borderArr.indexOf(borderAttr);
  655. let border = rpt_tpl_cfg_helper.reportCfg.styles[idx];
  656. $("#elementBordersVis")[0].selectedIndex = idx;
  657. for (let borderLine of border[JV.PROP_BORDER_STYLE]) {
  658. switch (borderLine[JV.PROP_POSITION]) {
  659. case JV.PROP_LEFT:
  660. $("#eleBorderLeftVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
  661. break;
  662. case JV.PROP_RIGHT:
  663. $("#eleBorderRightVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
  664. break;
  665. case JV.PROP_TOP:
  666. $("#eleBorderTopVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
  667. break;
  668. case JV.PROP_BOTTOM:
  669. $("#eleBorderBottomVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
  670. break;
  671. default:
  672. break;
  673. }
  674. }
  675. },
  676. _setupCellBorderEx: function (borderObj) {
  677. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  678. let selectedRanges = sheet.getSelections();
  679. if (selectedRanges.length > 0) {
  680. sheet.suspendPaint();
  681. let borderLine = new GC.Spread.Sheets.LineBorder;
  682. let borderEmpty = new GC.Spread.Sheets.LineBorder;
  683. let borderThick = new GC.Spread.Sheets.LineBorder;
  684. borderLine.color = "Black";
  685. borderEmpty.color = "Black";
  686. borderThick.color = "Black";
  687. borderEmpty.style = GC.Spread.Sheets.LineStyle.empty;
  688. borderLine.style = GC.Spread.Sheets.LineStyle.thin;
  689. borderThick.style = GC.Spread.Sheets.LineStyle.thick;
  690. /*
  691. let cellRange = new GC.Spread.Sheets.CellRange(sheet, selectedRanges[0].row, selectedRanges[0].col, selectedRanges[0].rowCount, selectedRanges[0].colCount);
  692. const _setCB = function (lineThick, borderObj) {
  693. if (lineThick === 0) {
  694. cellRange.setBorder(borderEmpty, borderObj);
  695. } else if (lineThick === 1) {
  696. cellRange.setBorder(borderLine, borderObj);
  697. } else {
  698. cellRange.setBorder(borderThick, borderObj);
  699. }
  700. };
  701. for (let borderLine of borderObj[JV.PROP_BORDER_STYLE]) {
  702. switch (borderLine[JV.PROP_POSITION]) {
  703. case JV.PROP_LEFT:
  704. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {left: true});
  705. break;
  706. case JV.PROP_RIGHT:
  707. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {right: true});
  708. break;
  709. case JV.PROP_TOP:
  710. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {top: true});
  711. break;
  712. case JV.PROP_BOTTOM:
  713. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {bottom: true});
  714. break;
  715. default:
  716. break;
  717. }
  718. }
  719. /*/
  720. const _setCB = function (lineThick, borderObj, cellRange) {
  721. if (lineThick === 0) {
  722. cellRange.setBorder(borderEmpty, borderObj);
  723. } else if (lineThick === 1) {
  724. cellRange.setBorder(borderLine, borderObj);
  725. } else {
  726. cellRange.setBorder(borderThick, borderObj);
  727. }
  728. };
  729. let startRow = selectedRanges[0].row;
  730. for (let rowIdx = 0; rowIdx < selectedRanges[0].rowCount; rowIdx++) {
  731. let startCol = selectedRanges[0].col;
  732. for (let colIdx = 0; colIdx < selectedRanges[0].colCount; colIdx++) {
  733. let cellRange = new GC.Spread.Sheets.CellRange(sheet, startRow + rowIdx, startCol + colIdx, 1, 1);
  734. for (let borderLine of borderObj[JV.PROP_BORDER_STYLE]) {
  735. switch (borderLine[JV.PROP_POSITION]) {
  736. case JV.PROP_LEFT:
  737. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {left: true}, cellRange);
  738. break;
  739. case JV.PROP_RIGHT:
  740. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {right: true}, cellRange);
  741. break;
  742. case JV.PROP_TOP:
  743. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {top: true}, cellRange);
  744. break;
  745. case JV.PROP_BOTTOM:
  746. _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {bottom: true}, cellRange);
  747. break;
  748. default:
  749. break;
  750. }
  751. }
  752. }
  753. }
  754. //*/
  755. sheet.resumePaint();
  756. }
  757. },
  758. setupCellBorder: function () {
  759. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  760. let selectedRanges = sheet.getSelections();
  761. if (selectedRanges.length > 0) {
  762. // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  763. sheet.suspendPaint();
  764. let border = new GC.Spread.Sheets.LineBorder;
  765. border.color = "Black";
  766. if ($(`#vis_no_border`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  767. border.style = GC.Spread.Sheets.LineStyle.empty;
  768. } else {
  769. border.style = GC.Spread.Sheets.LineStyle.thin;
  770. }
  771. let cellRange = new GC.Spread.Sheets.CellRange(sheet, selectedRanges[0].row, selectedRanges[0].col, selectedRanges[0].rowCount, selectedRanges[0].colCount);
  772. if ($(`#vis_bottom_border`)[0].className === `btn btn-sm btn-outline-secondary active`) {
  773. let bottomBorder = new GC.Spread.Sheets.LineBorder;
  774. bottomBorder.color = "Black";
  775. bottomBorder.style = GC.Spread.Sheets.LineStyle.empty;
  776. cellRange.setBorder(bottomBorder, {all: true});
  777. cellRange.setBorder(border, {bottom: true});
  778. } else {
  779. cellRange.setBorder(border, {all: true});
  780. }
  781. sheet.resumePaint();
  782. }
  783. },
  784. private_setup_cell_font: function (cell, fontAttr) {
  785. let fontStr = "";
  786. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]])) {
  787. fontStr = 'bold ' + fontStr;
  788. }
  789. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]])) {
  790. fontStr = 'italic ' + fontStr;
  791. }
  792. 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]];
  793. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]])) {
  794. cell.textDecoration(GC.Spread.Sheets.TextDecorationType.underline);
  795. } else {
  796. cell.textDecoration(GC.Spread.Sheets.TextDecorationType.none);
  797. }
  798. cell.font(fontStr);
  799. },
  800. _setupFont: function(fontAttr) {
  801. if (typeof fontAttr === "string" && fontAttr !== "自定义") {
  802. $("#visElementFontNames")[0].disabled = "disabled" ;
  803. $("#visEleFontSize")[0].disabled = "disabled" ;
  804. let idx = rpt_tpl_cfg_helper.reportCfg.fontArr.indexOf(fontAttr);
  805. let font = rpt_tpl_cfg_helper.reportCfg.fonts[idx];
  806. $("#visElementFonts")[0].selectedIndex = idx;
  807. $("#visElementFontNames")[0].value = font.Name;
  808. $("#visEleFontSize")[0].value = parseInt(font.FontHeight);
  809. $("#font_other_properties_div")[0].style.display = "none";
  810. $("#vis_font_bold")[0].className = "btn btn-sm btn-outline-secondary";
  811. $("#vis_font_italic")[0].className = "btn btn-sm btn-outline-secondary";
  812. $("#vis_font_underline")[0].className = "btn btn-sm btn-outline-secondary";
  813. } else {
  814. $("#visElementFontNames")[0].removeAttribute("disabled");
  815. $("#visEleFontSize")[0].removeAttribute("disabled");
  816. $("#font_other_properties_div")[0].style.display = "";
  817. $("#visElementFonts")[0].value = "自定义";
  818. $("#visElementFontNames")[0].value = fontAttr.Name;
  819. $("#visEleFontSize")[0].value = parseInt(fontAttr.FontHeight);
  820. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]])) {
  821. $("#vis_font_bold")[0].className = "btn btn-sm btn-outline-secondary active";
  822. }
  823. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]])) {
  824. $("#vis_font_italic")[0].className = "btn btn-sm btn-outline-secondary active";
  825. }
  826. if (stringUtil.convertStrToBoolean(fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]])) {
  827. $("#vis_font_underline")[0].className = "btn btn-sm btn-outline-secondary active";
  828. }
  829. }
  830. },
  831. fontBoldChange: function (dom) {
  832. let me = this;
  833. me.private_reverse_class(dom);
  834. me.setupCellFont();
  835. },
  836. fontItalicChange: function (dom) {
  837. let me = this;
  838. me.private_reverse_class(dom);
  839. me.setupCellFont();
  840. },
  841. fontUnderlineChange: function (dom) {
  842. let me = this;
  843. me.private_reverse_class(dom);
  844. me.setupCellFont();
  845. },
  846. changeShrink: function (dom) {
  847. let me = this;
  848. me.private_reverse_class(dom);
  849. me.setupCellAlignment();
  850. },
  851. changeWrap: function (dom) {
  852. let me = this;
  853. me.private_reverse_class(dom);
  854. me.setupCellAlignment();
  855. },
  856. changeIsAutoHeight: function (dom) {
  857. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  858. let selectedRanges = sheet.getSelections();
  859. if (selectedRanges.length > 0) {
  860. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  861. if (cell.cellType() && cell.cellType().typeName === '7') {
  862. sheet.suspendPaint();
  863. let val = cell.value();
  864. if (dom.checked) {
  865. if (val.indexOf(`{`) < 0) {
  866. cell.value(`{` + val + `}`);
  867. }
  868. } else {
  869. if (val.indexOf(`{`) === 0) {
  870. cell.value(val.replace('{', '').replace('}',''));
  871. }
  872. }
  873. sheet.resumePaint();
  874. }
  875. }
  876. },
  877. private_reverse_class: function (dom) {
  878. if (dom.className === "btn btn-sm btn-outline-secondary") {
  879. dom.className = "btn btn-sm btn-outline-secondary active";
  880. } else {
  881. dom.className = "btn btn-sm btn-outline-secondary";
  882. }
  883. },
  884. changeBorderEx: function (dom) {
  885. let me = visualJumbo, borderAttr = dom.value,
  886. sheet = me.tplWorkBook.getActiveSheet();
  887. let selectedRanges = sheet.getSelections();
  888. if (selectedRanges.length > 0) {
  889. /*
  890. // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  891. me.bandMappingObj.borderAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_border"] = borderAttr;
  892. me._setupBorder(borderAttr);
  893. // 然后要设置相关Cell的边框
  894. if (typeof borderAttr === 'string') {
  895. let idx = rpt_tpl_cfg_helper.reportCfg.borderArr.indexOf(borderAttr);
  896. borderAttr = rpt_tpl_cfg_helper.reportCfg.styles[idx];
  897. }
  898. me._setupCellBorderEx(borderAttr);
  899. /*/
  900. me._setupBorder(borderAttr);
  901. if (typeof borderAttr === 'string') {
  902. let idx = rpt_tpl_cfg_helper.reportCfg.borderArr.indexOf(borderAttr);
  903. borderAttr = rpt_tpl_cfg_helper.reportCfg.styles[idx];
  904. }
  905. for (let selIdx = 0; selIdx < selectedRanges.length; selIdx++) {
  906. let startRow = selectedRanges[selIdx].row;
  907. for (let rowIdx = 0; rowIdx < selectedRanges[selIdx].rowCount; rowIdx++) {
  908. let startCol = selectedRanges[selIdx].col;
  909. for (let colIdx = 0; colIdx < selectedRanges[selIdx].colCount; colIdx++) {
  910. me.bandMappingObj.borderAttr[(startRow + rowIdx) + "_" + (startCol + colIdx) + "_border"] = dom.value;
  911. }
  912. }
  913. }
  914. me._setupCellBorderEx(borderAttr);
  915. //*/
  916. }
  917. },
  918. changeControlEx: function (dom) {
  919. let me = visualJumbo, ctrlAttr = dom.value,
  920. sheet = me.tplWorkBook.getActiveSheet();
  921. let selectedRanges = sheet.getSelections();
  922. if (selectedRanges.length > 0) {
  923. /*
  924. me.bandMappingObj.ctrlAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_ctrl"] = ctrlAttr;
  925. me._setupCtrl(ctrlAttr);
  926. // 然后要设置相关Cell的上下左右控制(就是原setupCellAlignment)
  927. if (typeof ctrlAttr === 'string') {
  928. let idx = rpt_tpl_cfg_helper.reportCfg.controlArr.indexOf(ctrlAttr);
  929. ctrlAttr = rpt_tpl_cfg_helper.reportCfg.ctrls[idx];
  930. }
  931. me._setupCellCtrlEx(ctrlAttr);
  932. /*/
  933. me._setupCtrl(ctrlAttr);
  934. if (typeof ctrlAttr === 'string') {
  935. let idx = rpt_tpl_cfg_helper.reportCfg.controlArr.indexOf(ctrlAttr);
  936. ctrlAttr = rpt_tpl_cfg_helper.reportCfg.ctrls[idx];
  937. }
  938. for (let selIdx = 0; selIdx < selectedRanges.length; selIdx++) {
  939. let startRow = selectedRanges[selIdx].row;
  940. for (let rowIdx = 0; rowIdx < selectedRanges[selIdx].rowCount; rowIdx++) {
  941. let startCol = selectedRanges[selIdx].col;
  942. for (let colIdx = 0; colIdx < selectedRanges[selIdx].colCount; colIdx++) {
  943. me.bandMappingObj.ctrlAttr[(startRow + rowIdx) + "_" + (startCol + colIdx) + "_ctrl"] = dom.value;
  944. }
  945. }
  946. }
  947. me._setupCellCtrlEx(ctrlAttr);
  948. //*/
  949. }
  950. },
  951. changeHAlign: function (dom) {
  952. let me = this;
  953. if (dom.className === "btn btn-sm btn-outline-secondary") {
  954. dom.className = "btn btn-sm btn-outline-secondary active"
  955. let hKeys = [`hAlign_left`, `hAlign_center`, `hAlign_right`];
  956. let domIdx = hKeys.indexOf(dom.id);
  957. if (domIdx >= 0) {
  958. for (let idx = 0; idx < hKeys.length; idx++) {
  959. if (idx !== domIdx) {
  960. $(`#` + hKeys[idx])[0].className = "btn btn-sm btn-outline-secondary";
  961. }
  962. }
  963. }
  964. me.setupCellAlignment();
  965. }
  966. },
  967. changeVAlign: function (dom) {
  968. let me = this;
  969. if (dom.className === "btn btn-sm btn-outline-secondary") {
  970. dom.className = "btn btn-sm btn-outline-secondary active"
  971. let hKeys = [`vAlign_top`, `vAlign_center`, `vAlign_bottom`];
  972. let domIdx = hKeys.indexOf(dom.id);
  973. if (domIdx >= 0) {
  974. for (let idx = 0; idx < hKeys.length; idx++) {
  975. if (idx !== domIdx) {
  976. $(`#` + hKeys[idx])[0].className = "btn btn-sm btn-outline-secondary";
  977. }
  978. }
  979. }
  980. me.setupCellAlignment();
  981. }
  982. },
  983. changeBorder: function (dom) {
  984. let me = this;
  985. if (dom.className === "btn btn-sm btn-outline-secondary") {
  986. dom.className = "btn btn-sm btn-outline-secondary active"
  987. let hKeys = [`vis_outter_border`, `vis_no_border`, `vis_bottom_border`];
  988. let domIdx = hKeys.indexOf(dom.id);
  989. if (domIdx >= 0) {
  990. for (let idx = 0; idx < hKeys.length; idx++) {
  991. if (idx !== domIdx) {
  992. $(`#` + hKeys[idx])[0].className = "btn btn-sm btn-outline-secondary";
  993. }
  994. }
  995. }
  996. me.setupCellBorder();
  997. }
  998. },
  999. changeCellType: function (newType) {
  1000. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  1001. let selectedRanges = sheet.getSelections();
  1002. if (selectedRanges.length > 0) {
  1003. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  1004. switch (newType) {
  1005. case `field`:
  1006. let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
  1007. let cellType = new GC.Spread.Sheets.CellTypes.ComboBox();
  1008. // let selectableFields = me.getSelectedFields(rptTpl);
  1009. let selectableFields = visualCommonOprObj.getAllSelectedFields();
  1010. cellType.items(selectableFields);
  1011. cell.cellType(cellType);
  1012. break;
  1013. case `text`:
  1014. default:
  1015. cell.cellType(new GC.Spread.Sheets.CellTypes.Text());
  1016. cell.value(``);
  1017. break;
  1018. }
  1019. }
  1020. },
  1021. changePreSuf: function (typeStr, dom) {
  1022. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  1023. let selectedRanges = sheet.getSelections();
  1024. if (selectedRanges.length > 0) {
  1025. let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
  1026. let fps = me.bandMappingObj.fieldPreSufAttr[cell.row + "_" + cell.col + "_fieldPreSuf"];
  1027. if (!fps) {
  1028. fps = visualCommonOprObj.createDftFieldPreSuf();
  1029. me.bandMappingObj.fieldPreSufAttr[cell.row + "_" + cell.col + "_fieldPreSuf"] = fps;
  1030. }
  1031. fps[typeStr] = dom.value;
  1032. }
  1033. },
  1034. applyBack: function () {
  1035. let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
  1036. let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
  1037. let xPos = [0], yPos = [0];
  1038. for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
  1039. xPos.push(sheet.getRowHeight(iRow) + xPos[xPos.length - 1]);
  1040. for (let iCol = 0; iCol < sheet.getColumnCount(); iCol++) {
  1041. yPos.push(sheet.getColumnWidth(iCol) + yPos[yPos.length - 1]);
  1042. }
  1043. }
  1044. if (rptTpl[JV.NODE_FLOW_INFO]) {
  1045. //流水式
  1046. me.applyBack_Flow(rptTpl, sheet, xPos, yPos);
  1047. } else if (rptTpl[JV.NODE_BILL_INFO]) {
  1048. //账单式
  1049. me.applyBack_Bill(rptTpl, sheet, xPos, yPos);
  1050. } else if (rptTpl[JV.NODE_CROSS_INFO]) {
  1051. //交叉式
  1052. //目前暂缓
  1053. me.applyBack_Cross(rptTpl, sheet, xPos, yPos);
  1054. }
  1055. },
  1056. applyBack_Flow: function (rptTpl, sheet, xPos, yPos) {
  1057. let me = this;
  1058. let startRow = -1, handledBands = [];
  1059. let discreteNodesArr = [];
  1060. //先清除所有相关text/field节点,然后再重新生成
  1061. me.private_clear_flow_txt_fld_nodes();
  1062. let textFldArr = [], colWidthArr = [], rowHeightArr = [];
  1063. //1. 锚定column / content(& grouping)
  1064. let columnBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_COLUMN][JV.PROP_BAND_NAME], rptTpl);
  1065. handledBands.push(columnBand[JV.PROP_NAME]);
  1066. me.private_setup_bandHeight(columnBand[JV.PROP_NAME], columnBand, sheet);
  1067. startRow = me.collectSheetTxtFldByArea(sheet, me.bandMappingObj[columnBand[JV.PROP_NAME]][JV.PROP_COLOR] , textFldArr, colWidthArr, rowHeightArr);
  1068. let columnNodes = [];
  1069. let columnDisFieldArr = null;
  1070. for (let txtFld of textFldArr) {
  1071. if (txtFld.isField) {
  1072. if (columnDisFieldArr === null) {
  1073. columnDisFieldArr = {Name: "子项", BandName: columnBand[JV.PROP_NAME], items: [[],[]], isParent: true};
  1074. discreteNodesArr.push(columnDisFieldArr);
  1075. }
  1076. let fldNode = me.private_create_field_param_node(sheet, txtFld, startRow, colWidthArr, rowHeightArr, rptTpl);
  1077. columnDisFieldArr.items[0].push(fldNode);
  1078. } else {
  1079. let node = me.createTxtNode(txtFld, sheet, startRow, colWidthArr, rowHeightArr);
  1080. columnNodes.push(node);
  1081. }
  1082. }
  1083. let cotentBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_BAND_NAME], rptTpl);
  1084. handledBands.push(cotentBand[JV.PROP_NAME]);
  1085. me.private_setup_flow_content_height(rptTpl, cotentBand[JV.PROP_NAME], sheet);
  1086. textFldArr = [];
  1087. colWidthArr = [];
  1088. rowHeightArr = [];
  1089. startRow = me.collectSheetTxtFldByArea(sheet, me.bandMappingObj[cotentBand[JV.PROP_NAME]][JV.PROP_COLOR] , textFldArr, colWidthArr, rowHeightArr);
  1090. let contentNodes = [];
  1091. for (let field of textFldArr) {
  1092. if (field.isField) {
  1093. let node = me.private_create_field_param_node(sheet, field, startRow, colWidthArr, rowHeightArr, null);
  1094. contentNodes.push(node);
  1095. }
  1096. }
  1097. //2. 锚定 统计类型
  1098. let pageTotalBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM][JV.PROP_BAND_NAME], rptTpl);
  1099. let pageSummaryNodes = [[], []];
  1100. if (pageTotalBand) {
  1101. handledBands.push(pageTotalBand[JV.PROP_NAME]);
  1102. me.private_setup_bandHeight(pageTotalBand[JV.PROP_NAME], pageTotalBand, sheet);
  1103. me.private_build_txt_fld_nodes(pageTotalBand, sheet, rptTpl, pageSummaryNodes);
  1104. }
  1105. let segTotalBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM][JV.PROP_BAND_NAME], rptTpl);
  1106. let segSummaryNodes = [[], []];
  1107. if (segTotalBand) {
  1108. handledBands.push(segTotalBand[JV.PROP_NAME]);
  1109. me.private_setup_bandHeight(segTotalBand[JV.PROP_NAME], segTotalBand, sheet);
  1110. me.private_build_txt_fld_nodes(segTotalBand, sheet, rptTpl, segSummaryNodes);
  1111. }
  1112. //3. 其他就归类到离散去了
  1113. if (me.bandMappingObj && me.bandMappingObj.items && me.bandMappingObj.items.length > 0) {
  1114. for (let sBandMap of me.bandMappingObj.items) {
  1115. if (handledBands.indexOf(sBandMap[JV.PROP_BAND_NAME]) < 0 && sBandMap[JV.PROP_COLOR] !== 'White') {
  1116. let sArr = {Name: "子项", BandName: sBandMap[JV.PROP_BAND_NAME], items: [[],[]], isParent: true};
  1117. let sBand = visualCommonOprObj.getBandEx(sBandMap[JV.PROP_BAND_NAME], rptTpl);
  1118. if (sBand) {
  1119. me.private_setup_bandHeight(sBand[JV.PROP_NAME], sBand, sheet);
  1120. me.private_build_txt_fld_nodes(sBand, sheet, rptTpl, sArr.items);
  1121. }
  1122. if (sArr.items[0].length > 0 || sArr.items[1].length > 0) {
  1123. discreteNodesArr.push(sArr);
  1124. }
  1125. }
  1126. }
  1127. }
  1128. //4. 最后生成节点
  1129. me.private_create_tpl_flow_nodes(columnNodes, contentNodes, pageSummaryNodes, segSummaryNodes, null, discreteNodesArr);
  1130. displayMessage("应用提交成功!", "green", 5000, "id_vis_setup_lbl");
  1131. },
  1132. private_build_txt_fld_nodes: function (band, sheet, rptTpl, destNodes) {
  1133. let me = this;
  1134. me.private_setup_bandHeight(band[JV.PROP_NAME], band, sheet);
  1135. let textFldArr = [], colWidthArr = [], rowHeightArr = [];
  1136. let startRow = me.collectSheetTxtFldByArea(sheet, me.bandMappingObj[band[JV.PROP_NAME]][JV.PROP_COLOR] , textFldArr, colWidthArr, rowHeightArr);
  1137. for (let txtFld of textFldArr) {
  1138. if (txtFld.isField) {
  1139. let fldNode = me.private_create_field_param_node(sheet, txtFld, startRow, colWidthArr, rowHeightArr, rptTpl);
  1140. destNodes[0].push(fldNode);
  1141. } else {
  1142. let txtNode = me.createTxtNode(txtFld, sheet, startRow, colWidthArr, rowHeightArr);
  1143. destNodes[1].push(txtNode);
  1144. }
  1145. }
  1146. },
  1147. private_create_tpl_flow_nodes: function (columnNodes, contentNodes, pageSummaryNodes, segSummaryNodes, groupSummaryNodes, discreteNodesArr) {
  1148. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1149. for (let node of nodes) {
  1150. if (node[JV.PROP_NAME].indexOf('_列') >= 0) {
  1151. //列
  1152. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, columnNodes, true);
  1153. } else if (node[JV.PROP_NAME].indexOf('数据') >= 0) {
  1154. //数据
  1155. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, contentNodes, true);
  1156. } else if (node[JV.PROP_NAME].indexOf('_页统计') >= 0) {
  1157. //页统计
  1158. if (pageSummaryNodes[0].length > 0) {
  1159. dataInfoMapTreeOprObj.treeObj.addNodes(node.items[0], -1, pageSummaryNodes[0], true);
  1160. }
  1161. if (pageSummaryNodes[1].length > 0) {
  1162. dataInfoMapTreeOprObj.treeObj.addNodes(node.items[1], -1, pageSummaryNodes[1], true);
  1163. }
  1164. } else if (node[JV.PROP_NAME].indexOf('_段统计') >= 0) {
  1165. //章统计
  1166. if (segSummaryNodes[0].length > 0) {
  1167. dataInfoMapTreeOprObj.treeObj.addNodes(node.items[0], -1, segSummaryNodes[0], true);
  1168. }
  1169. if (segSummaryNodes[1].length > 0) {
  1170. dataInfoMapTreeOprObj.treeObj.addNodes(node.items[1], -1, segSummaryNodes[1], true);
  1171. }
  1172. } else if (node[JV.PROP_NAME].indexOf('_分组') >= 0) {
  1173. //分组统计
  1174. // for (let subNode of node.items) {
  1175. // dataInfoMapTreeOprObj.treeObj.removeChildNodes(subNode);
  1176. // }
  1177. } else if (node[JV.PROP_NAME].indexOf('离散') >= 0) {
  1178. //离散信息
  1179. if (discreteNodesArr) {
  1180. for (let dNode of discreteNodesArr) {
  1181. let discreteNode = {"Name": "子项", "BandName": dNode[JV.PROP_BAND_NAME], "items": [{"Name": "离散字段集", "items": [], "isParent": true},{"Name": "离散文本集", "items": [], "isParent": true}], "isParent": true};
  1182. if (dNode.items[0].length > 0) {
  1183. // dataInfoMapTreeOprObj.treeObj.addNodes(node.items[0], -1, segSummaryNodes[0], true);
  1184. discreteNode.items[0].items = dNode.items[0];
  1185. }
  1186. if (dNode.items[1].length > 0) {
  1187. // dataInfoMapTreeOprObj.treeObj.addNodes(node.items[1], -1, segSummaryNodes[1], true);
  1188. discreteNode.items[1].items = dNode.items[1];
  1189. }
  1190. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, discreteNode, true);
  1191. }
  1192. }
  1193. }
  1194. }
  1195. },
  1196. private_create_field_param_node: function (sheet, field, startRow, colWidthArr, rowHeightArr, rptTpl) {
  1197. let me = this;
  1198. let isAutoHeight = false;
  1199. if (field.text && field.text.indexOf(`{`) === 0) {
  1200. isAutoHeight = true;
  1201. field.text = field.text.replace('{', '').replace('}','');
  1202. }
  1203. let rst = {"Name": field.text, "Title": '', "FieldID": -1, "font": "Content", "control": "Column", "style" : "Default_Normal", "isAutoHeight" : false,
  1204. "area" : {"Left" : 0, "Right" : 100, "Top" : 0, "Bottom" : 100, "H_CalculationType" : "percentage", "V_CalculationType" : "percentage"}
  1205. };
  1206. //1. 设置FieldID
  1207. let hasChkField = false;
  1208. let native_chk_field_param = function (fpArr) {
  1209. for (let rptField of fpArr) {
  1210. if (rptField[JV.PROP_NAME] === field.text) {
  1211. rst.FieldID = rptField[JV.PROP_ID];
  1212. rst["Title"] = "ID: " + rptField[JV.PROP_ID];
  1213. hasChkField = true;
  1214. break;
  1215. }
  1216. }
  1217. };
  1218. if (rptTpl) {
  1219. if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS] !== undefined && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS].length > 0) {
  1220. native_chk_field_param(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]);
  1221. }
  1222. if (!hasChkField && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS] !== undefined && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS].length > 0) {
  1223. native_chk_field_param(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]);
  1224. }
  1225. if (!hasChkField && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS] !== undefined && rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS].length > 0) {
  1226. native_chk_field_param(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]);
  1227. }
  1228. if (!hasChkField && rptTpl[JV.NODE_NO_MAPPING_FIELDS] !== undefined && rptTpl[JV.NODE_NO_MAPPING_FIELDS].length > 0) {
  1229. native_chk_field_param(rptTpl[JV.NODE_NO_MAPPING_FIELDS]);
  1230. }
  1231. if (!hasChkField && rptTpl[JV.NODE_DISCRETE_PARAMS] !== undefined && rptTpl[JV.NODE_DISCRETE_PARAMS].length > 0) {
  1232. native_chk_field_param(rptTpl[JV.NODE_DISCRETE_PARAMS]);
  1233. if (hasChkField) {
  1234. rst.ParamID = rst.FieldID;
  1235. delete rst.FieldID;
  1236. }
  1237. }
  1238. } else {
  1239. let nodes1 = fieldMapTreeOprObj.treeObj.getNodes();
  1240. for (let node of nodes1) {
  1241. if (node.items && node.items.length > 0) {
  1242. native_chk_field_param(node.items);
  1243. }
  1244. if (hasChkField) break;
  1245. }
  1246. if (!hasChkField) {
  1247. let nodes2 = discreteFieldParamTreeOprObj.treeObj.getNodes();
  1248. for (let node of nodes2) {
  1249. if (node.items && node.items.length > 0) {
  1250. native_chk_field_param(node.items);
  1251. }
  1252. if (hasChkField) break;
  1253. }
  1254. }
  1255. }
  1256. let cell = sheet.getCell(field.row, field.col);
  1257. //2. 字体
  1258. rst[JV.PROP_FONT] = me.private_getFontByCellProperties(cell);
  1259. rst[JV.PROP_STYLE] = me.private_getBorderByCellProperties(cell);
  1260. rst[JV.PROP_CONTROL] = me.private_getCtrlByCellProperties(cell);
  1261. //3. 自动行高
  1262. rst[JV.PROP_IS_AUTO_HEIGHT] = isAutoHeight;
  1263. //4. 左右位置%
  1264. me.setupHeightWidth(rst, field, startRow, colWidthArr, rowHeightArr);
  1265. //5. 其他(前后缀、Format、默认值)
  1266. let preSufCfg = me.bandMappingObj.fieldPreSufAttr[field.row + "_" + field.col + "_fieldPreSuf"];
  1267. if (preSufCfg) {
  1268. if (preSufCfg[JV.PROP_PREFIX]) {
  1269. rst[JV.PROP_PREFIX] = preSufCfg[JV.PROP_PREFIX];
  1270. }
  1271. if (preSufCfg[JV.PROP_SUFFIX]) {
  1272. rst[JV.PROP_SUFFIX] = preSufCfg[JV.PROP_SUFFIX];
  1273. }
  1274. if (preSufCfg[JV.PROP_FORMAT]) {
  1275. rst[JV.PROP_FORMAT] = preSufCfg[JV.PROP_FORMAT];
  1276. }
  1277. if (preSufCfg[JV.PROP_DFT_VALUE]) {
  1278. rst[JV.PROP_DFT_VALUE] = preSufCfg[JV.PROP_DFT_VALUE];
  1279. }
  1280. }
  1281. return rst;
  1282. },
  1283. private_clear_flow_txt_fld_nodes: function () {
  1284. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1285. for (let node of nodes) {
  1286. if (node[JV.PROP_NAME].indexOf('_列') >= 0 || node[JV.PROP_NAME].indexOf('数据') >= 0) {
  1287. //1. 列 / 数据
  1288. dataInfoMapTreeOprObj.treeObj.removeChildNodes(node);
  1289. } else if (node[JV.PROP_NAME].indexOf('_页统计') >= 0 || node[JV.PROP_NAME].indexOf('_段统计') >= 0) {
  1290. //3. 页统计 / 章统计
  1291. for (let subNode of node.items) {
  1292. dataInfoMapTreeOprObj.treeObj.removeChildNodes(subNode);
  1293. }
  1294. } else if (node[JV.PROP_NAME].indexOf('_分组') >= 0) {
  1295. //5. 分组统计
  1296. for (let subNode of node.items) {
  1297. dataInfoMapTreeOprObj.treeObj.removeChildNodes(subNode);
  1298. }
  1299. } else if (node[JV.PROP_NAME].indexOf('离散') >= 0) {
  1300. //6. 离散信息
  1301. dataInfoMapTreeOprObj.treeObj.removeChildNodes(node);
  1302. }
  1303. }
  1304. },
  1305. applyBack_Bill: function (rptTpl, sheet, xPos, yPos) {
  1306. let me = this;
  1307. // let pageWith = xPos[xPos.length - 1];
  1308. //先清除所有相关text/field节点,然后再重新生成
  1309. me.private_clear_bill_txt_fld_nodes();
  1310. //1. 锚定content
  1311. let cotentBand = visualCommonOprObj.getBandEx(rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT][JV.PROP_BAND_NAME], rptTpl);
  1312. let textFldArr = [], colWidthArr = [], rowHeightArr = [];
  1313. let startRow = me.collectSheetTxtFldByArea(sheet, me.bandMappingObj[cotentBand[JV.PROP_NAME]][JV.PROP_COLOR] , textFldArr, colWidthArr, rowHeightArr);
  1314. let contentNodes = [];
  1315. for (let field of textFldArr) {
  1316. if (field.isField) {
  1317. let node = me.private_create_field_param_node(sheet, field, startRow, colWidthArr, rowHeightArr, rptTpl);
  1318. contentNodes.push(node);
  1319. }
  1320. }
  1321. //2. 其他就归类到离散去了
  1322. let discreteNodesArr = [];
  1323. if (me.bandMappingObj && me.bandMappingObj.items && me.bandMappingObj.items.length > 0) {
  1324. for (let sBandMap of me.bandMappingObj.items) {
  1325. let sArr = {Name: "子项", BandName: sBandMap[JV.PROP_BAND_NAME], items: [[],[]], isParent: true};
  1326. let sBand = visualCommonOprObj.getBandEx(sBandMap[JV.PROP_BAND_NAME], rptTpl);
  1327. if (sBand) {
  1328. me.private_setup_bandHeight(sBand[JV.PROP_NAME], sBand, sheet);
  1329. me.private_build_txt_fld_nodes(sBand, sheet, rptTpl, sArr.items);
  1330. if (sBand[JV.PROP_NAME] === cotentBand[JV.PROP_NAME]) {
  1331. sArr.items[0] = []; //清除指标集合(因与步骤1的结果有重叠了)
  1332. }
  1333. }
  1334. if (sArr.items[0].length > 0 || sArr.items[1].length > 0) {
  1335. discreteNodesArr.push(sArr);
  1336. }
  1337. }
  1338. }
  1339. //3. 最后生成节点
  1340. me.private_create_tpl_bill_nodes(contentNodes, discreteNodesArr);
  1341. displayMessage("应用提交成功!", "green", 5000, "id_vis_setup_lbl");
  1342. },
  1343. private_clear_bill_txt_fld_nodes: function () {
  1344. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1345. for (let node of nodes) {
  1346. dataInfoMapTreeOprObj.treeObj.removeChildNodes(node);
  1347. //bill类型可以直接remove child nodes
  1348. }
  1349. },
  1350. private_create_tpl_bill_nodes: function (contentNodes, discreteNodesArr) {
  1351. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1352. for (let node of nodes) {
  1353. if (node[JV.PROP_NAME].indexOf('数据') >= 0) {
  1354. //数据
  1355. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, contentNodes, true);
  1356. } else if (node[JV.PROP_NAME].indexOf('离散') >= 0) {
  1357. //离散信息
  1358. if (discreteNodesArr) {
  1359. for (let dNode of discreteNodesArr) {
  1360. let discreteNode = {"Name": "子项", "BandName": dNode[JV.PROP_BAND_NAME], "items": [{"Name": "离散字段集", "items": [], "isParent": true},{"Name": "离散文本集", "items": [], "isParent": true}], "isParent": true};
  1361. if (dNode.items[0].length > 0) {
  1362. // dataInfoMapTreeOprObj.treeObj.addNodes(node.items[0], -1, segSummaryNodes[0], true);
  1363. discreteNode.items[0].items = dNode.items[0];
  1364. }
  1365. if (dNode.items[1].length > 0) {
  1366. // dataInfoMapTreeOprObj.treeObj.addNodes(node.items[1], -1, segSummaryNodes[1], true);
  1367. discreteNode.items[1].items = dNode.items[1];
  1368. }
  1369. dataInfoMapTreeOprObj.treeObj.addNodes(node, -1, discreteNode, true);
  1370. }
  1371. }
  1372. }
  1373. }
  1374. },
  1375. applyBack_Cross: function (rptTpl, sheet, xPos, yPos) {
  1376. let me = this;
  1377. let pageWith = xPos[xPos.length - 1];
  1378. //先清除所有相关text/field节点,然后再重新生成
  1379. me.private_clear_cross_txt_fld_nodes();
  1380. //1. 锚定...
  1381. },
  1382. private_clear_cross_txt_fld_nodes: function () {
  1383. let nodes = dataInfoMapTreeOprObj.treeObj.getNodes();
  1384. for (let node of nodes) {
  1385. //
  1386. }
  1387. },
  1388. private_setup_flow_content_height: function (rptTpl, bandName, sheet) {
  1389. let me = visualJumbo;
  1390. if (me.bandMappingObj[bandName]) {
  1391. let bandColor = me.bandMappingObj[bandName][JV.PROP_COLOR];
  1392. for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
  1393. if (sheet.getCell(iRow, 0).backColor() === bandColor) {
  1394. rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] = (sheet.getRowHeight(iRow) / unitFactor).toFixed(2);
  1395. $(`#element_content_height`)[0].value = (sheet.getRowHeight(iRow) / unitFactor).toFixed(2);
  1396. }
  1397. }
  1398. }
  1399. },
  1400. private_setup_bandHeight: function (bandName, band, sheet) {
  1401. let me = visualJumbo;
  1402. if (band && me.bandMappingObj[bandName]) {
  1403. let bandColor = me.bandMappingObj[bandName][JV.PROP_COLOR];
  1404. let isFirst = true, firstRowIdx = -1, lastRowIdx = -1;
  1405. for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
  1406. if (sheet.getCell(iRow, 0).backColor() === bandColor) {
  1407. lastRowIdx = iRow;
  1408. if (isFirst) {
  1409. firstRowIdx = iRow;
  1410. isFirst = false;
  1411. }
  1412. }
  1413. }
  1414. if (firstRowIdx >= 0) {
  1415. let bH = 0;
  1416. for (let idx = firstRowIdx; idx <= lastRowIdx; idx++) {
  1417. bH += sheet.getRowHeight(idx);
  1418. }
  1419. let bandH = (bH / unitFactor).toFixed(2);
  1420. band[JV.BAND_PROP_HEIGHT] = bandH;
  1421. bandTreeOprObj.changeBandHeight(bandName, bandH);
  1422. }
  1423. }
  1424. },
  1425. collectSheetTxtFldByArea: function (sheet, backColor, textArr, colWidthArr, rowHeightArr) {
  1426. let me = this, allSpans = sheet.getSpans();
  1427. let startRow = -1, endRow = -1;
  1428. let isFirst = true;
  1429. for (let idx = 0; idx < sheet.getRowCount(); idx++) {
  1430. if (sheet.getCell(idx, 0).backColor() === backColor) {
  1431. if (isFirst) {
  1432. startRow = idx;
  1433. isFirst = false;
  1434. }
  1435. endRow = idx;
  1436. }
  1437. }
  1438. let spans = [];
  1439. for (let span of allSpans) {
  1440. if (span.row >= startRow && span.row <= endRow) {
  1441. spans.push(span);
  1442. }
  1443. }
  1444. for (let span of spans) {
  1445. me.private_build_pre_text(sheet, textArr, span.row, span.col, span.rowCount, span.colCount);
  1446. }
  1447. for (let iRow = startRow; iRow <= endRow; iRow++) {
  1448. rowHeightArr.push(sheet.getRowHeight(iRow));
  1449. if (iRow > startRow) {
  1450. rowHeightArr[iRow - startRow] = rowHeightArr[iRow - startRow] + rowHeightArr[iRow - startRow - 1];
  1451. }
  1452. for (let jCol = 0; jCol < sheet.getColumnCount(); jCol++) {
  1453. if (iRow === startRow) {
  1454. colWidthArr.push(sheet.getColumnWidth(jCol));
  1455. if (jCol > 0) {
  1456. colWidthArr[jCol] = colWidthArr[jCol] + colWidthArr[jCol - 1];
  1457. }
  1458. }
  1459. if (!visualCommonOprObj.checkInSpan(spans, iRow, jCol)) {
  1460. me.private_build_pre_text(sheet, textArr, iRow, jCol, 1, 1);
  1461. }
  1462. }
  1463. }
  1464. return startRow;
  1465. },
  1466. private_build_pre_text: function (sheet, textArr, row, col, rowCount, colCount) {
  1467. let cell = sheet.getCell(row, col);
  1468. let textValue = sheet.getValue(row, col);
  1469. let isField = false, isBlank = false;
  1470. if (textValue && cell.cellType() && cell.cellType().typeName === '7') {
  1471. isField = true;
  1472. } else {
  1473. isBlank = stringUtil.isEmptyString(textValue);
  1474. if (isBlank) {
  1475. let border = cell.borderBottom();
  1476. if (border && border.style === GC.Spread.Sheets.LineStyle.thin) {
  1477. isBlank = false;
  1478. }
  1479. }
  1480. }
  1481. if (!isBlank) {
  1482. textArr.push({"row": row, "col": col, "rowCount": rowCount, "colCount": colCount, "text": textValue, "isField": isField});
  1483. }
  1484. },
  1485. createTxtNode: function (text, sheet, startRow, colWidthArr, rowHeightArr) {
  1486. let me = this, rst = dataInfoMapTreeOprObj.getDummyTextNode(null);
  1487. me.setupHeightWidth(rst, text, startRow, colWidthArr, rowHeightArr);
  1488. if (stringUtil.isEmptyString(text[`text`])) {
  1489. rst[JV.PROP_NAME] = '';
  1490. } else {
  1491. rst[JV.PROP_NAME] = stringUtil.replaceAll(stringUtil.replaceAll(text[`text`].toString(), '\n', '|'), '\r', '');
  1492. }
  1493. rst[JV.PROP_LABEL] = rst[JV.PROP_NAME];
  1494. //then setup font/border/control
  1495. let cell = sheet.getCell(text.row, text.col);
  1496. rst[JV.PROP_FONT] = me.private_getFontByCellProperties(cell);
  1497. rst[JV.PROP_STYLE] = me.private_getBorderByCellProperties(cell);
  1498. rst[JV.PROP_CONTROL] = me.private_getCtrlByCellProperties(cell);
  1499. return rst;
  1500. },
  1501. setupHeightWidth: function (dest, text, startRow, colWidthArr, rowHeightArr) {
  1502. let width = colWidthArr[colWidthArr.length - 1], height = rowHeightArr[rowHeightArr.length - 1];
  1503. dest[JV.PROP_AREA][JV.PROP_RIGHT] = (colWidthArr[text.col + text.colCount - 1] / width * 100).toFixed(2);
  1504. if (text.col > 0) {
  1505. dest[JV.PROP_AREA][JV.PROP_LEFT] = (colWidthArr[text.col - 1] / width * 100).toFixed(2);
  1506. } else {
  1507. dest[JV.PROP_AREA][JV.PROP_LEFT] = 0;
  1508. }
  1509. dest[JV.PROP_AREA][JV.PROP_BOTTOM] = (rowHeightArr[text.row - startRow + text.rowCount - 1] / height * 100).toFixed(2);
  1510. if (text.row > startRow) {
  1511. dest[JV.PROP_AREA][JV.PROP_TOP] = (rowHeightArr[text.row - startRow - 1] / height * 100).toFixed(2);
  1512. } else {
  1513. dest[JV.PROP_AREA][JV.PROP_TOP] = 0;
  1514. }
  1515. },
  1516. private_getFontByCellProperties: function (cell) {
  1517. let me = this, rst = 'Content';
  1518. if (me.bandMappingObj.fontAttr[cell.row + "_" + cell.col + "_font"]) {
  1519. rst = me.bandMappingObj.fontAttr[cell.row + "_" + cell.col + "_font"];
  1520. }
  1521. return rst;
  1522. },
  1523. private_getBorderByCellProperties: function (cell) {
  1524. let me = this, rst = 'Default_None';
  1525. if (me.bandMappingObj.borderAttr[cell.row + "_" + cell.col + "_border"]) {
  1526. rst = me.bandMappingObj.borderAttr[cell.row + "_" + cell.col + "_border"];
  1527. }
  1528. return rst;
  1529. },
  1530. private_getCtrlByCellProperties: function (cell) {
  1531. let me = this, rst = 'Default';
  1532. if (me.bandMappingObj.ctrlAttr[cell.row + "_" + cell.col + "_ctrl"]) {
  1533. rst = me.bandMappingObj.ctrlAttr[cell.row + "_" + cell.col + "_ctrl"]; }
  1534. return rst;
  1535. }
  1536. };