前后端分离项目之数据导出为word实例

1.后台restful api,组装文件输出流对象到response响应包输出到前端(vue+webpack node管理)。
后台接口:根据projectId查询相关数据,并将相关字段封装到word模板中,最后用流输出文件。

控制层代码

@RequestMapping("/exportToWord")
    @ResponseBody
    public void exportToWord(HttpServletRequest request, 
            HttpServletResponse response,
            @RequestParam(value = "projectId", required = true) String projectId) {
        try {
            String path = request.getSession().getServletContext().getRealPath("\\");
            projectDocService.exportToWord(response,projectId,path);
        } catch (Exception e) {
            logger.error("事项导出成word失败:", e);
        }
    }

业务层代码

public void exportToWord(HttpServletResponse response,String projectId,String path) throws Exception{
        HashMap<String,Object> params=new HashMap<String,Object>();
        params.put("projectId", projectId);
        HashMap<String, Object> projectMap = projectDao.queryProjectDetailByPid(params);
        if(projectMap!=null){
            // 导出基本信息
            operatorProject(projectMap, path);
            String downpath = path + "FileDownload/govsdm/Download/project.docx";
            String erweimapath = path + "FileDownload/govsdm/QRCode/project.jpg";
            String srcpath = path + "FileDownload/govsdm/Export/project.docx";
            FileInputStream inputStream = new FileInputStream(erweimapath);
            Map<String, FileInputStream> maps = new HashMap<String, FileInputStream>(
                    0);
            maps.put("$erweima", inputStream);
            CustomXWPFDocument customXWPFDocument = new CustomXWPFDocument();
            // 插入二维码
            customXWPFDocument.searchAndReplaceImg(srcpath, downpath,
                    erweimapath, maps);

            download(downpath, response, projectMap.get("projectName").toString());
        }
    }

导出的word模板如下图:
这里写图片描述

