浏览代码

导出Excel加分页符 + paging逻辑补漏

TonyKang 4 年之前
父节点
当前提交
2c45cc2749
共有 2 个文件被更改,包括 63 次插入6 次删除
  1. 2 1
      app/reports/rpt_component/jpc_flow_tab.js
  2. 61 5
      app/reports/util/rpt_excel_util.js

+ 2 - 1
app/reports/rpt_component/jpc_flow_tab.js

@@ -716,7 +716,8 @@ JpcFlowTabSrv.prototype.createNew = function() {
                             // 2018-08-04 其实之前的判断逻辑完全是自找麻烦,而且还不够正确。其实只需要判断已经处理了多少行纪录(所有的都算,包括空白行),
                             // 与总的seg纪录数想比较,就很容易得到结果,而且能处理极端边界的情况。
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
-                            pageStatus[JV.STATUS_REPORT_END] = true;
+                            // pageStatus[JV.STATUS_REPORT_END] = true;
+                            pageStatus[JV.STATUS_REPORT_END] = (segIdx === me.segments.length - 1);
                             private_resetBandArea();
                             const hasAdHocRow = ((adHocAutoHeightAmt > maxRowRec) || !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, handledRowAmt, maxRowRec, me.isEx));
 

+ 61 - 5
app/reports/util/rpt_excel_util.js

@@ -331,6 +331,31 @@ function writeSharedString(sharedStrList) {
     }
     return rst;
 }
+function _setupPgBrks(pageData) {
+    pageData.pageBreaks = [];
+    let pgBrkIdx = 0;
+    const pgBrk = [];
+    function _insertMaxBottom(pCells, targetBottomArr) {
+        if (pCells) {
+            for (const cell of pCells) {
+                if (targetBottomArr.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) < 0) {
+                    targetBottomArr.push(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
+                }
+            }
+        }
+    }
+    for (const page of pageData.items) {
+        const maxBottomArr = [];
+        _insertMaxBottom(page.cells, maxBottomArr);
+        _insertMaxBottom(page.signature_cells, maxBottomArr);
+        _insertMaxBottom(page.signature_date_cells, maxBottomArr);
+        _insertMaxBottom(page.signature_audit_cells, maxBottomArr);
+        pgBrkIdx += maxBottomArr.length;
+        pgBrk.push(pgBrkIdx);
+    }
+    pageData.pageBreaks.push(pgBrk);
+}
+
 function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage, custSheetMergeBands, hasSignature, signSheetIdxArr) {
     const rst = [];
     const private_pushDftFont = function() {
@@ -374,14 +399,14 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
     private_buildFirstDftStyle();
     let sheetIdx = 0;
     if (isSinglePage) {
-        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj, null, hasSignature, sheetIdx, signSheetIdxArr, true));
+        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj, null, hasSignature, sheetIdx, signSheetIdxArr, true, -1));
     } else {
         for (let i = 0; i < pageData.items.length; i++) {
             let appointedMergeBand = null;
             if (custSheetMergeBands && custSheetMergeBands.length > i) {
                 appointedMergeBand = custSheetMergeBands[i];
             }
-            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj, appointedMergeBand, hasSignature, sheetIdx, signSheetIdxArr, i === 0));
+            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj, appointedMergeBand, hasSignature, sheetIdx, signSheetIdxArr, i === 0, i));
             sheetIdx++;
         }
     }
@@ -509,7 +534,7 @@ function preAnalyzePos(pageData, sheetData, xPos, yPos, yMultiPos) {
         }
     }
 }
-function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand, hasSignature, sheetIdx, signSheetIdxArr, isFirstSheet) {
+function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand, hasSignature, sheetIdx, signSheetIdxArr, isFirstSheet, pgBrkIdx) {
     const rst = [];
     const xPos = [];
     const yPos = [];
@@ -943,6 +968,23 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
         // }
         rst.push('<drawing r:id="rId1"/>');
     }
+    // 插入分页符---------------------------
+    if (pageData.pageBreaks) {
+        let pgBrks = [];
+        if (sheetData !== null) {
+            pgBrks = pageData.pageBreaks[pgBrkIdx];
+        } else {
+            pgBrks = pageData.pageBreaks[0];
+        }
+        if (pgBrks.length > 1) {
+            rst.push('<rowBreaks count="' + pgBrks.length + '" manualBreakCount="' + pgBrks.length + '" >');
+            for (let pbi = 0; pbi < pgBrks.length; pbi++) {
+                rst.push('<brk id="' + pgBrks[pbi] + '" max="16383" man="1" />');
+            }
+            rst.push('</rowBreaks>');
+        }
+    }
+    // 插入分页符结束---------------------------
     rst.push('</worksheet>');
     return rst;
 }
@@ -1159,7 +1201,7 @@ function _createDummyCell(dummyOrgCells, parentPage) {
             control: 'Default',
             style: 'Default_None',
             Value: '',
-            area: { Left: 0, Right: 0, Top: 0, Bottom: 0 }
+            area: { Left: 0, Right: 0, Top: 0, Bottom: 0 },
         };
         if (signature.style) dummyCell.style = signature.style;
         dummyCell[JV.PROP_AREA][JV.PROP_LEFT] = signature[JV.PROP_AREA][JV.PROP_LEFT];
@@ -1307,6 +1349,9 @@ module.exports = {
             createDummySignatureCell(pageData);
         }
         if (isSinglePage) {
+            // 加分页符(分页符要在外部处理好)-------------------
+            _setupPgBrks(pageData);
+            // 加分页符结束-------------------
             sheets.push({ sheetName: '全部页' });
         } else {
             if (custSheetNames && custSheetNames.length === pageData.items.length) {
@@ -1501,6 +1546,9 @@ module.exports = {
                 mergeBand[JV.PROP_RIGHT].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT]);
                 sheetNames.push(pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
 
+                // 加分页符(分页符要在外部处理好)-------------------
+                _setupPgBrks(pageDataArray[i]);
+                // 加分页符结束-------------------
                 for (let j = 0; j < pageDataArray[i].items.length; j++) {
                     let maxY = 0;
                     let minY = 100000;
@@ -1563,8 +1611,9 @@ module.exports = {
                     }
                 }
             }
-            // 2. newPageData的items属性
+            // 2. newPageData的items属性及相关分页符
             newPageData.items = [];
+            newPageData.pageBreaks = [];
             for (let i = 0; i < pageDataArray.length; i++) {
                 const pageItem = {};
                 pageItem[JV.PROP_PAGE_SEQ] = i + 1;
@@ -1595,6 +1644,13 @@ module.exports = {
                 newPagePos[i][JV.NODE_PAGE_SIZE] = pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE];
                 pageItem[JV.PAGE_SPECIAL_MERGE_POS] = newPagePos[i];
                 newPageData.items.push(pageItem);
+                // 重新分配分页符()------------------
+                if (pageDataArray[i].pageBreaks.length === 1) {
+                    newPageData.pageBreaks.push(pageDataArray[i].pageBreaks[0]);
+                } else {
+                    newPageData.pageBreaks.push([]);
+                }
+                // 重新分配分页符结束------------------
             }
             // 3. everything is ok, then call me
             // let roleRel = null; // 未来调用的时候,这个属性要从外面给!!!