浏览代码

下载excel pdf 支持中文名称

TonyKang 7 年之前
父节点
当前提交
f6190f00b4

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

@@ -302,7 +302,8 @@ module.exports = {
             try {
                 rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
-                    res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
+                    let rptNameURI = encodeURI(rptName);
+                    res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI );
                     let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
                     filestream.on('data', function(chunk) {
                         res.write(chunk);
@@ -345,7 +346,8 @@ module.exports = {
             } else {
                 rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(tmpFilePath){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
-                    res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
+                    let rptNameURI = encodeURI(rptName);
+                    res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI );
                     let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + tmpFilePath + '.xlsx');
                     filestream.on('data', function(chunk) {
                         res.write(chunk);
@@ -434,7 +436,9 @@ module.exports = {
         getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
             rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
                 res.setHeader('Content-Type', 'application/vnd.openxmlformats');
-                res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
+                // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
+                let rptNameURI = encodeURI(rptName);
+                res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI + ".pdf" );
 
                 let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
                 filestream.on('data', function(chunk) {
@@ -456,7 +460,9 @@ module.exports = {
         getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
             rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
                 res.setHeader('Content-Type', 'application/vnd.openxmlformats');
-                res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
+                // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
+                let rptNameURI = encodeURI(rptName);
+                res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI );
 
                 let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
                 filestream.on('data', function(chunk) {

+ 14 - 14
package.json

@@ -22,37 +22,37 @@
     "glob": "~4.0.5"
   },
   "dependencies": {
+    "babel-core": "^6.4.0",
     "bluebird": "^3.5.0",
-    "jszip": "^3.1.3",
-    "moment": "^2.18.1",
-    "socket.io": "^2.0.3",
-    "ua-parser-js": "^0.7.14",
-    "uuid": "^3.1.0",
-    "ioredis":"^3.1.4",
-    "log4js":"~2.3.3",
-    "pdfkit": "^0.8.2",
     "del": "^1.1.1",
     "gulp": "^3.9.0",
     "gulp-autoprefixer": "^3.0.1",
     "gulp-babel": "^6.1.1",
-    "babel-core": "^6.4.0",
+    "gulp-concat": "^2.6.1",
     "gulp-cssnano": "^2.0.0",
     "gulp-eslint": "^0.13.2",
     "gulp-htmlmin": "^1.3.0",
     "gulp-imagemin": "^2.2.1",
+    "gulp-inject": "^4.3.0",
     "gulp-load-plugins": "^0.10.0",
     "gulp-plumber": "^1.0.1",
     "gulp-sass": "^2.0.0",
     "gulp-size": "^1.2.1",
     "gulp-uglify": "^1.1.0",
-    "gulp-inject":"^4.3.0",
-    "gulp-concat": "^2.6.1",
+    "gulp-uglify-es": "^0.1.3",
+    "ioredis": "^3.1.4",
+    "jszip": "^3.1.3",
+    "log4js": "~2.3.3",
     "main-bower-files": "^2.5.0",
-    "wiredep": "^2.2.2",
-    "gulp-uglify-es":"^0.1.3",
+    "moment": "^2.18.1",
     "multiparty": "^4.1.3",
+    "node-schedule": "^1.3.0",
     "node-xlsx": "^0.11.2",
-    "node-schedule": "^1.3.0"
+    "pdfkit": "^0.8.2",
+    "socket.io": "^2.0.3",
+    "ua-parser-js": "^0.7.14",
+    "uuid": "^3.1.0",
+    "wiredep": "^2.2.2"
   },
   "scripts": {
     "start": "C:\\Users\\mai\\AppData\\Roaming\\npm\\babel-node.cmd server.js"

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

@@ -39,7 +39,7 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a onclick="rptControlObj.chkAndGetExcel()" class="btn btn-primary">确定导出</a>
+                <a onclick="rptControlObj.getExcel()" class="btn btn-primary">确定导出</a>
             </div>
         </div>
     </div>

+ 33 - 30
web/building_saas/report/js/rpt_main.js

@@ -271,6 +271,8 @@ let canvasOprObj = {
 
 let rptControlObj = {
     currentOutputType: "Excel",
+    currentDownloadUrl: null,
+    currentDownloadIdx: 0,
     getCurrentPageSize: function() {
         // let rst = "A4";
         let rst = document.getElementById("btnRptPageSize").innerHTML.trim();
@@ -311,59 +313,47 @@ let rptControlObj = {
             //other types if needed.
         }
     },
-    getCurrentExcel: function() {
-        let me = rptControlObj;
-        //目前只支持当前打开报表
-        //zTreeOprObj.currentRptPageRst
-        if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.refId) {
-            let orgRptName = zTreeOprObj.currentNode.name;
-            orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_').replace(' ','');
-            let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +
-                me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + true + "/" + 'normal';
-            window.location = url;//这里不能使用get方法跳转,否则下载不成功
-        }
-    },
     getAllInOneBook: function () {
         let me = rptControlObj;
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             let orgRptName = zTreeOprObj.checkedRptTplNodes[0].name;
-            orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_').replace(' ','');
             let refRptTplIds = [];
             for (let node of zTreeOprObj.checkedRptTplNodes) {
                 refRptTplIds.push(node.refId);
             }
             let url =  "/report_api/getExcelInOneBook/" + projectInfoObj.projectInfo.ID + "/" + refRptTplIds.join(",") + "/" +
                 me.getCurrentPageSize() + "/" + orgRptName + "/" + 'normal';
-            window.location = url;//这里不能使用get方法跳转,否则下载不成功
+            window.location = url;
         }
     },
-    chkAndGetExcel: function () {
+    getExcel: function () {
         let me = rptControlObj;
         if ($("#excelExportType_AllInOneBook").get(0).checked) {
             me.getAllInOneBook();
         } else if ($("#excelExportType_IndividualBook").get(0).checked) {
             if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+                let urls = [];
                 for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
                     let orgRptName = tplNode.name;
-                    orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_').replace(' ','');
                     let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
                         me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + true + "/" + 'normal';
-                    // window.location = url;//这里不能使用get方法跳转,否则下载不成功
-                    window.open(url);
+                    urls.push(url);
                 }
+                downloadReport(urls);
             }
         }
     },
     getPDF: function() {
         let me = rptControlObj;
-        //目前只支持当前打开报表
-        //zTreeOprObj.currentRptPageRst
-        if (zTreeOprObj.checkedRptTplIds && zTreeOprObj.checkedRptTplIds.length > 0) {
-            let orgRptName = zTreeOprObj.currentNode.name;
-            orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_');
-            let url =  "/report_api/getPDF/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +
-                me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName;
-            window.location = url;//这里不能使用get方法跳转,否则下载不成功
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let urls = [];
+            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;
+                urls.push(url);
+            }
+            downloadReport(urls);
         }
     },
     firstPage: function(dom) {
@@ -390,7 +380,7 @@ let rptControlObj = {
         } else {
             keyPressed = event.which; // Firefox
         }
-        if (keyPressed == 13) {
+        if (keyPressed === 13) {
             let pageNum = 1;
             try {
                 pageNum = parseInt(dom.value);
@@ -444,12 +434,10 @@ let rptControlObj = {
         );
     },
     confirmCfgChange: function() {
-        // let me = zTreeOprObj;
         let treeNode = zTreeOprObj.currentNode;
         if (treeNode.nodeType === TPL_TYPE_TEMPLATE && treeNode.refId > 0) {
             let params = {};
-            let pageSize = rptControlObj.getCurrentPageSize();
-            params.pageSize = pageSize;
+            params.pageSize = rptControlObj.getCurrentPageSize();
             params.rpt_tpl_id = treeNode.refId;
             params.prj_id = projectInfoObj.projectInfo.ID;
             params.custCfg = zTreeOprObj.reportPageCfg;
@@ -458,3 +446,18 @@ let rptControlObj = {
 
     }
 };
+
+function downloadReport(urls) {
+    //考虑到多个报表下载,一些浏览器(如chrome)不允许一下子下载多个文件,得缓缓处理,统一在这处理
+    rptControlObj.currentDownloadUrl = null;
+    rptControlObj.currentDownloadIdx = 0;
+    let private_download = function() {
+        if (rptControlObj.currentDownloadIdx >= 0 && rptControlObj.currentDownloadIdx < urls.length) {
+            rptControlObj.currentDownloadUrl = urls[rptControlObj.currentDownloadIdx];
+            rptControlObj.currentDownloadIdx++;
+            window.location = rptControlObj.currentDownloadUrl;
+            setTimeout(private_download, 2000);
+        }
+    }
+    private_download();
+}