public void operatorProject(Map<String, Object> projectMap, String path) throws Exception {
        HashMap<String, Object> map = new HashMap<String, Object>();
        //事项基本信息
        map.put("${projectNo}", projectMap.get("projectNo"));
        map.put("${projectName}", projectMap.get("projectName"));
        map.put("${PROJECTNAMEBIAOTI}", projectMap.get("projectName"));
        map.put("${deptName}", projectMap.get("deptName"));
        map.put("${itemName}", projectMap.get("itemName"));
        map.put("${projectItemNo}", projectMap.get("projectItemNo"));
        map.put("${projectShowNo}", projectMap.get("projectShowNo"));
        map.put("${gridNo}", projectMap.get("gridNo"));
        map.put("${PROJECT_TYPE_NAME}", projectMap.get("PROJECT_TYPE_NAME"));
        map.put("${SERVICE_TYPE_NAME}", projectMap.get("SERVICE_TYPE_NAME"));
        map.put("${CASE_TYPE_NAME}", projectMap.get("CASE_TYPE_NAME"));
        map.put("${DEAL_TYPE_NAME}", projectMap.get("DEAL_TYPE_NAME"));
        map.put("${TONGBAN_RANGE_NAME}", projectMap.get("TONGBAN_RANGE_NAME"));
        map.put("${RUN_SYSTEM_TYPE_NAME}", projectMap.get("RUN_SYSTEM_TYPE_NAME"));
        map.put("${POWER_UPDATE_TYPE_NAME}", projectMap.get("POWER_UPDATE_TYPE_NAME"));
        map.put("${POWER_STATE_NAME}", projectMap.get("POWER_STATE_NAME"));
        map.put("${ACCEPTING_RANGE_NAME}", projectMap.get("ACCEPTING_RANGE_NAME"));
        map.put("${IMPLEMET_SUBJECT_NATURE_NAME}", projectMap.get("IMPLEMET_SUBJECT_NATURE_NAME"));
        map.put("${AUTHORITY_DIVISION_NAME}", projectMap.get("AUTHORITY_DIVISION_NAME"));
        map.put("${STREET_DEAL_AUTHORITY_NAME}", projectMap.get("STREET_DEAL_AUTHORITY_NAME"));
        map.put("${DISTRIBUTE_SYS_TYPE_NAME}", projectMap.get("DISTRIBUTE_SYS_TYPE_NAME"));
        map.put("${distributeSysUrl}", projectMap.get("distributeSysUrl"));
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        String date =sdf.format(new Date());
        map.put("${riqi}", date);

        //查询字典表--审批类型
        HashMap<String,Object> projectTypeMap  = new HashMap<String,Object>();
        projectTypeMap.put("dictCode", "1003");
        List<HashMap<String, Object>> projectTypeList = sysDictInfoDao.findList(new RowBounds(), projectTypeMap);
        String projectType = combinationString(projectTypeList, String.valueOf(projectMap.get("projectType")));
        // 事项类型
        map.put("${SHIXIANGLEIXING}", projectType);
        //查询字典表--办理类型
        HashMap<String,Object> dealTypeMap  = new HashMap<String,Object>();
        dealTypeMap.put("dictCode", "1004");
        List<HashMap<String, Object>> dealTypeList = sysDictInfoDao.findList(new RowBounds(), dealTypeMap);
        String dealType = combinationString(dealTypeList, String.valueOf(projectMap.get("dealType")));
        // 办理类型
        map.put("${BANLILEIXING}", dealType);


        //办事指南基本信息
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("projectId",String.valueOf(projectMap.get("projectId")));
        HashMap<String, Object> summaryList = projectSummaryDao.queryProjectSummaryById(paramsMap);
        summaryList=StringUtils.clobToStringByMap(summaryList);//办事指南信息
        List<HashMap<String,Object>> projectFoundationList=projectFoundationDao.findList(new RowBounds(), paramsMap);
        projectFoundationList=StringUtils.clobToStringByList(projectFoundationList);//设立依据信息
        String foundation="";
        if(projectFoundationList!=null && projectFoundationList.size()>0){
            for(HashMap<String,Object> map1:projectFoundationList){
                String categoryName=map1.get("categoryName")==null?"":map1.get("categoryName").toString();
                String name=map1.get("name")==null?"":map1.get("name").toString();
                String organization=map1.get("organization")==null?"":map1.get("organization").toString();
                String issueOrderno=map1.get("issueOrderno")==null?"":map1.get("issueOrderno").toString();
                foundation+="["+categoryName+"]"+name+"("+organization+issueOrderno+")"+";";
            }
        }
        map.put("${foundation}", foundation);
        // 申请材料清单
        String applyMaterial=summaryList.get("applyMaterial")==null?"":summaryList.get("applyMaterial").toString();
        map.put("${applyMaterial}", StringEscapeUtils.unescapeHtml(applyMaterial));
        //受理标准(条件)
        String acceptCondition=summaryList.get("acceptCondition")==null?"":summaryList.get("acceptCondition").toString();
        map.put("${acceptCondition}", StringEscapeUtils.unescapeHtml(acceptCondition));
        //办理(审批)条件
        String premitCond=summaryList.get("premitCond")==null?"":summaryList.get("premitCond").toString();
        map.put("${premitCond}", StringEscapeUtils.unescapeHtml(premitCond));
        //材料审核标准
        String materAuditStandard=summaryList.get("materAuditStandard")==null?"":summaryList.get("materAuditStandard").toString();
        map.put("${materAuditStandard}", StringEscapeUtils.unescapeHtml(materAuditStandard));
        //收费标准
        String chargeStandard=summaryList.get("chargeStandard")==null?"":summaryList.get("chargeStandard").toString();
        map.put("${chargeStandard}", StringEscapeUtils.unescapeHtml(chargeStandard));
        //收费依据
        String chargeFoundation=summaryList.get("chargeFoundation")==null?"":summaryList.get("chargeFoundation").toString();
        map.put("${chargeFoundation}", StringEscapeUtils.unescapeHtml(chargeFoundation));
        //法定办理期限
        String statutoryDays=summaryList.get("statutoryDays")==null?"":summaryList.get("statutoryDays").toString();
        map.put("${statutoryDays}", StringEscapeUtils.unescapeHtml(statutoryDays));
        //法定办理期限描述
        String statutoryDesc=summaryList.get("statutoryDesc")==null?"":summaryList.get("statutoryDesc").toString();
        map.put("${statutoryDesc}", StringEscapeUtils.unescapeHtml(statutoryDesc));
        //承诺办理期限
        String promiseDays=summaryList.get("promiseDays")==null?"":summaryList.get("promiseDays").toString();
        map.put("${promiseDays}", StringEscapeUtils.unescapeHtml(promiseDays));
        //承诺办理期限描述
        String promiseDesc=summaryList.get("promiseDesc")==null?"":summaryList.get("promiseDesc").toString();
        map.put("${promiseDesc}", StringEscapeUtils.unescapeHtml(promiseDesc));
        //业务主管部门
        String examAppDept=summaryList.get("examAppDept")==null?"":summaryList.get("examAppDept").toString();
        map.put("${examAppDept}", StringEscapeUtils.unescapeHtml(examAppDept));
        //实施机构(实施主体)
        String acceptName=summaryList.get("acceptName")==null?"":summaryList.get("acceptName").toString();
        map.put("${acceptName}", StringEscapeUtils.unescapeHtml(acceptName));
        //联办机构
        String jointlyOrganize=summaryList.get("jointlyOrganize")==null?"":summaryList.get("jointlyOrganize").toString();
        map.put("${jointlyOrganize}", StringEscapeUtils.unescapeHtml(jointlyOrganize));
        //办理处(科)室
        String dealMain=summaryList.get("dealMain")==null?"":summaryList.get("dealMain").toString();
        map.put("${dealMain}", StringEscapeUtils.unescapeHtml(dealMain));
        //办理地点
        String acceptAddress=summaryList.get("acceptAddress")==null?"":summaryList.get("acceptAddress").toString();
        map.put("${acceptAddress}", StringEscapeUtils.unescapeHtml(acceptAddress));
        //所在窗口
        String windowAddress=summaryList.get("windowAddress")==null?"":summaryList.get("windowAddress").toString();
        map.put("${windowAddress}", StringEscapeUtils.unescapeHtml(windowAddress));
        //办理时间
        String workTime=summaryList.get("workTime")==null?"":summaryList.get("workTime").toString();
        map.put("${workTime}", StringEscapeUtils.unescapeHtml(workTime));
        //中介服务
        String intermediaryService=summaryList.get("intermediaryService")==null?"":summaryList.get("intermediaryService").toString();
        map.put("${intermediaryService}", StringEscapeUtils.unescapeHtml(intermediaryService));
        //数量限制
        String quantityRestriction=summaryList.get("quantityRestriction")==null?"":summaryList.get("quantityRestriction").toString();
        map.put("${quantityRestriction}", StringEscapeUtils.unescapeHtml(quantityRestriction));
        //行使内容(权限说明)
        String acceptAuthorityDesc=summaryList.get("acceptAuthorityDesc")==null?"":summaryList.get("acceptAuthorityDesc").toString();
        map.put("${acceptAuthorityDesc}", StringEscapeUtils.unescapeHtml(acceptAuthorityDesc));
        //特别程序及期限
        String specialProcedure=summaryList.get("specialProcedure")==null?"":summaryList.get("specialProcedure").toString();
        map.put("${specialProcedure}", StringEscapeUtils.unescapeHtml(specialProcedure));
        //责任事项
        String responsibilityMatters=summaryList.get("responsibilityMatters")==null?"":summaryList.get("responsibilityMatters").toString();
        map.put("${responsibilityMatters}", StringEscapeUtils.unescapeHtml(responsibilityMatters));
        //责任事项依据
        String responsibilityFoundation=summaryList.get("responsibilityFoundation")==null?"":summaryList.get("responsibilityFoundation").toString();
        map.put("${responsibilityFoundation}", StringEscapeUtils.unescapeHtml(responsibilityFoundation));
        //职责边界
        String responsibilityBoundary=summaryList.get("responsibilityBoundary")==null?"":summaryList.get("responsibilityBoundary").toString();
        map.put("${responsibilityBoundary}", StringEscapeUtils.unescapeHtml(responsibilityBoundary));
        //平均去现场次数
        String sceneNum=summaryList.get("sceneNum")==null?"":summaryList.get("sceneNum").toString();
        map.put("${sceneNum}", StringEscapeUtils.unescapeHtml(sceneNum));
        //办理流程
        String process=summaryList.get("process")==null?"":summaryList.get("process").toString();
        map.put("${process}", StringEscapeUtils.unescapeHtml(process));
        //内部流程描述
        String insideProcessDesc=summaryList.get("insideProcessDesc")==null?"":summaryList.get("insideProcessDesc").toString();
        map.put("${insideProcessDesc}", StringEscapeUtils.unescapeHtml(insideProcessDesc));
        //证照形式及有效期
        String certName=summaryList.get("certName")==null?"":summaryList.get("certName").toString();
        map.put("${certName}", StringEscapeUtils.unescapeHtml(certName));
        //证照名称
        String licenseName=summaryList.get("licenseName")==null?"":summaryList.get("licenseName").toString();
        map.put("${licenseName}", StringEscapeUtils.unescapeHtml(licenseName));
        //填报人
        String reporter=summaryList.get("reporter")==null?"":summaryList.get("reporter").toString();
        map.put("${reporter}", StringEscapeUtils.unescapeHtml(reporter));
        //填报人联系方式
        String reporterPhone=summaryList.get("reporterPhone")==null?"":summaryList.get("reporterPhone").toString();
        map.put("${reporterPhone}", StringEscapeUtils.unescapeHtml(reporterPhone));
        //备注
        String remark=summaryList.get("remark")==null?"":summaryList.get("remark").toString();
        map.put("${remark}", StringEscapeUtils.unescapeHtml(remark));
        //预留字段1
        String reserve1=summaryList.get("reserve1")==null?"":summaryList.get("reserve1").toString();
        map.put("${reserve1}", StringEscapeUtils.unescapeHtml(reserve1));
        //预留字段2
        String reserve2=summaryList.get("reserve2")==null?"":summaryList.get("reserve2").toString();
        map.put("${reserve2}", StringEscapeUtils.unescapeHtml(reserve2));
        //预留字段3
        String reserve3=summaryList.get("reserve3")==null?"":summaryList.get("reserve3").toString();
        map.put("${reserve3}", StringEscapeUtils.unescapeHtml(reserve3));
        //预留字段4
        String reserve4=summaryList.get("reserve4")==null?"":summaryList.get("reserve4").toString();
        map.put("${reserve4}", StringEscapeUtils.unescapeHtml(reserve4));
        //预留字段5
        String reserve5=summaryList.get("reserve5")==null?"":summaryList.get("reserve5").toString();
        map.put("${reserve5}", StringEscapeUtils.unescapeHtml(reserve5));

        //导出模板的文件路径
        String srcPath = path + "FileDownload\\govsdm\\Masterplate\\project.docx";
        //导出的word路径
        String destPath = path + "FileDownload\\govsdm\\Export\\project.docx";

        List<HashMap<String, Object>> projectMaterList = 
                projectMaterialsDao.queryProjectMaterialsByPid(paramsMap);
        projectMaterList=StringUtils.clobToStringByList(projectMaterList);//将clob类型转换为string
        if(projectMaterList!=null && projectMaterList.size()>0){
            searchAndReplaceProject(srcPath, destPath, map,projectMaterList);
        }
    }
