模板文件导出处理(字段替换)

1 参考模拟代码

public void exportBuilderLicence(String prjNum, HttpServletRequest request, HttpServletResponse response) throws IOException {
        //ExportExcelUtil.createXdocreport2(request,response);

        ExportPerformanceInfo t = new ExportPerformanceInfo();
        t.process(prjNum);
        if (t.err != null) {
            WebUtil.writeObjectAsJson(response, JsonResult.fail(t.err));
        } else {
            WebUtil.responseFile(t.outfile, t.returnFileName, response, request);
            t.outfile.delete();
        }
}

    class ExportPerformanceInfo{
        String prjNum;
        PerformanceDeclarationDetailsDTO perDetailsDTO;
        Map<String, Object> detailsDTO2;

        File outfile;
        String returnFileName;

        String err;

        void process(String prjNum) {
            this.prjNum = prjNum;

            // 加载项目
            this.loadProjectInfo();
            if (err != null){
                return;
            }

            // 生成文档
            String now = DateUtil.getNowDateTimeThinStr();
            returnFileName = "XXXX-" + perDetailsDTO.getInfoReq().getPrjName() + "-" + now + ".docx";
            outfile = new File("./tmp/export_project_" + prjNum + "-" + now + ".docx");
            if (!outfile.getParentFile().exists()) {
                outfile.getParentFile().mkdirs();
            }
            Resource resource = new ClassPathResource("document/陕西导出模板-业绩申报-20231221A.docx");
            try(InputStream is = resource.getInputStream();
                XWPFDocument doc = new XWPFDocument(is);) {
                this.renderDoc(doc);
                PoiWordUtil.write(doc, outfile);
            } catch(Exception e) {
                log.warn("导出失败", e);
                err = "导出失败";
                return;
            }

            if (err != null){
                return;
            }

        }

        void loadProjectInfo() {
            // 获取数据 并处理数据
            PerformanceDeclarationDetailsDTO perData = viewPerformanceDeclarationDetails(prjNum);
            if (perData == null) {
                err = "项目不存在";
                return;
            }
            perData.getInfoReq().setIsMajorName(Short.valueOf("0").equals(perData.getInfoReq().getIsMajor())?"否":"是");
            perData.getInfoReq().setPrjApprovalDateString(DateUtil.formatAsDate(perData.getInfoReq().getPrjApprovalDate()));
            for(ProjectCensorInfoReq censorInfoReq : perData.getCensorInfoReqs()){
                censorInfoReq.setOneCensorIsPassName(Short.valueOf("0").equals(censorInfoReq.getOneCensorIsPass())?"否":"是");
                censorInfoReq.setCensorEdateString(DateUtil.formatAsDate(censorInfoReq.getCensorEdate()));
            }
            this.perDetailsDTO = perData;
        }

        void renderDoc(XWPFDocument doc) {
            // 段落处理
            for (XWPFParagraph p : doc.getParagraphs()) {
                PoiWordUtil.renderParagraphVars(p, perDetailsDTO.getInfoReq());
                //System.out.println(p.getText());
            }


            // 表格处理
            for (XWPFTable tb : doc.getTables()) {
                String title = PoiWordUtil.getTblCaption(tb);
                //多模板构建 renderTableData3 表单 renderTableData1 列表
                if ("基本信息表".equals(title)) {
                    PoiWordUtil.renderTableData3(tb, BeanUtil.beanToMap(perDetailsDTO.getInfoReq()));
                }
                else if ("项目信息表".equals(title)) {
                    PoiWordUtil.renderTableData1(tb, perDetailsDTO.getUnitInfoReqs());
                }
                else if ("工程信息表".equals(title)) {
                    PoiWordUtil.renderTableData1(tb,             perDetailsDTO.getProjectCostInfoReqs());
                }
            }
        }

    }

2 相关扩展代码

public static void excel(InputStream resourceAsStream,
                             String fileName,
                             List data,
                             HttpServletResponse response) {
        try {
            ServletOutputStream out = response.getOutputStream();
            //设置文件类型
            response.setContentType("application/vnd.ms-excel");
            //设置编码格式
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");

            //创建excel
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(resourceAsStream).build();
            // 创建sheet
            WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();

            excelWriter.fill(data, fillConfig, writeSheet);
            //填充完成
            excelWriter.finish();
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3 相关扩展代码

/**
     * 设置文件下载的文件名,防止中文乱码
     */
    public void setHeader(HttpServletRequest request, HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
        String userAgent = request.getHeader("User-Agent");
        if(StringUtils.contains(userAgent, "MSIE")||StringUtils.contains(userAgent, "Trident") ||
                StringUtils.contains(userAgent, "Edge")){ //解决IE中文名称乱码
            fileName = URLEncoder.encode(fileName,"UTF8");
        }else {//火狐和其他浏览器中文名乱码
            fileName = new String(fileName.getBytes("utf8"), "ISO8859-1");
        }
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;" + " filename=\""+fileName+"\"");
    }

4模板样式

 5模板样式2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值