Browse Source

自动行高-居中显示

TonyKang 6 years ago
parent
commit
a84e0a6d75

+ 86 - 13
modules/reports/rpt_component/jpc_flow_tab.js

@@ -341,14 +341,17 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             doc.fontSize(12);
                         }
                         let hasSplitStr = false, splitStrArr = [];
+                        let accAmt = 0;
                         for (let i = 0; i < values.length; i++) {
-                            let amt = JpcCommonHelper.getStringLinesInArea(area, values[i], doc) - 1;
-                            rst += amt;
-                            if (amt > 0) {
+                            let amt = JpcCommonHelper.getStringLinesInArea(area, values[i], doc);
+                            accAmt += amt;
+                            // rst += amt;
+                            if (amt > 1) {
                                 hasSplitStr = true;
                                 splitStrArr.push(i);
                             }
                         }
+                        if (accAmt > rst) rst = accAmt;
                         if (hasSplitStr) {
                             let newValArr = [];
                             for (let i = 0; i < values.length; i++) {
@@ -998,11 +1001,13 @@ JpcFlowTabSrv.prototype.createNew = function(){
             }
             let rst = JpcCommonOutputHelper.createCommonOutput(tab_field, showText, controls);
             rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx, true, false);
+            rst[JV.PROP_IS_AUTO_HEIGHT] = true;
             return rst;
         } else {
             if (contentValInfo[3] > 0) showText = '';
             let rst = JpcCommonOutputHelper.createCommonOutput(tab_field, showText, controls);
             rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx, true, false);
+            rst[JV.PROP_IS_AUTO_HEIGHT] = false;
             return rst;
         }
     };
@@ -1077,17 +1082,24 @@ function setupControl(mergeCell, controls) {
             "Shrink": "T",
             "ShowZero": orgCtrl.ShowZero,
             "Horizon": orgCtrl.Horizon,
-            "Vertical": "top",
+            "Vertical": orgCtrl.Vertical,
             "Wrap": "T",
-            "VerticalForExcel": "justify"
+            "VerticalForExcel": "center"
         };
     } else {
         mergeCell[JV.PROP_CONTROL].Shrink = "T";
         mergeCell[JV.PROP_CONTROL].Vertical = "top";
         mergeCell[JV.PROP_CONTROL].Wrap = "T";
-        mergeCell[JV.PROP_CONTROL].VerticalForExcel = "justify";
+        mergeCell[JV.PROP_CONTROL].VerticalForExcel = "center";
         orgCtrl = mergeCell[JV.PROP_CONTROL];
     }
+    if (mergeCell[JV.PROP_IS_AUTO_HEIGHT]) {
+        mergeCell[JV.PROP_CONTROL]["VerticalForExcel"] = 'justify';
+        // mergeCell[JV.PROP_CONTROL]["Vertical"] = 'center';
+    } else {
+        mergeCell[JV.PROP_CONTROL]["VerticalForExcel"] = 'center';
+        // mergeCell[JV.PROP_CONTROL]["Vertical"] = 'top';
+    }
     return orgCtrl;
 }
 
