瀏覽代碼

批量导出excel

TonyKang 7 年之前
父節點
當前提交
a4b32be729

+ 41 - 0
modules/reports/controllers/rpt_controller.js

@@ -316,6 +316,47 @@ module.exports = {
             }
         })
     },
+    getExcelInOneBook: function (req, res) {
+        let prj_id = req.params.prj_id,
+            rpt_ids = req.params.rpt_ids.split(','),
+            pageSize = req.params.size,
+            rptName = req.params.rptName,
+            option = req.params.option;
+        let user_id = req.session.sessionUser.id;
+        let parallelFucs = [];
+        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+        for (let id of rpt_ids) {
+            parallelFucs.push((function (rpt_id) {
+                return function (cb) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, null, null, dftOption, function (err, pageRst) {
+                        if(err){
+                            cb(err);
+                        }
+                        else{
+                            cb(null, pageRst);
+                        }
+                    })
+                }
+            })(parseInt(id)));
+        }
+        async.parallel(parallelFucs, function (err, pageRstArray) {
+            if (err) {
+                callback(req, res, '数据有误', null);
+            } 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 filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + tmpFilePath + '.xlsx');
+                    filestream.on('data', function(chunk) {
+                        res.write(chunk);
+                    });
+                    filestream.on('end', function() {
+                        res.end();
+                    });
+                });
+            }
+        })
+    },
     getTestExcel: function(req, res) {
         let rpt_id = req.params.id,
             pageSize = req.params.size,

+ 1 - 0
modules/reports/routes/report_router.js

@@ -26,6 +26,7 @@ module.exports =function (app) {
     //now is the real:
     rptRouter.post('/getReport', reportController.getReportAllPages);
     rptRouter.post('/getReportSvg', reportController.getReportAllPagesSvg);
+    rptRouter.get('/getExcelInOneBook/:prj_id/:rpt_ids/:size/:rptName/:option', reportController.getExcelInOneBook);
     rptRouter.get('/getExcel/:prj_id/:rpt_id/:size/:orientation/:rptName/:isOneSheet/:option', reportController.getExcel);
     rptRouter.get('/getPDF/:prj_id/:rpt_id/:size/:orientation/:rptName', reportController.getPDF);
     // rptRouter.get('/getExcelInOneBook/:ids/:size/:rptName/:option', reportController.getExcelInOneBook);

二進制
web/building_saas/img/p1.png


二進制
web/building_saas/img/p2.png


File diff suppressed because it is too large
+ 0 - 26
web/building_saas/main/html/main.html


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

@@ -11,11 +11,11 @@
                 <div class="row">
                     <div class="col-6">
                         <div class="card">
-                            <img class="card-img-top" src="img/p2.png">
+                            <img class="card-img-top" src="/web/building_saas/img/p2.png">
                             <div class="card-body px-3">
                                 <div class="form-check">
-                                    <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value="option1" checked>
-                                    <label class="form-check-label" for="exampleRadios1">
+                                    <input class="form-check-input" type="radio" name="excelExportTypeRadio" id="excelExportType_AllInOneBook" value="option1" checked>
+                                    <label class="form-check-label" for="excelExportType_AllInOneBook">
                                         多个表导出一个Excel文件
                                     </label>
                                 </div>
@@ -24,11 +24,11 @@
                     </div>
                     <div class="col-6">
                         <div class="card">
-                            <img class="card-img-top" src="img/p1.png">
+                            <img class="card-img-top" src="/web/building_saas/img/p1.png">
                             <div class="card-body px-3">
                                 <div class="form-check">
-                                    <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios2" value="option2" checked>
-                                    <label class="form-check-label" for="exampleRadios2">
+                                    <input class="form-check-input" type="radio" name="excelExportTypeRadio" id="excelExportType_IndividualBook" value="option2" checked>
+                                    <label class="form-check-label" for="excelExportType_IndividualBook">
                                         每个表导出一个Excel文件
                                     </label>
                                 </div>
@@ -39,7 +39,7 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a onclick="rptControlObj.getExcel()" class="btn btn-primary">确定导出</a>
+                <a onclick="rptControlObj.chkAndGetExcel()" class="btn btn-primary">确定导出</a>
             </div>
         </div>
     </div>

+ 3 - 3
web/building_saas/report/html/rpt_main.html

@@ -15,9 +15,9 @@
             <div class="toolsbar">
                 <div class="print-toolsbar">
                     <div class="panel">
-                        <div class="panel-body">
+                        <div class="panel-body" id="print_div">
                             <button class="btn btn-outline-primary btn-sm" type="button" onclick="rptPrintHelper.preview()">
-                                <i class="fa fa-print"></i><br>打印
+                                <i class="fa fa-print"></i><br>打印<span class="badge badge-secondary">0</span>
                             </button>
                             <!--
                             <button class="btn btn-outline-primary btn-sm" type="button"  href="#export" data-toggle="modal" data-target="#export">
@@ -28,7 +28,7 @@
                     </div>
                     <div class="panel">
                         <div class="panel-body">
-                            <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
+                            <div class="btn-group" role="group" aria-label="Button group with nested dropdown" id="export_div">
                                 <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#export_excel"><i class="fa fa-file-excel-o"></i> Excel <span class="badge badge-secondary">0</span></button>
                                 <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.getPDF()"><i class="fa fa-file-pdf-o"></i> PDF <span class="badge badge-secondary">0</span></button>
                             </div>

+ 1 - 1
web/building_saas/report/js/rpt_cfg_const.js

@@ -25,7 +25,7 @@ let rpt_tpl_setting = {
         }
     },
     callback: {
-        //onCheck: zTreeOprObj.onCheck
+        onCheck: zTreeOprObj.onCheck,
         onClick: zTreeOprObj.onClick
     }
 };

