Prechádzať zdrojové kódy

报表可视化改进

TonyKang 3 rokov pred
rodič
commit
15459312ad

+ 75 - 13
web/maintain/report/html/rpt_tpl_vis_jumbo.html

@@ -56,25 +56,87 @@
                         <a id="vis_font_italic" class="btn btn-sm btn-outline-secondary" title="斜体" onclick="visualJumbo.fontItalicChange(this)"><i class="fa fa-italic"></i></a>
                         <a id="vis_font_underline" class="btn btn-sm btn-outline-secondary" title="下划线" onclick="visualJumbo.fontUnderlineChange(this)"><i class="fa fa-underline"></i></a>
                     </div>
+                    <div class="form-group col-md-2">
+                        <select class="form-control" id="elementBordersVis" onchange="visualJumbo.changeBorderEx(this)"></select>
+                    </div>
+                    <div class="form-group col-md-1">
+                        <input class="form-control input-sm" id="eleBorderLeftVis" type="number" value="0" step="1" min="0" max="3" disabled>
+                    </div>
+                    <div class="form-group col-md-1">
+                        <input class="form-control input-sm" id="eleBorderRightVis" type="number" value="0" step="1" min="0" max="3" disabled>
+                    </div>
+                    <div class="form-group col-md-1">
+                        <input class="form-control input-sm" id="eleBorderTopVis" type="number" value="0" step="1" min="0" max="3" disabled>
+                    </div>
+                    <div class="form-group col-md-1">
+                        <input class="form-control input-sm" id="eleBorderBottomVis" type="number" value="0" step="1" min="0" max="3" disabled>
+                    </div>
+
+                </div>
+            </div>
+            <!--
+            <div class="row" id="ele_visual_div_cfg01">
+            </div>
+            -->
+            <div class="row" id="ele_visual_div_cfg02">
+                <div class="form-group col-md-2">
+                    <label>控制选择</label>
+                    <select class="form-control" id="elementControlsVis" onchange="visualJumbo.changeControlEx(this)"></select>
+                </div>
+                <div class="form-group col-md-2">
+                    <label>横向对齐</label>
+                    <select class="form-control" id="elementAlignmentHorizonVis" disabled>
+
+                    </select>
+                </div>
+                <div class="form-group col-md-2">
+                    <label>纵向对齐</label>
+                    <select class="form-control" id="elementAlignmentVerticalVis" disabled></select>
+                </div>
+                <div class="form-group col-md-5">
+                    <label>控制其他特性</label>
+                    <div class="form-check">
+                        <label class="form-check-label">
+                            <input type="checkbox" class="form-check-input" id="eleShrinkVis" onchange="" disabled>
+                            自动缩放
+                        </label>&nbsp&nbsp
+                        <label class="form-check-label">
+                            <input type="checkbox" class="form-check-input" id="eleShowZeroVis" onchange="" disabled>
+                            显示0
+                        </label>&nbsp&nbsp
+                        <label class="form-check-label">
+                            <input type="checkbox" class="form-check-input" id="eleAutoWrapVis" onchange="" disabled>
+                            自动折行
+                        </label>
+                        <label class="form-check-label"> </label>
+                        <label class="form-check-label">
+                            <input type="checkbox" class="form-check-input" id="eleIsShrinkFirstVis" onchange="" disabled>
+                            缩放优先
+                        </label>
+                        <label class="form-check-label">
+                            <input type="checkbox" class="form-check-input" id="eleCloseOutputVis" onchange="" disabled>
+                            紧密输出
+                        </label>
+                    </div>
                 </div>
             </div>
             <div class="row" id="ele_visual_div_cfg2">
                 <div class="form-group col-md-12">