public static void searchAndReplaceProject(String srcPath, String destPath,
            HashMap<String, Object> map,
            List<HashMap<String, Object>> projectMaterialsList) throws IOException {
        try {
            File srcDocument = new File(srcPath);
            OPCPackage pack = POIXMLDocument.openPackage(srcDocument.toString());
            XWPFDocument document = new XWPFDocument(pack);
            // 替换表格中的指定文字
            Iterator<XWPFTable> itTable = document.getTablesIterator();
            while (itTable.hasNext()) {
                XWPFTable table = (XWPFTable) itTable.next();
                int rcount = table.getNumberOfRows();
                for (int i = 0; i < rcount; i++) {
                    XWPFTableRow row = table.getRow(i);
                    List<XWPFTableCell> cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        for (Entry<String, Object> e : map.entrySet()) {
                            if (cell.getText().equals(e.getKey())) {
                                cell.removeParagraph(0);
                                XWPFParagraph p=cell.addParagraph();
                                try {
                                    p.createRun().setText(e.getValue().toString());
                                } catch (Exception e1) {
                                    e1.printStackTrace();
                                }
                            }
                        }
                    }
                }
            }
             try {
                 List<XWPFTable> tableList=document.getTables();
                 if (tableList!=null&&tableList.size()>0) {
                     int length=tableList.size();
                     XWPFTable table = (XWPFTable) tableList.get(length-1);
                     for(int i=0;i<projectMaterialsList.size();i++){
                         XWPFTableRow row=table.createRow();
                         List<XWPFTableCell> cells = row.getTableCells();
                         for (int j = 0; j < cells.size(); j++) {
                             XWPFTableCell cell=cells.get(j);
                             cell.removeParagraph(0);
                             CTTcPr tcpr = cell.getCTTc().addNewTcPr();
                             CTTblWidth cellw = tcpr.addNewTcW();
                             cellw.setType(STTblWidth.DXA);
                             cellw.setW(BigInteger.valueOf(360*5));
                             if(j==0){
                             cell.setText(String.valueOf(projectMaterialsList.get(i).get("materialName")));
                             }if(j==1){
                                 cell.setText(String.valueOf(projectMaterialsList.get(i).get("description")));
                             }if(j==2){
                                  if("01".equals(projectMaterialsList.get(i).get("materialType")))
                                  {
                                      cell.setText("■文本类 □表格类 □结果文书类 □其它类");
                                  }else if("02".equals(projectMaterialsList.get(i).get("materialType")))
                                  {
                                      cell.setText("□文本类 ■表格类 □结果文书类 □其它类");
                                  }else if("03".equals(projectMaterialsList.get(i).get("materialType")))
                                  {
                                      cell.setText("□文本类 □表格类 ■结果文书类 □其它类");
                                  }else
                                  {
                                      cell.setText("□文本类 □表格类 □结果文书类 ■其它类");
                                  } 
                             }
                         }
                     }
                 }
                 FileOutputStream outStream = null;
                 outStream = new FileOutputStream(destPath);
                 document.write(outStream);
                 outStream.close();
             } catch (Exception e) {
                 e.printStackTrace();
             }
                /给WORD插入标题///
                //获得第一个段落对象
                   XWPFParagraph paragraph = document.getParagraphs().get(3);
                   //段落的格式,下面及个设置,将使新添加的文字向左对其,无缩进.
                   paragraph.setIndentationLeft(0);
                   paragraph.setIndentationHanging(0);
                   paragraph.setWordWrap(true);
                   //在段落中新插入一个run,这里的run我理解就是一个word文档需要显示的个体,里面可以放文字,参数0代表在段落的最前面插入
                   XWPFRun run = paragraph.insertNewRun(0);
                   //设置run内容
                   run.setText(map.get("${PROJECTNAMEBIAOTI}")+"");
                   run.setFontFamily("宋体");
                   run.setBold(true);
                   run.setFontSize(20);
                FileOutputStream outStream = null;
                outStream = new FileOutputStream(destPath);
                document.write(outStream);
                outStream.flush();
                outStream.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
    }
