Browse Source

批量导出excel/pdf边界、方向有时候不一致

TonyKang 7 years ago
parent
commit
9dd54f1d12

+ 4 - 3
modules/reports/controllers/rpt_controller.js

@@ -224,7 +224,8 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, custo
                     let tplData = rptDataUtil.assembleData(rawDataObj);
                     let printCom = JpcEx.createNew();
                     if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
-                    if (orientation) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
+                    //console.log("orientation: " + (orientation === 'null'));
+                    if (orientation !== 'null') rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
                     let defProperties = rptUtil.getReportDefaultCache();
                     if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
                     let dftOption = option||JV.PAGING_OPTION_NORMAL;
@@ -331,7 +332,7 @@ module.exports = {
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
         getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, dftOption, function(err, pageRst){
             try {
-                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
+                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(newName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     let rptNameURI = encodeURI(rptName);
                     res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx' );
@@ -400,7 +401,7 @@ module.exports = {
         getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function(err, pageRst){
             fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
             try {
-                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
+                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(newName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
                     let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');

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

@@ -287,7 +287,7 @@ function writeSharedString(sharedStrList){
     }
     return rst;
 }
-function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage){
+function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage, custSheetMergeBands){
     let rst = [];
     let private_pushDftFont = function(){
         let font = {};
@@ -329,15 +329,19 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
     private_pushDftFont();
     private_buildFirstDftStyle();
     if (isSinglePage) {
-        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj));
+        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj, null));
     } else {
         for (let i = 0; i < pageData.items.length; i++) {
-            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj));
+            let appointedMergeBand = null;
+            if (custSheetMergeBands && custSheetMergeBands.length > i) {
+                appointedMergeBand = custSheetMergeBands[i];
+            }
+            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj, appointedMergeBand));
         }
     }
     return rst;
 }