-                    <a id="hAlign_left" class="btn btn-sm btn-outline-secondary active" title="左对齐" onclick="visualJumbo.changeHAlign(this)"><i class="icon zyfont zy-ic_format_align_left"></i></a>
-                    <a id="hAlign_center" class="btn btn-sm btn-outline-secondary" title="水平中对齐" onclick="visualJumbo.changeHAlign(this)"><i class="icon zyfont zy-ic_format_align_center"></i></a>
-                    <a id="hAlign_right" class="btn btn-sm btn-outline-secondary" title="右对齐" onclick="visualJumbo.changeHAlign(this)"><i class="icon zyfont zy-ic_format_align_right"></i></a>
-                    &nbsp&nbsp&nbsp&nbsp
-                    <a id="vAlign_top" style="display: none" class="btn btn-sm btn-outline-secondary" title="上对齐" onclick="visualJumbo.changeVAlign(this)"><i class="icon zyfont zy-ic_vertical_align_top"></i></a>
-                    <a id="vAlign_center" class="btn btn-sm btn-outline-secondary active" title="垂直中对齐" onclick="visualJumbo.changeVAlign(this)"><i class="icon zyfont zy-ic_vertical_align_center"></i></a>
-                    <a id="vAlign_bottom" class="btn btn-sm btn-outline-secondary" title="下对齐" onclick="visualJumbo.changeVAlign(this)"><i class="icon zyfont zy-ic_vertical_align_bottom"></i></a>
-                    &nbsp&nbsp&nbsp&nbsp
+                    <a id="hAlign_left" class="btn btn-sm btn-outline-secondary active" title="左对齐" onclick="visualJumbo.changeHAlign(this)" style="display: none"><i class="icon zyfont zy-ic_format_align_left"></i></a>
+                    <a id="hAlign_center" class="btn btn-sm btn-outline-secondary" title="水平中对齐" onclick="visualJumbo.changeHAlign(this)" style="display: none"><i class="icon zyfont zy-ic_format_align_center"></i></a>
+                    <a id="hAlign_right" class="btn btn-sm btn-outline-secondary" title="右对齐" onclick="visualJumbo.changeHAlign(this)" style="display: none"><i class="icon zyfont zy-ic_format_align_right"></i></a>
+                    <!-- &nbsp&nbsp&nbsp&nbsp -->
+                    <a id="vAlign_top" class="btn btn-sm btn-outline-secondary" title="上对齐" onclick="visualJumbo.changeVAlign(this)" style="display: none"><i class="icon zyfont zy-ic_vertical_align_top"></i></a>
+                    <a id="vAlign_center" class="btn btn-sm btn-outline-secondary active" title="垂直中对齐" onclick="visualJumbo.changeVAlign(this)" style="display: none"><i class="icon zyfont zy-ic_vertical_align_center"></i></a>
+                    <a id="vAlign_bottom" class="btn btn-sm btn-outline-secondary" title="下对齐" onclick="visualJumbo.changeVAlign(this)" style="display: none"><i class="icon zyfont zy-ic_vertical_align_bottom"></i></a>
+                    <!-- &nbsp&nbsp&nbsp&nbsp -->
                     <a id="vis_shrink" class="btn btn-sm btn-outline-secondary" title="缩放" onclick="visualJumbo.changeShrink(this)" style="display: none"><i class="icon zyfont zy-ic_format_shapes"></i></a>
                     <a id="vis_wrap" class="btn btn-sm btn-outline-secondary" title="折行" onclick="visualJumbo.changeWrap(this)" style="display: none"><i class="icon zyfont zy-ic_wrap_text"></i></a>
-                    &nbsp&nbsp&nbsp&nbsp
-                    <a id="vis_outter_border" class="btn btn-sm btn-outline-secondary" title="外边框" onclick="visualJumbo.changeBorder(this)"><i class="icon zyfont zy-ic_border_outer"></i></a>
-                    <a id="vis_bottom_border" class="btn btn-sm btn-outline-secondary" title="下边框" onclick="visualJumbo.changeBorder(this)"><i class="icon zyfont zy-ic_border_bottom"></i></a>
-                    <a id="vis_no_border" class="btn btn-sm btn-outline-secondary" title="无边框" onclick="visualJumbo.changeBorder(this)"><i class="icon zyfont zy-ic_border_clear"></i></a>
-                    &nbsp&nbsp&nbsp&nbsp
+                    <!-- &nbsp&nbsp&nbsp&nbsp -->
+                    <a id="vis_outter_border" class="btn btn-sm btn-outline-secondary" title="外边框" onclick="visualJumbo.changeBorder(this)" style="display: none"><i class="icon zyfont zy-ic_border_outer"></i></a>
+                    <a id="vis_bottom_border" class="btn btn-sm btn-outline-secondary" title="下边框" onclick="visualJumbo.changeBorder(this)" style="display: none"><i class="icon zyfont zy-ic_border_bottom"></i></a>
+                    <a id="vis_no_border" class="btn btn-sm btn-outline-secondary" title="无边框" onclick="visualJumbo.changeBorder(this)" style="display: none"><i class="icon zyfont zy-ic_border_clear"></i></a>
+                    <!-- &nbsp&nbsp&nbsp&nbsp -->
                     <label ><input type="radio" name="visCellTypes3" id="visRdIsText" onchange="visualJumbo.changeCellType(`text`)" checked="true" disabled>文本</label>
                     <label ><input type="radio" name="visCellTypes3" id="visRdIsField" onchange="visualJumbo.changeCellType(`field`)" disabled>指标</label>
                     <label ><input type="radio" name="visCellTypes3" id="visRdIsBlank" onchange="visualJumbo.changeCellType(`blank`)" disabled>空白</label>