@@ -1097,31 +1109,92 @@ function combineAutoHeightCells(prepareObj, page, controls) {
         //merge cells' value and area
         //备注: 系统逻辑已经把Cell的顺序放好,无需再做排序。
         for (let mergeKey in prepareObj.pageCellObj) {
-            if (prepareObj.pageCellObj[mergeKey].length > 1) {
-                let firstMergeCell = prepareObj.pageCellObj[mergeKey][0].cell;
+            let sameColCells = prepareObj.pageCellObj[mergeKey]; //左右位置相同的Cell先放在一起,统一处理
+            if (sameColCells.length > 1) {
+                let firstMergeCell = sameColCells[0].cell;
+                firstMergeCell[JV.PROP_STYLE] = firstMergeCell[JV.PROP_STYLE].slice(0, firstMergeCell[JV.PROP_STYLE].indexOf("_AutoHeightMerge")); //首先还原original style
+                let orgCtrl = setupControl(firstMergeCell, controls);
+                let validValueAmt = 0, fullValidValueAmt = 0;
+                for (let i = 1; i < sameColCells.length; i++) {
+                    let mergeCell = sameColCells[i].cell;
+                    if (mergeCell[JV.PROP_STYLE].indexOf("_AutoHeightMerge_Top") < 0) {
+                        fullValidValueAmt++;
+                        //merge into the firstMergeCell! position & value
+                        firstMergeCell[JV.PROP_AREA][JV.PROP_BOTTOM] = mergeCell[JV.PROP_AREA][JV.PROP_BOTTOM];
+                        if (mergeCell[JV.PROP_VALUE]) {
+                            firstMergeCell[JV.PROP_VALUE] = firstMergeCell[JV.PROP_VALUE] + "|" + mergeCell[JV.PROP_VALUE];
+                            validValueAmt++;
+                        } else {
+                            // firstMergeCell[JV.PROP_VALUE] = firstMergeCell[JV.PROP_VALUE] + "|" ;
+                        }
+                        rst.push(sameColCells[i].cellIdx); //记下Cell的位置,在函数外消除
+                        //如果到了最后一条数据,得判断firstMergeCell是否满格(即数据是满的,有可能有些格数据也有折行但不是自动行高判断指标)
+                        //不满格的cell的Vertical强制设置为 'center'
+                        if (i === sameColCells.length - 1 && validValueAmt !== fullValidValueAmt) {
+                            // firstMergeCell[JV.PROP_CONTROL].Shrink = orgCtrl.Shrink;
+                            // firstMergeCell[JV.PROP_CONTROL].Wrap = "F";
+                            // firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = null;
+                            firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = 'center';
+                        }
+                    } else {
+                        //碰到新开始的自动行高行,判断原先的firstMergeCell是否满格(即数据是满的,有可能有些格数据也有折行但不是自动行高判断指标)
+                        //不满格的cell的Vertical强制设置为 'center'
+                        if (validValueAmt !== fullValidValueAmt) {
+                            // firstMergeCell[JV.PROP_CONTROL].Shrink = orgCtrl.Shrink;
+                            // firstMergeCell[JV.PROP_CONTROL].Wrap = "F";
+                            // firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = null;
+                            firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = 'center';
+                        }
+                        firstMergeCell = sameColCells[i].cell;
+                        firstMergeCell[JV.PROP_STYLE] = firstMergeCell[JV.PROP_STYLE].slice(0, firstMergeCell[JV.PROP_STYLE].indexOf("_AutoHeightMerge"));
+                        orgCtrl = setupControl(firstMergeCell, controls);
+                        validValueAmt = 0;
+                        fullValidValueAmt = 0;
+                    }
+                }
+            }
+        }
+        rst.sort(function (i1, i2) {
+            return (i1 > i2)?1:-1;
+        });
+    }
+    return rst;
+}
+
+function combineAutoHeightCellsBk(prepareObj, page, controls) {
+    let rst = [];
+    if (prepareObj.cellsArr) {
+        //merge cells' value and area
+        //备注: 系统逻辑已经把Cell的顺序放好,无需再做排序。
+        for (let mergeKey in prepareObj.pageCellObj) {
+            let sameColCells = prepareObj.pageCellObj[mergeKey]; //左右位置相同的Cell先放在一起,统一处理
+            if (sameColCells.length > 1) {
+                let firstMergeCell = sameColCells[0].cell;
                 firstMergeCell[JV.PROP_STYLE] = firstMergeCell[JV.PROP_STYLE].slice(0, firstMergeCell[JV.PROP_STYLE].indexOf("_AutoHeightMerge"));
                 let orgCtrl = setupControl(firstMergeCell, controls);
                 let validValueAmt = 0;
-                for (let i = 1; i < prepareObj.pageCellObj[mergeKey].length; i++) {
-                    let mergeCell = prepareObj.pageCellObj[mergeKey][i].cell;
+                for (let i = 1; i < sameColCells.length; i++) {
+                    let mergeCell = sameColCells[i].cell;
                     if (mergeCell[JV.PROP_STYLE].indexOf("_AutoHeightMerge_Top") < 0) {
                         //merge into the firstMergeCell!
                         firstMergeCell[JV.PROP_AREA][JV.PROP_BOTTOM] = mergeCell[JV.PROP_AREA][JV.PROP_BOTTOM];
                         firstMergeCell[JV.PROP_VALUE] = firstMergeCell[JV.PROP_VALUE] + "|" + mergeCell[JV.PROP_VALUE];
                         if (mergeCell[JV.PROP_VALUE]) validValueAmt++;
-                        rst.push(prepareObj.pageCellObj[mergeKey][i].cellIdx);
-                        if (i === prepareObj.pageCellObj[mergeKey].length - 1 && validValueAmt === 0) {
+                        rst.push(sameColCells[i].cellIdx);
+                        if (i === sameColCells.length - 1 && validValueAmt === 0) {
                             firstMergeCell[JV.PROP_CONTROL].Shrink = orgCtrl.Shrink;
                             firstMergeCell[JV.PROP_CONTROL].Wrap = "F";
                             firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = null;
+                            // firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = 'center';
                         }
                     } else {
                         if (validValueAmt === 0) {
                             firstMergeCell[JV.PROP_CONTROL].Shrink = orgCtrl.Shrink;
                             firstMergeCell[JV.PROP_CONTROL].Wrap = "F";
                             firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = null;
+                            // firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = 'center';
                         }
-                        firstMergeCell = prepareObj.pageCellObj[mergeKey][i].cell;
+                        firstMergeCell = sameColCells[i].cell;
                         firstMergeCell[JV.PROP_STYLE] = firstMergeCell[JV.PROP_STYLE].slice(0, firstMergeCell[JV.PROP_STYLE].indexOf("_AutoHeightMerge"));
                         orgCtrl = setupControl(firstMergeCell, controls);
                         validValueAmt = 0;

+ 1 - 1
modules/reports/util/rpt_pdf_util.js

@@ -231,7 +231,7 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
             doc.rotate(font.FontAngle,rotateOptions);
         }
         doc.text(val,output[0], output[1], options);
-        doc.font(__dirname + '/pdf_base_files/Smart.ttf');
+        doc.font(__dirname + '/pdf_base_files/simhei_bold_italic.ttf');
         // doc.restore();
     }
 

+ 5 - 4
test/unit/reports/test_rpt_test_template.js

@@ -32,7 +32,8 @@ let demoPrjId = - 1;
 // let demoRptId = 361; //封1
 // let demoRptId = 279; //表04
 // let demoRptId = 261; //封3
-let demoRptId = 401; //09
+// let demoRptId = 401; //09
+let demoRptId = 389; //10
 // let demoRptId = 280; //11-1 暂列金
 // let demoRptId = 2260; //测试基本信息
 let pagesize = "A4";
@@ -78,8 +79,8 @@ test('测试 - 测试模板啦: ', function (t) {
                 try {
                     // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject_测试模板.jsp");
                     let tplData = rptDataUtil.assembleData(rawDataObj);
-                    fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataAfterCacl_测试模板.jsp");
-                    fsUtil.writeObjToFile(tplData, "D:/GitHome/ConstructionCost/tmp/rptTplAssembledData_测试模板.jsp");
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataAfterCacl_测试模板.jsp");
+                    // fsUtil.writeObjToFile(tplData, "D:/GitHome/ConstructionCost/tmp/rptTplAssembledData_测试模板.jsp");
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();
                     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;
@@ -90,7 +91,7 @@ test('测试 - 测试模板啦: ', function (t) {
                     let maxPages = printCom.totalPages;
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     if (pageRst) {
-                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
                         // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
                         //     console.log("excel uuid: " + uuidName);
                         // });

+ 1 - 1
web/building_saas/report/html/rpt_content_format.html

@@ -18,7 +18,7 @@
                             </label>
                         </div>
                     </div>
-                    <div class="col-4">
+                    <div class="col-4" style="display: none">
                         <div class="form-check">
                             <label class="form-check-label">
                                 <input id="rpt_narrow" type="checkbox" class="form-check-input" onchange="rptControlObj.changeCfgOption('isNarrow', this)">

+ 1 - 13
web/building_saas/report/js/rpt_main.js

@@ -150,6 +150,7 @@ let zTreeOprObj = {
         }
         document.getElementById("rpt_vertical_line").checked = cfg.showVerticalLine;
         document.getElementById("rpt_narrow").checked = cfg.isNarrow;
+        // document.getElementById("rpt_narrow").checked = false;
         document.getElementById("rpt_fill_zero").checked = cfg.fillZero;
     },
     extractRptCfg: function (cfg) {
@@ -445,19 +446,6 @@ let rptControlObj = {
         }
     },
     getPDF: function() {
-        // let me = rptControlObj;
-        // if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
-        //     let urls = [];
-        //     let orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
-        //     for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
-        //         let orgRptName = tplNode.name;
-        //         let url =  "/report_api/getPDF/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
-        //             me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName
-        //             // + "/" + encodeURI(JSON.stringify(zTreeOprObj.reportPageCfg));
-        //         urls.push(url);
-        //     }
-        //     downloadReport(urls);
-        // }
         let me = rptControlObj;
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             let rpt_ids = [], rpt_names = [];