rpt_tpl_vis_jumbo.js 78 KB

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