+ 10 - 0
web/maintain/report/js/rpt_tpl_cfg_helper.js

@@ -20,6 +20,7 @@ let rpt_tpl_cfg_helper = {
                 me.reportCfg.borderArr.push(style.ID);
                 $("#borderStyles").append("<option value='" + style.ID + "'>" + style.CfgDispName + "</option>");
                 $("#elementBorders").append("<option value='" + style.ID + "'>" + style.CfgDispName + "</option>");
+                $("#elementBordersVis").append("<option value='" + style.ID + "'>" + style.CfgDispName + "</option>");
             }
             me.reportCfg.fontArr = [];
             for (let font of me.reportCfg.fonts) {
@@ -39,6 +40,7 @@ let rpt_tpl_cfg_helper = {
                 if (control.CfgDispName) {
                     me.reportCfg.controlArr.push(control.ID);
                     $("#elementControls").append("<option value='" + control.ID + "'>" + control.CfgDispName + "</option>");
+                    $("#elementControlsVis").append("<option value='" + control.ID + "'>" + control.CfgDispName + "</option>");
                 } else {
                     me.reportCfg.controlArr.push("dummy control");
                 }
@@ -67,6 +69,14 @@ let rpt_tpl_cfg_helper = {
         va.append("<option value='" + JV.OUTPUT_ALIGN.V[0] + "'>上</option>");
         va.append("<option value='" + JV.OUTPUT_ALIGN.V[1] + "'>中</option>");
         va.append("<option value='" + JV.OUTPUT_ALIGN.V[2] + "'>下</option>");
+        let hav = $("#elementAlignmentHorizonVis");
+        hav.append("<option value='" + JV.OUTPUT_ALIGN.H[0] + "'>左</option>");
+        hav.append("<option value='" + JV.OUTPUT_ALIGN.H[1] + "'>中</option>");
+        hav.append("<option value='" + JV.OUTPUT_ALIGN.H[2] + "'>右</option>");
+        let vav = $("#elementAlignmentVerticalVis");
+        vav.append("<option value='" + JV.OUTPUT_ALIGN.V[0] + "'>上</option>");
+        vav.append("<option value='" + JV.OUTPUT_ALIGN.V[1] + "'>中</option>");
+        vav.append("<option value='" + JV.OUTPUT_ALIGN.V[2] + "'>下</option>");
     },
     checkAndSetSelectedNodeCfg: function (treeNode) {
         let me = rpt_tpl_cfg_helper;

+ 4 - 0
web/maintain/report/js/rpt_tpl_vis_common.js

@@ -543,6 +543,8 @@ let visualCommonOprObj = {
     setupTplTxtFld: function (rptTpl, tree, sheet, xPos, yPos, bandMappingObj) {
         let me = this, nodes = tree.getNodes();
         bandMappingObj.fontAttr = {};
+        bandMappingObj.borderAttr = {};
+        bandMappingObj.ctrlAttr = {};
         bandMappingObj.fieldPreSufAttr = {};
         if (rptTpl[JV.NODE_FLOW_INFO]) {
             //流水式
@@ -693,6 +695,8 @@ let visualCommonOprObj = {
                     me.changeCellType(cell, 'text', bandMap[JV.PROP_COLOR]);
                 }
                 bandMappingObj.fontAttr[idxTop + "_" + idxLeft + "_font"] = itemNode[JV.PROP_FONT];
+                bandMappingObj.borderAttr[idxTop + "_" + idxLeft + "_border"] = itemNode[JV.PROP_STYLE];
+                bandMappingObj.ctrlAttr[idxTop + "_" + idxLeft + "_ctrl"] = itemNode[JV.PROP_CONTROL];
                 me.setupCell(cell, itemNode);
                 if ((itemNode.FieldID || itemNode.ParamID) && itemNode[JV.PROP_IS_AUTO_HEIGHT]) {
                     let value = cell.value();

+ 165 - 55
web/maintain/report/js/rpt_tpl_vis_jumbo.js

@@ -109,6 +109,8 @@ let visualJumbo = {
         if (cell.backColor() !== 'White') {
             //0. 设置UI
             $(`#visElementFonts`)[0].removeAttribute("disabled");
+            $("#elementBordersVis")[0].removeAttribute("disabled");
+            $("#elementControlsVis")[0].removeAttribute("disabled");
             $(`#visRdIsText`)[0].removeAttribute("disabled");
             $(`#visRdIsField`)[0].removeAttribute("disabled");
             $(`#eleIsAutoHeightVis`)[0].removeAttribute("disabled");
@@ -117,7 +119,15 @@ let visualJumbo = {
             //1. font
             let fontAttr = me.bandMappingObj.fontAttr[row + "_" + col + "_font"];
             if (fontAttr) {
-                me.private_setup_font(fontAttr);
+                me._setupFont(fontAttr);
+            }
+            let borderAttr = me.bandMappingObj.borderAttr[row + "_" + col + "_border"];
+            if (borderAttr) {
+                me._setupBorder(borderAttr);
+            }
+            let ctrlAttr = me.bandMappingObj.ctrlAttr[row + "_" + col + "_ctrl"];
+            if (ctrlAttr) {
+                me._setupCtrl(ctrlAttr);
             }
             //2. alignment
             switch (cell.hAlign()) {
@@ -199,6 +209,8 @@ let visualJumbo = {
             }
         } else {
             $("#visElementFonts")[0].disabled = "disabled" ;
+            $("#elementBordersVis")[0].disabled = "disabled" ;
+            $("#elementControlsVis")[0].disabled = "disabled" ;
             $("#visRdIsText")[0].disabled = "disabled" ;
             $("#visRdIsField")[0].disabled = "disabled" ;
             $("#eleIsAutoHeightVis")[0].disabled = "disabled" ;
@@ -500,7 +512,7 @@ let visualJumbo = {
                 fontAttr[JV.FONT_PROPS[JV.FONT_PROP_IDX_ANGLE]] = 0;   //angle
             }
             me.bandMappingObj.fontAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_font"] = fontAttr;
-            me.private_setup_font(fontAttr);
+            me._setupFont(fontAttr);
             if (typeof fontAttr === 'string') {
                 let idx = rpt_tpl_cfg_helper.reportCfg.fontArr.indexOf(fontAttr);
                 fontAttr = rpt_tpl_cfg_helper.reportCfg.fonts[idx];
@@ -575,6 +587,119 @@ let visualJumbo = {
             sheet.resumePaint();
         }
     },
+    _setupCtrl: function (ctrlAttr) {
+        let idx = rpt_tpl_cfg_helper.reportCfg.controlArr.indexOf(ctrlAttr);
+        let ctrl = rpt_tpl_cfg_helper.reportCfg.ctrls[idx];
+        $("#elementControlsVis")[0].selectedIndex = idx;
+        $("#elementAlignmentHorizonVis").get(0).selectedIndex = JV.OUTPUT_ALIGN.H.indexOf(ctrl[JV.CONTROL_PROPS[2]]);
+        $("#elementAlignmentVerticalVis").get(0).selectedIndex = JV.OUTPUT_ALIGN.V.indexOf(ctrl[JV.CONTROL_PROPS[3]]);
+        $("#eleShrinkVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK]]);
+        $("#eleShowZeroVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHOW_ZERO]]);
+        $("#eleAutoWrapVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]]);
+        $("#eleIsShrinkFirstVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]]);
+        $("#eleCloseOutputVis").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]]);
+    },
+    _setupCellCtrlEx: function (ctrlObj) {
+        // 原:setupCellAlignment
+        let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
+        let selectedRanges = sheet.getSelections();
+        if (selectedRanges.length > 0) {
+            // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
+            sheet.suspendPaint();
+            for (let iRow = 0; iRow < selectedRanges[0].rowCount; iRow++) {
+                for (let iCol = 0; iCol < selectedRanges[0].colCount; iCol++) {
+                    let cell = sheet.getCell(selectedRanges[0].row + iRow, selectedRanges[0].col + iCol);
+                    //1. horizon alignment
+                    if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === 'center') {
+                        cell.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
+                    } else if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === 'left') {
+                        cell.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+                    } else {
+                        cell.hAlign(GC.Spread.Sheets.HorizontalAlign.right);
+                    }
+                    //2. vertical alignment
+                    if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'center') {
+                        cell.vAlign(GC.Spread.Sheets.VerticalAlign.center);
+                    } else if (ctrlObj[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+                        cell.vAlign(GC.Spread.Sheets.VerticalAlign.bottom);
+                    } else {
+                        cell.vAlign(GC.Spread.Sheets.VerticalAlign.top);
+                    }
+                }
+            }
+            sheet.resumePaint();
+        }
+    },
+    _setupBorder: function (borderAttr) {
+        let idx = rpt_tpl_cfg_helper.reportCfg.borderArr.indexOf(borderAttr);
+        let border = rpt_tpl_cfg_helper.reportCfg.styles[idx];
+        $("#elementBordersVis")[0].selectedIndex = idx;
+        for (let borderLine of border[JV.PROP_BORDER_STYLE]) {
+            switch (borderLine[JV.PROP_POSITION]) {
+                case JV.PROP_LEFT:
+                    $("#eleBorderLeftVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
+                    break;
+                case JV.PROP_RIGHT:
+                    $("#eleBorderRightVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
+                    break;
+                case JV.PROP_TOP:
+                    $("#eleBorderTopVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
+                    break;
+                case JV.PROP_BOTTOM:
+                    $("#eleBorderBottomVis").get(0).value = borderLine[JV.PROP_LINE_WEIGHT];
+                    break;
+                default:
+                    break;
+            }
+        }
+    },
+    _setupCellBorderEx: function (borderObj) {
+        let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
+        let selectedRanges = sheet.getSelections();
+        if (selectedRanges.length > 0) {
+            sheet.suspendPaint();
+            let borderLine = new GC.Spread.Sheets.LineBorder;
+            let borderEmpty = new GC.Spread.Sheets.LineBorder;
+            let borderThick = new GC.Spread.Sheets.LineBorder;
+            borderLine.color = "Black";
+            borderEmpty.color = "Black";
+            borderThick.color = "Black";
+            borderEmpty.style = GC.Spread.Sheets.LineStyle.empty;
+            borderLine.style = GC.Spread.Sheets.LineStyle.thin;
+            borderThick.style = GC.Spread.Sheets.LineStyle.thick;
+
+            let cellRange = new GC.Spread.Sheets.CellRange(sheet, selectedRanges[0].row, selectedRanges[0].col, selectedRanges[0].rowCount, selectedRanges[0].colCount);
+
+            const _setCB = function (lineThick, borderObj) {
+                if (lineThick === 0) {
+                    cellRange.setBorder(borderEmpty, borderObj);
+                } else if (lineThick === 1) {
+                    cellRange.setBorder(borderLine, borderObj);
+                } else {
+                    cellRange.setBorder(borderThick, borderObj);
+                }
+            };
+            for (let borderLine of borderObj[JV.PROP_BORDER_STYLE]) {
+                switch (borderLine[JV.PROP_POSITION]) {
+                    case JV.PROP_LEFT:
+                        _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {left: true});
+                        break;
+                    case JV.PROP_RIGHT:
+                        _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {right: true});
+                        break;
+                    case JV.PROP_TOP:
+                        _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {top: true});
+                        break;
+                    case JV.PROP_BOTTOM:
+                        _setCB(parseInt(borderLine[JV.PROP_LINE_WEIGHT]), {bottom: true});
+                        break;
+                    default:
+                        break;
+                }
+            }
+            sheet.resumePaint();
+        }
+    },
     setupCellBorder: function () {
         let me = visualJumbo, sheet = me.tplWorkBook.getActiveSheet();
         let selectedRanges = sheet.getSelections();
@@ -617,7 +742,7 @@ let visualJumbo = {
         }
         cell.font(fontStr);
     },
-    private_setup_font: function(fontAttr) {
+    _setupFont: function(fontAttr) {
         if (typeof fontAttr === "string" && fontAttr !== "自定义") {
             $("#visElementFontNames")[0].disabled = "disabled" ;
             $("#visEleFontSize")[0].disabled = "disabled" ;
@@ -702,6 +827,37 @@ let visualJumbo = {
             dom.className = "btn btn-sm btn-outline-secondary";
         }
     },
+    changeBorderEx: function (dom) {
+        let me = visualJumbo, borderAttr = dom.value,
+            sheet = me.tplWorkBook.getActiveSheet();
+        let selectedRanges = sheet.getSelections();
+        if (selectedRanges.length > 0) {
+            // let cell = sheet.getCell(selectedRanges[0].row, selectedRanges[0].col);
+            me.bandMappingObj.borderAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_border"] = borderAttr;
+            me._setupBorder(borderAttr);
+            // 然后要设置相关Cell的边框
+            if (typeof borderAttr === 'string') {
+                let idx = rpt_tpl_cfg_helper.reportCfg.borderArr.indexOf(borderAttr);
+                borderAttr = rpt_tpl_cfg_helper.reportCfg.styles[idx];
+            }
+            me._setupCellBorderEx(borderAttr);
+        }
+    },
+    changeControlEx: function (dom) {
+        let me = visualJumbo, ctrlAttr = dom.value,
+            sheet = me.tplWorkBook.getActiveSheet();
+        let selectedRanges = sheet.getSelections();
+        if (selectedRanges.length > 0) {
+            me.bandMappingObj.ctrlAttr[selectedRanges[0].row + "_" + selectedRanges[0].col + "_ctrl"] = ctrlAttr;
+            me._setupCtrl(ctrlAttr);
+            // 然后要设置相关Cell的上下左右控制(就是原setupCellAlignment)
+            if (typeof ctrlAttr === 'string') {
+                let idx = rpt_tpl_cfg_helper.reportCfg.controlArr.indexOf(ctrlAttr);
+                ctrlAttr = rpt_tpl_cfg_helper.reportCfg.ctrls[idx];
+            }
+            me._setupCellCtrlEx(ctrlAttr);
+        }
+    },
     changeHAlign: function (dom) {
         let me = this;
         if (dom.className === "btn btn-sm btn-outline-secondary") {
@@ -1284,62 +1440,16 @@ let visualJumbo = {
         return rst;
     },
     private_getBorderByCellProperties: function (cell) {
-        let rst = 'Default_None';
-        let border = cell.borderLeft();
-        if (border && border.style === GC.Spread.Sheets.LineStyle.thin) {
-            rst = 'Default_Normal'
-        } else {
-            border = cell.borderBottom();
-            if (border && border.style === GC.Spread.Sheets.LineStyle.thin) {
-                rst = 'Label_Underline'
-            }
+        let me = this, rst = 'Default_None';
+        if (me.bandMappingObj.borderAttr[cell.row + "_" + cell.col + "_border"]) {
+            rst = me.bandMappingObj.borderAttr[cell.row + "_" + cell.col + "_border"];
         }
         return rst;
     },
     private_getCtrlByCellProperties: function (cell) {
-        let rst = 'Default';
-        let border = cell.borderLeft();
-        if (cell.vAlign() === GC.Spread.Sheets.VerticalAlign.center) {
-            if (border && border.style === GC.Spread.Sheets.LineStyle.thin) {
-                switch (cell.hAlign()) {
-                    case GC.Spread.Sheets.HorizontalAlign.center:
-                        rst = `Column`;
-                        break;
-                    case GC.Spread.Sheets.HorizontalAlign.right:
-                        rst = `Column_Right`;
-                        break;
-                    case GC.Spread.Sheets.HorizontalAlign.left:
-                    default:
-                        rst = `Column_Left`;
-                        break;
-                }
-            } else {
-                switch (cell.hAlign()) {
-                    case GC.Spread.Sheets.HorizontalAlign.center:
-                        rst = `Title`;
-                        break;
-                    case GC.Spread.Sheets.HorizontalAlign.right:
-                        rst = `Header_Right`;
-                        break;
-                    case GC.Spread.Sheets.HorizontalAlign.left:
-                    default:
-                        rst = `Header`;
-                        break;
-                }
-            }
-        } else {
-            switch (cell.hAlign()) {
-                case GC.Spread.Sheets.HorizontalAlign.center:
-                    rst = `Content_Center`;
-                    break;
-                case GC.Spread.Sheets.HorizontalAlign.right:
-                    rst = `Content_Right`;
-                    break;
-                case GC.Spread.Sheets.HorizontalAlign.left:
-                default:
-                    rst = `Content_Left`;
-                    break;
-            }
+        let me = this, rst = 'Default';
+        if (me.bandMappingObj.ctrlAttr[cell.row + "_" + cell.col + "_ctrl"]) {
+            rst = me.bandMappingObj.ctrlAttr[cell.row + "_" + cell.col + "_ctrl"];
         }
         return rst;
     }