+ 63 - 8
web/building_saas/report/js/rpt_main.js

@@ -26,10 +26,36 @@ let rptTplObj = {
 let zTreeOprObj = {
     treeObj: null,
     currentNode: null,
+    checkedRptTplNodes: null,
     currentRptPageRst: null,
     reportPageCfg: null,
     currentPage: 1,
     maxPages: 0,
+    countChkedRptTpl: function () {
+        let me = zTreeOprObj;
+        if (me.treeObj) {
+            me.checkedRptTplNodes = [];
+            let chkNodes = me.treeObj.getCheckedNodes(true), cnt = 0, hasCurrentNode = false;
+            for (let node of chkNodes) {
+                if (node.nodeType === TPL_TYPE_TEMPLATE) {
+                    cnt++;
+                    me.checkedRptTplNodes.push(node);
+                    if (me.currentNode === node) hasCurrentNode = true;
+                }
+            }
+            if (!hasCurrentNode && cnt === 0 && me.currentNode !== null) {
+                //这里根据实际需求再做处理
+                cnt++;
+                me.checkedRptTplNodes.push(me.currentNode);
+            }
+            $("#export_div").find("span").each(function(cIdx,elementSpan){
+                elementSpan.innerText = cnt;
+            });
+            $("#print_div").find("span").each(function(cIdx,elementSpan){
+                elementSpan.innerText = cnt;
+            });
+        }
+    },
     getReportTemplateTree: function() {
         let me = zTreeOprObj, params = {};
         params.engineerId = projectInfoObj.projectInfo.property.engineering;
@@ -114,11 +140,8 @@ let zTreeOprObj = {
         }
         me.treeObj.refresh();
     },
-    onCheck: function() {
-        //count();
-        //if (clearFlag) {
-        //    clearCheckedOldNodes();
-        //}
+    onCheck: function(event, treeId, treeNode) {
+        zTreeOprObj.countChkedRptTpl();
     },
     onClick: function(event,treeId,treeNode) {
         let me = zTreeOprObj;
@@ -131,6 +154,7 @@ let zTreeOprObj = {
             params.custCfg = me.reportPageCfg;
             me.currentNode = treeNode;
             me.requestReport(params);
+            me.countChkedRptTpl();
         }
     },
     changePageSize: function(dom) {
@@ -287,7 +311,7 @@ let rptControlObj = {
             //other types if needed.
         }
     },
-    getExcel: function() {
+    getCurrentExcel: function() {
         let me = rptControlObj;
         //目前只支持当前打开报表
         //zTreeOprObj.currentRptPageRst
@@ -295,15 +319,46 @@ let rptControlObj = {
             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 + "/" + false + "/" + 'normal';
+                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方法跳转,否则下载不成功
         }
     },
+    chkAndGetExcel: 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) {
+                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);
+                }
+            }
+        }
+    },
     getPDF: function() {
         let me = rptControlObj;
         //目前只支持当前打开报表
         //zTreeOprObj.currentRptPageRst
-        if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.refId) {
+        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 + "/" +