-function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
+function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand){
     let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
     let private_pre_analyze_pos = function(){
@@ -501,6 +505,9 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             mergeBorder = (sheetData)?sheetData[JV.PROP_PAGE_MERGE_BORDER]:pageData[JV.BAND_PROP_MERGE_BAND],
             mergeBand = pageData[JV.BAND_PROP_MERGE_BAND]
         ;
+        if (appointedMergeBand !== null) {
+            mergeBand = appointedMergeBand;
+        }
         if (sheetBorder[borderStr] && sheetBorder[borderStr][JV.PROP_LINE_WEIGHT] !== undefined) {
             rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT];
         }
@@ -809,7 +816,7 @@ function mergeProperties(orgObj, newObj) {
 }
 
 module.exports = {
-    exportExcel: function (pageData, paperSize, fName, options, custSheetNames, callback) {
+    exportExcel: function (pageData, paperSize, fName, options, custSheetNames, custSheetMergeBands, callback) {
         let rptOptions = ({singlePage: false, fileName: 'report'});
         if (options === 'true') {
             rptOptions.singlePage = true;
@@ -864,7 +871,7 @@ module.exports = {
         //6.
         let zip_worksheets = zip_xl.folder('worksheets');
         let sharedStrList = [], stylesObj = {};
-        data = writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage);
+        data = writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage, custSheetMergeBands);
         if (isSinglePage) {
             for (let i = 0; i < 1; i++) {
                 file = 'sheet' + (i + 1) + '.xml';
@@ -906,7 +913,7 @@ module.exports = {
         //   -- 简单来说,就是重新包装数据
         try {
             // 1.1 newPageData外围属性
-            let newContrl = {}, newFont = {}, newStyle = {};
+            let newContrl = {}, newFont = {}, newStyle = {}, custMergeBands = [];
             for (let i = 0; i < pageDataArray.length; i++) {
                 mergeProperties(newContrl, pageDataArray[i][JV.NODE_CONTROL_COLLECTION]);
                 mergeProperties(newFont, pageDataArray[i][JV.NODE_FONT_COLLECTION]);
@@ -923,6 +930,7 @@ module.exports = {
             for (let i = 0; i < pageDataArray.length; i++) {
                 let offsetY = 0;
                 let mergeBand = {};
+                custMergeBands.push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND]);
                 mergeBand[JV.PROP_LEFT] = [];
                 mergeBand[JV.PROP_RIGHT] = [];
                 mergeBand[JV.PROP_TOP] = [];
@@ -976,7 +984,7 @@ module.exports = {
                 newPageData.items.push(pageItem);
             }
             //3. everything is ok, then call me
-            me.exportExcel(newPageData, paperSize, fName, 'false', sheetNames, callback);
+            me.exportExcel(newPageData, paperSize, fName, 'false', sheetNames, custMergeBands, callback);
             // fsUtil.writeObjToFile(newPageData, 'D:/GitHome/ConstructionOperation/tmp/combinedHeader.js');
         } catch (e) {
             console.log(e);

+ 1 - 1
test/unit/excel_export/rpt_excel_export_test.js

@@ -14,7 +14,7 @@ test('check real function.', function(t){
     eval(data);
     var pageObj = testReport08_2;
     //console.log(pageObj.items[0].cells.length);
-    rpt_xl_util.exportExcel(pageObj, fName, null);
+    rpt_xl_util.exportExcel(pageObj, fName, 'false', null, null, null);
     t.pass('pass exportExcel');
     t.end();
 });

+ 12 - 19
web/building_saas/report/html/rpt_print.html

@@ -41,15 +41,15 @@
         if (sessionStorage.multiRptsData) {
             let multiRptData = JSON.parse(sessionStorage.multiRptsData);
             let scaleFactor = parseInt(sessionStorage.scaleFactor);
-            let svgArr = [];
             for (let idx = 0; idx < multiRptData.length; idx++) {
                 let pageData = multiRptData[idx];
                 if (idx === 0) {
                     $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
                 }
-                svgArr = svgArr.concat(rptPrintHelper.buildSvgArr(pageData, -30, -30));
+                let svgArr = rptPrintHelper.buildSvgArr(pageData, -30, -30);
+                let orientation = (pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][0] < pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1])?"纵向":"横向";
+                showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, orientation);
             }
-            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
             window.print();
         } else if (sessionStorage.currentPageData) {
             let pageData = JSON.parse(sessionStorage.currentPageData);
@@ -70,36 +70,29 @@
 
     function showPreviewData(svgArr, scaleFactor, pageSize, orientation) {
         let orgHeight = 793, orgWidth = 1122;
-        let pageHeight = orgHeight * scaleFactor, pageWidth = orgWidth * scaleFactor;
         if (pageSize === 'A3') {
-            pageHeight = orgWidth * scaleFactor;
-            pageWidth = orgHeight * 2 * scaleFactor;
             orgHeight = 1122;
             orgWidth = 793 * 2;
-        } else if (pageSize === '自定义') {
+        } else if (pageSize.indexOf('自定义') >= 0) {
             //自定义
+        } else {
+            //其他size(LEGAL, 16K etc.)
         }
+        let pageHeight = orgHeight * scaleFactor, pageWidth = orgWidth * scaleFactor;
         if (orientation === "纵向") {
-            let tmpInt = pageHeight;
-            pageHeight = pageWidth;
-            pageWidth = tmpInt;
-
-            tmpInt = orgWidth;
-            orgWidth = orgHeight;
-            orgHeight = tmpInt;
+            pageHeight = orgWidth * scaleFactor;
+            pageWidth = orgHeight * scaleFactor;
         }
 
         for (let i = 0; i < svgArr.length; i++) {
             let div = $('<div class="pageBreak"></div>');
             div.append($(svgArr[i].join("")));
-            $("body").append(div);
-        }
-        $(document.body).find("div").each(function(index,element){
-            $(element).find("svg").each(function(cIdx,elementSvg){
+            $(div).find("svg").each(function(cIdx,elementSvg){
                 elementSvg.setAttribute('height', pageHeight);
                 elementSvg.setAttribute('width', pageWidth);
             });
-        });
+            $("body").append(div);
+        }
     }
 
     function closing() {

+ 4 - 2
web/building_saas/report/js/rpt_main.js

@@ -333,10 +333,11 @@ let rptControlObj = {
         } else if ($("#excelExportType_IndividualBook").get(0).checked) {
             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/getExcel/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
-                        me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + true + "/" + 'normal';
+                        me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName + "/" + true + "/" + 'normal';
                     urls.push(url);
                 }
                 downloadReport(urls);
@@ -347,10 +348,11 @@ let rptControlObj = {
         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() + "/" + me.getCurrentOrientation() + "/" + orgRptName;
+                    me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName;
                 urls.push(url);
             }
             downloadReport(urls);

+ 2 - 1
web/building_saas/report/js/rpt_print.js

@@ -58,7 +58,8 @@ let rptPrintHelper = {
             let page = pagesData.items[idx];
             let svgPageArr = [], pixelSize = getPixelSize(pagesData);
             svgPageArr.push("<svg width='" + pixelSize[0] + "' height='" + pixelSize[1] + "'>");
-            let adjustY = 0.5 * ((idx + 1) % 2);
+            // let adjustY = 0.5 * ((idx + 1) % 2);
+            let adjustY = 0.5;
             for (let cell of page.cells) {
                 svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND], offsetX, offsetY, adjustY, canvas));
             }