private String combinationString(List<HashMap<String, Object>> list, String type) {
        String cString = "";
        String[] typeArr = type.split(",");
        boolean isSelected = false;
        for (int i = 0; i < list.size(); i++) {
            isSelected = false;
            for(String type1 : typeArr){
                if (list.get(i).get("dictId").equals(type1)) {  
                    isSelected = true;
                }
            }
            if (isSelected) {
                cString += "■" + list.get(i).get("dictName") + "  ";
            }else{
                cString += "□" + list.get(i).get("dictName") + "  ";
            }
        }
        return cString;
    }

最后输出文件流

public HttpServletResponse download(String path, HttpServletResponse response, String projectname) throws Exception {
        // path是指欲下载的文件的路径。
        File file = new File(path);
        // 以流的形式下载文件。
        InputStream fis = new BufferedInputStream(new FileInputStream(path));
        byte[] buffer = new byte[fis.available()];
        fis.read(buffer);
        fis.close();
        // 清空response
        response.reset();
        // 设置response的Header
        response.addHeader("Content-Disposition", "attachment;filename="
                + new String((projectname + ".docx").getBytes("gbk"),
                        "iso-8859-1"));
        response.addHeader("Content-Length", "" + file.length());
        OutputStream toClient = new BufferedOutputStream(
                response.getOutputStream());
        response.setContentType("application/octet-stream");
        toClient.write(buffer);
        toClient.flush();
        toClient.close();
        return response;
    }

前端vue代码片段;

<Button type="warning" size="small" @click="exports(item.projectId)" icon="share" v-if="btnData.indexOf('export')!==-1">导出</Button>

js代码

//导出
        exports(projectId){
            let token = localStorage.getItem('token');

            //自定义form标签,初始化相关参数
            var form = $("<form>");
            form.attr('style', 'display:none');
            form.attr('target', '');
            form.attr('method', 'post');
            form.attr('action', window.config.api + '/projectDocController/exportToWord.do');

            var input1 = $('<input>');
            input1.attr('type', 'hidden');
            input1.attr('name', 'projectId');
            input1.attr('value', projectId);

            var input2 = $('<input>');
            input2.attr('type', 'hidden');
            input2.attr('name', 'token');
            input2.attr('value', token);

            $('body').append(form);
            form.append(input1);
            form.append(input2);

            form.submit();
            form.remove();
        }

小结:针对文件流的操作,尽量用提交form表单的形式处理请求。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值