Przeglądaj źródła

auto height for code sync

TonyKang 7 lat temu
rodzic
commit
74fb2e6d53

+ 4 - 1
modules/reports/rpt_component/helper/jpc_helper_field.js

@@ -49,7 +49,10 @@ let JpcFieldHelper = {
                 if (tab_fields[i][JV.PROP_IS_AUTO_HEIGHT]) {
                     for (let j = 0; j < detail_fields.length; j++) {
                         if (tab_fields[i]["FieldID"] === detail_fields[j]["ID"]) {
-                            rstFieldsIdx.push(j);
+                            let item = [];
+                            item[0] = j;
+                            item[1] = tab_fields[i];
+                            rstFieldsIdx.push(item);
                             break;
                         }
                     }

+ 41 - 5
modules/reports/rpt_component/jpc_flow_tab.js

@@ -89,6 +89,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.page_sum_tab_fields = [];
 
         me.auto_height_fields_idx = [];//那些被标记为判断自动行高的指标集合
+        me.auto_height_info = [];
         me.group_fields = [];
         me.group_sum_fields = [];
         me.group_sum_values = null;
@@ -212,13 +213,48 @@ JpcFlowTabSrv.prototype.createNew = function(){
             }
         }
     };
-    JpcFlowTabResult.setupAutoHeightData = function(rptTpl, dataObj, $CURRENT_RPT) {
-        //自动行高功能,需要考虑以下情况:
-        //1. 每一Segment的需要增加行的数量
-        //2. 边界条件(跨页处理)
+    JpcFlowTabResult.setupAutoHeightData = function(bands, segIdx, rptTpl, dataObj, $CURRENT_RPT) {
         let me = this;
         let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
-        //rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length;
+        let band = bands[rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.BAND_PROP_NAME]];
+        let data_details = me.isEx?dataObj[JV.DATA_DETAIL_DATA_EX]:dataObj[JV.DATA_DETAIL_DATA];
+        let reg1 = new RegExp('\n\r','g'), reg2 = new RegExp('\r\n','g'),
+            reg3 = new RegExp('\n','g'), reg4 = new RegExp('\r','g');
+        let doc = new PDFKit({autoFirstPage: false});
+        let private_get_max_lines_of_the_record = function(theRecIdx) {
+            let rst = 1;
+            for (let loop = 0; loop < me.auto_height_fields_idx.length; loop++) {
+                let data_field = null;
+                let tab_field = me.auto_height_fields_idx[loop][1];
+                if (me.auto_height_fields_idx[loop][0] !== JV.BLANK_FIELD_INDEX) {
+                    data_field = data_details[me.auto_height_fields_idx[loop][0]];
+                }
+                if (data_field) {
+                    let value = JpcFieldHelper.getValue(data_field, theRecIdx);
+                    let area = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, 1, 1, 0, 1, 0, 1, 0, false, false);
+                    if (value !== null && value !== undefined) {
+                        value = value.replace(reg1, '|').replace(reg2, '|').replace(reg3, '|').replace(reg4, '|');
+                    } else {
+                        value = '';
+                    }
+                    let values = value.split('|');
+                    if (values.length > rst) rst = values.length;
+                }
+            }
+            return rst;
+        };
+        if (me.auto_height_fields_idx.length > 0 && me.auto_height_info.length === segIdx) {
+            //自动行高功能,需要考虑以下情况:
+            //1. 每一Segment的需要增加行的数量
+            me.auto_height_info.push([]);
+            //rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(textNode[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, multiCols, multiColIdx, false, false);
+            let segArr = me.segments[segIdx];
+            for (let i = 0; i < segArr.length; i++) {
+                //
+            }
+            //2.
+            //rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length;
+        }
     };
 
     JpcFlowTabResult.preSetupPages = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx) {

+ 16 - 64
modules/reports/util/rpt_excel_util.js

@@ -339,7 +339,6 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
 }
 function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
     let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
-    let cacheBorderCell = {};
     let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
     let private_pre_analyze_pos = function(){
         let cell, pos;
@@ -380,11 +379,16 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             yPos.sort(private_array_sort);
         } else {
             //total data in one sheet
+            let marginBottomPos = Math.round( (pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1] - parseFloat(pageData[JV.NODE_PAGE_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]) / 2.54 ) * DPI);
             for (let shtItemData of pageData.items) {
                 let tmpPos = [];
                 tmpPos.push(0);
                 self_analyze_sheet_pos(shtItemData, xPos, tmpPos);
                 tmpPos.sort(private_array_sort);
+                if (marginBottomPos - tmpPos[tmpPos.length - 1] > 10) {
+                    //此逻辑是为了防止打印跨页(假设有些报表模板高度设置离底部margin还好远,导出excel后预览时会发现跨页现象(即下一页的某几行数据会挪到前一页来预览))
+                    tmpPos.push(marginBottomPos - 10);
+                }
                 yMultiPos.push(tmpPos);
             }
             xPos.sort(private_array_sort);
@@ -627,20 +631,12 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         //remark: 1 excel unit width = 2.117 mm
         rst.push('<cols>');
         let w = 0;
-        /*
-        for (let i = 1; i < xPos.length - 1; i++) {
-            w = 1.0 * (xPos[i + 1] - xPos[i]) / DPI * 25.4 / 2.117;
-            w = Math.round(w * 1000) / 1000;
-            rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
-        }
-        /*/
         for (let i = 1; i < xPos.length - 1; i++) {
             w = 1.0 * (xPos[i + 1] - xPos[i]) / DPI * 25.4 / 2.117;
             w = Math.round(w * 1000) / 1000;
             rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
         }
         rst.push('<col min="' + (xPos.length - 1) +'" max="' + (xPos.length - 1) +'" width="' + 10 + '" customWidth="1"/>');
