Преглед на файлове

Bug 1775 excel导出换行符处理

TonyKang преди 6 години
родител
ревизия
cf17a664cf

+ 13 - 13
modules/reports/controllers/rpt_controller.js

@@ -57,7 +57,7 @@ function getAllPagesCommonOrg(rpt_id, pageSize, option, cb) {
                 let defProperties = rptUtil.getReportDefaultCache();
                 let dftOption = option||JV.PAGING_OPTION_NORMAL;
                 printCom.initialize(rptTpl);
-                printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
+                printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, JV.OUTPUT_TYPE_NORMAL);
                 let maxPages = printCom.totalPages;
                 let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                 if (pageRst) {
@@ -223,7 +223,7 @@ function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) {
         }
     }
 }
-function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, option, cb) {
+function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
     let rptTpl = null;
     rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
         rptTpl = rst;
@@ -253,7 +253,7 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, custo
                         if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
                         let dftOption = option||JV.PAGING_OPTION_NORMAL;
                         printCom.initialize(rptTpl);
-                        printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
+                        printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType);
                         let maxPages = printCom.totalPages;
                         let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
                         if (pageRst) {
@@ -298,7 +298,7 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, custo
                     if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
                     let dftOption = option||JV.PAGING_OPTION_NORMAL;
                     printCom.initialize(rptTpl);
-                    printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
+                    printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType);
                     let maxPages = printCom.totalPages;
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
                     if (pageRst) {
@@ -330,7 +330,7 @@ module.exports = {
         ;
         // req.session.sessionUser.ssoId
         let user_id = req.session.sessionUser.id;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, null, function (err, pageRst) {
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_NORMAL, function (err, pageRst) {
             callback(req, res, err, pageRst);
         });
     },
@@ -348,7 +348,7 @@ module.exports = {
         for (let id of rpt_ids) {
             parallelFunctions.push((function (rpt_id) {
                 return function (cb) {
-                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_NORMAL, function (err, pageRst) {
                         if(err){
                             cb(err);
                         }
@@ -377,7 +377,7 @@ module.exports = {
             customizeCfg = params.custCfg
         ;
         let user_id = req.session.sessionUser.id;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, null, function (err, pageRst) {
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_SVG, function (err, pageRst) {
             let svgRstStrArr = rpt_svg_util.exportSvgStr(pageRst, 0, 0);
             callback(req, res, err, svgRstStrArr);
         });
@@ -399,7 +399,7 @@ module.exports = {
             let r_id = rpt_ids[idx];
             parallelFunctions.push((function (rpt_id) {
                 return function (cb) {
-                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_EXCEL, function (err, pageRst) {
                         if(err){
                             cb(err);
                         }
@@ -440,7 +440,7 @@ module.exports = {
             let r_name = rpt_names[idx];
             parallelFunctions.push((function (rpt_id, rpt_name) {
                 return function (cb) {
-                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_EXCEL, function (err, pageRst) {
                         if(err){
                             cb(err);
                         } else {
@@ -495,7 +495,7 @@ module.exports = {
         let customizeCfg = null;
         let user_id = req.session.sessionUser.id;
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function(err, pageRst){
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_EXCEL, function(err, pageRst){
             try {
                 rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(uuidName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
@@ -526,7 +526,7 @@ module.exports = {
         for (let id of rpt_ids) {
             parallelFunctions.push((function (rpt_id) {
                 return function (cb) {
-                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, null, null, dftOption, function (err, pageRst) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, null, null, dftOption, JV.OUTPUT_TYPE_EXCEL, function (err, pageRst) {
                         if(err){
                             cb(err);
                         }
@@ -573,7 +573,7 @@ module.exports = {
             let r_name = rpt_names[idx];
             parallelFunctions.push((function (rpt_id, rpt_name) {
                 return function (cb) {
-                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_PDF, function (err, pageRst) {
                         if(err){
                             cb(err);
                         }
@@ -604,7 +604,7 @@ module.exports = {
             rptName = req.params.rptName
         ;
         let user_id = req.session.sessionUser.id;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, JV.PAGING_OPTION_NORMAL, JV.OUTPUT_TYPE_PDF, function(err, pageRst){
             rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (uuidName) {
                 res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                 // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");

+ 6 - 6
modules/reports/rpt_component/jpc_ex.js

@@ -164,7 +164,7 @@ JpcExSrv.prototype.createNew = function(){
         me.formulas = JpcFunc.createNew(rptTpl);
     };
 
-    JpcResult.analyzeData = function(rptTpl, dataObj, defProperties, option) {
+    JpcResult.analyzeData = function(rptTpl, dataObj, defProperties, option, outputType) {
         let me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
         //1. data object
         let dataHelper = JpcData.createNew();
@@ -189,20 +189,20 @@ JpcExSrv.prototype.createNew = function(){
         //3. formulas
         me.executeFormulas(JV.RUN_TYPE_BEFORE_PAGING, rptTpl, dataObj, me);
         //4. paging
-        me.paging(rptTpl, dataObj, defProperties, dftPagingOption);
+        me.paging(rptTpl, dataObj, defProperties, dftPagingOption, outputType);
         //alert('analyzeData was completed!');
         //for garbage collection:
         dataHelper = null;
     };
-    JpcResult.paging = function(rptTpl, dataObj, defProperties, option) {
+    JpcResult.paging = function(rptTpl, dataObj, defProperties, option, outputType) {
         let me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
         if (me.flowTab) {
             if (me.isFollowMode) {
-                me.totalPages = me.flowTab.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption, me, me.flowTabEx);
+                me.totalPages = me.flowTab.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption, me, me.flowTabEx, outputType);
             } else {
-                me.totalPages = me.flowTab.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption, me, null);
+                me.totalPages = me.flowTab.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption, me, null, outputType);
                 if (me.flowTabEx) {
-                    me.exTotalPages = me.flowTabEx.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption, me, null);
+                    me.exTotalPages = me.flowTabEx.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption, me, null, outputType);
                     //console.log('ad-hoc flow pages: ' + me.exTotalPages);
                 }
                 me.totalPages += me.exTotalPages;

+ 7 - 6
modules/reports/rpt_component/jpc_flow_tab.js

@@ -346,7 +346,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             }
         }
     };
-    JpcFlowTabResult.setupAutoHeightData = function(bands, segIdx, rptTpl, dataObj, $CURRENT_RPT, defProperties) {
+    JpcFlowTabResult.setupAutoHeightData = function(bands, segIdx, rptTpl, dataObj, $CURRENT_RPT, defProperties, outputType) {
         let me = this;
         if (me.auto_height_fields_idx.length > 0) {
             let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
@@ -415,7 +415,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             }
                         }
                         if (accAmt > rst) rst = accAmt;
-                        if (hasSplitStr) {
+                        if (hasSplitStr && outputType !== JV.OUTPUT_TYPE_EXCEL) {
                             let newValArr = [];
                             for (let i = 0; i < values.length; i++) {
                                 if (splitStrArr.indexOf(i) < 0) {
@@ -428,6 +428,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             splitStrArr = [];
                             newValArr = [];
                         }
+                        //备注: 如果outputType是excel类型,那么就只保留原始的分行符,无需介入分行,由excel本身去处理分行,只需要保留足够的空间即可。
                     }
                 }
                 return rst;
@@ -460,7 +461,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         }
     };
 
-    JpcFlowTabResult.preSetupPages = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx) {
+    JpcFlowTabResult.preSetupPages = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx, outputType) {
         //换一种思路来整理流水式数据
         let me = this, rst = 1, counterRowRec = 0, counterRowRecEx = 0, maxRowRec = 1, pageIdx = 0, currentRecAmt = 0;
         me.paging_option = option||JV.PAGING_OPTION_NORMAL;
@@ -576,7 +577,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 grpPageInfo[JV.PROP_GRP_LINES] = me.group_lines_amt;
                 pageStatus[JV.STATUS_SEGMENT_START] = true;
                 private_resetBandArea();
-                me.setupAutoHeightData(bands, segIdx, rptTpl, dataObj, $CURRENT_RPT, defProperties);
+                me.setupAutoHeightData(bands, segIdx, rptTpl, dataObj, $CURRENT_RPT, defProperties, outputType);
                 let threshold = 0;
                 currentRecAmt = 0;
                 counterRowRec = 0;
@@ -1257,13 +1258,13 @@ function combineAutoHeightCells(prepareObj, page, controls) {
                         rst.push(sameColCells[i].cellIdx); //记下Cell的位置,在函数外消除
                         //如果到了最后一条数据,得判断firstMergeCell是否满格(即数据是满的,有可能有些格数据也有折行但不是自动行高判断指标)
                         //不满格的cell的Vertical强制设置为 'center'
-                        if (i === sameColCells.length - 1 && validValueAmt !== fullValidValueAmt) {
+                        if (i === sameColCells.length - 1 && validValueAmt !== fullValidValueAmt && (fullValidValueAmt / validValueAmt > 2.5) ) {
                             firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = 'center';
                         }
                     } else {
                         //碰到新开始的自动行高行,判断原先的firstMergeCell是否满格(即数据是满的,有可能有些格数据也有折行但不是自动行高判断指标)
                         //不满格的cell的Vertical强制设置为 'center'
-                        if (validValueAmt !== fullValidValueAmt) {
+                        if (validValueAmt !== fullValidValueAmt && (fullValidValueAmt / validValueAmt > 2.5)) {
                             firstMergeCell[JV.PROP_CONTROL].VerticalForExcel = 'center';
                         }
                         firstMergeCell = sameColCells[i].cell;

+ 5 - 0
public/web/rpt_value_define.js

@@ -278,6 +278,11 @@ const JV = {
     PAGING_OPTION_NORMAL: 'normal',
     PAGING_OPTION_INFINITY: 'infinity',
 
+    OUTPUT_TYPE_NORMAL: 'normal',
+    OUTPUT_TYPE_SVG: 'svg',
+    OUTPUT_TYPE_PDF: 'pdf',
+    OUTPUT_TYPE_EXCEL: 'excel',
+
     DISPLAY_VAL_TYPE_NORMAL: 0,
     DISPLAY_VAL_TYPE_GROUP: 1,
     DISPLAY_VAL_TYPE_AUTO_HEIGHT: 2,

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

@@ -32,7 +32,7 @@ let demoPrjId = - 1;
 // let demoRptId = 361; //封1
 // let demoRptId = 279; //表04
 // let demoRptId = 261; //封3
-// let demoRptId = 458; //09
+let demoRptId = 458; //09
 // let demoRptId = 451; //09-1
 // let demoRptId = 452; //04
 // let demoRptId = 612; //09-3
@@ -41,18 +41,19 @@ let demoPrjId = - 1;
 // let demoRptId = 389; //10
 // let demoRptId = 280; //11-1 暂列金
 // let demoRptId = 2260; //测试基本信息
-let demoRptId = 613; //09-4 2018
+// let demoRptId = 613; //09-4 2018
 let pagesize = "A4";
 //288: 11-2表(新)
 //279: 04
 
 // let userId_Leng = "59cdf14a0034a1000ba52b97"; //小冷User Id 换成_id了 QQ号
 // let userId_Leng = "5acac1e885bf55000bd055ba"; //小冷User Id2
+// let userId_me = "5b6a60b1c4ba33000dd417c0"; //我的
 let userId_HaiZhu = "5b5a66c4a3c23e000dccdd77"; //海珠user id
 // demoPrjId = 720; //QA: DW3
 //demoPrjId = 1626; //QA:
 // demoPrjId = 2260; //QA:
-demoPrjId = 4529; //QA:
+demoPrjId = 4568; //QA:
 //*/
 let userId_Dft = userId_HaiZhu;
 // let userId_Dft = "5a025c4c15074d134c2b9689";
@@ -93,12 +94,12 @@ test('测试 - 测试模板啦: ', function (t) {
                     let defProperties = rpt_cfg;
                     let dftOption = JV.PAGING_OPTION_NORMAL;
                     printCom.initialize(rptTpl);
-                    printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
+                    printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, JV.OUTPUT_TYPE_EXCEL);
                     let maxPages = printCom.totalPages;
                     let customizeCfg = {"fillZero": true};
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
                     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);
                         // });