-        //*/
         rst.push('</cols>');
     };
     let private_setMergedCells = function() {
@@ -674,58 +670,11 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         rst[startIdx] = '<mergeCells count="' + cnt + '">';
         rst.push('</mergeCells>');
     };
-    let private_chkIfNeedCacheCell = function(cell){
-        let rst = false;
-        if (cell[JV.PROP_AREA][JV.PROP_LEFT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT] ||
-            cell[JV.PROP_AREA][JV.PROP_RIGHT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT] ||
-            cell[JV.PROP_AREA][JV.PROP_TOP] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] ||
-            cell[JV.PROP_AREA][JV.PROP_BOTTOM] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM]){
-            if (cell[JV.PROP_AREA][JV.PROP_LEFT] >= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT] &&
-                cell[JV.PROP_AREA][JV.PROP_RIGHT] <= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT] &&
-                cell[JV.PROP_AREA][JV.PROP_TOP] >= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] &&
-                cell[JV.PROP_AREA][JV.PROP_BOTTOM] <= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM]) {
-                rst = true;
-            }
-        }
-        return rst;
-    };
-    let private_cacheMergeBandBorderIdxs = function() {
-        let cell, idxR, idxL, idxT, idxB;
-        let self_cachMergeIdxs = function (theData, theYPos, offsetY) {
-            for (let i = 0; i < theData.cells.length; i++) {
-                cell = theData.cells[i];
-                idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
-                idxL = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_LEFT]);
-                idxB = theYPos.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
-                idxT = theYPos.indexOf(cell[JV.PROP_AREA][JV.PROP_TOP]);
-                if (idxR - idxL > 1 || idxB - idxT > 1) {
-                    if (private_chkIfNeedCacheCell(cell)) {
-                        for (let xi = idxL; xi < idxR; xi++) {
-                            for (let yj = idxT; yj < idxB; yj++) {
-                                cacheBorderCell[private_getCellIdxStr(xi - 1) + (yj + offsetY)] = cell;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        if (sheetData) {
-            self_cachMergeIdxs(sheetData, yPos, 0);
-        } else {
-            let osY = 0;
-            for (let i = 0; i < pageData.items.length; i++) {
-                let shtItemData = pageData.items[i];
-                let tmpPos = yMultiPos[i];
-                self_cachMergeIdxs(shtItemData, tmpPos, osY);
-                osY += tmpPos.length - 2;
-            }
-        }
-    };
     let private_setSheetData = function(){
         //remark: 1 excel unit height = 0.3612 mm
         rst.push('<sheetData>');
         let spanX = xPos.length - 2, cellIdx = 0, h = 0
-            ;
+        ;
         let self_setDataEx = function (theShtData, theYPos, offsetY) {
             let rows = [];
             //1. build full set of blank rows/cells
@@ -791,7 +740,6 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             //4. maybe need to dispose the memory
             //...
         };
-        //private_cacheMergeBandBorderIdxs();
         if (sheetData) {
             //current sheet data
             currentPageMergePos = sheetData[JV.PAGE_SPECIAL_MERGE_POS];
@@ -938,12 +886,12 @@ module.exports = {
             zip.generateNodeStream({type:'nodebuffer',streamFiles:true})
                 .pipe(fs.createWriteStream(__dirname.slice(0, __dirname.length - 21) + '/tmp/' + newName + '.xlsx'))
                 .on('finish', function () {
-                    // JSZip generates a readable stream with a "end" event,
-                    // but is piped here in a writable stream which emits a "finish" event.
-                    console.log(newName + ".xlsx was written.");
-                    if (callback) callback(newName);
-                }
-            );
+                        // JSZip generates a readable stream with a "end" event,
+                        // but is piped here in a writable stream which emits a "finish" event.
+                        console.log(newName + ".xlsx was written.");
+                        if (callback) callback(newName);
+                    }
+                );
         } else {
             //return zip.generateNodeStream({type:'nodebuffer',streamFiles:true});
             return zip;
@@ -1003,7 +951,11 @@ module.exports = {
                         pageDataArray[i].items[j].cells[k][JV.PROP_AREA][JV.PROP_BOTTOM] += offsetY;
                         pageDataArray[i].items[j].cells[k][JV.PROP_AREA][JV.PROP_TOP] += offsetY;
                     }
+                    let bottomGap = Math.round( (pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1] - parseFloat(pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]) / 2.54 ) * DPI) - maxY;
                     offsetY += (maxY - minY);
+                    if (bottomGap > 10) {
+                        offsetY += (bottomGap - 10);
+                    }
                 }
             }
             //2. newPageData的items属性

+ 10 - 2
test/demo/stringTest.js

@@ -90,8 +90,16 @@ let strUtil = require('../../public/stringUtil');
 //     t.end();
 // });
 
-test('test string combine', function(t){
-    t.pass('ABC:' + 1 + 0);
+// test('test string combine', function(t){
+//     t.pass('ABC:' + 1 + 0);
+//
+//     t.end();
+// });
 
+test('test string replacement of return/new line', function(t){
+    new RegExp('\n\r','g');
+    let str = 'ABC-\n\r-123\r\n-zyx\n-987\r';
+    str = str.replace(new RegExp('\n\r','g'), '|').replace(new RegExp('\r\n','g'), '|').replace(new RegExp('\n','g'), '|').replace(new RegExp('\r','g'), '|');
+    t.pass('test result: ' + str);
     t.end();
 });