zoukankan      html  css  js  c++  java
  • 数据导出生成word附件使用POI的XWPFTemplate对象

    比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel。
    Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于

    操作Excel格式文件的HSSF和

    用于操作Word的HWPF;

    一、前端使用get请求和post请求都可以

    get请求:

    window.location.href= appPath+"/export/handoverForm?ticketId="+self.ticketId +
                        "&complainId="+row.id+"&formCode="+self.exportFormCode.complainDetail;

    隐藏form表单改写成post请求,form表单get和post都可以:

    <form id="exportForm" action="/service/xfComplain/exportCaseLedger" method="post">
            <input type="hidden" name="dataRange" id="dataRange"/>
            <input type="hidden" name="processStatus" id="processStatus"/>     
            <input type="hidden" name="cantonCode" id="cantonCode"/>
            <input type="hidden" name="startDate" id="startDate"/>
            <input type="hidden" name="endDate" id="endDate"/>
            <input type="hidden" name="multiFildMatch" id="multiFildMatch"/>
        </form>
    $("#dataRange").val(self.table.pageData.dataRange);
                $("#processStatus").val(self.table.pageData.processStatus);
                $("#startDate").val(self.table.pageData.startDate);
                $("#endDate").val(self.table.pageData.endDate);
                $("#multiFildMatch").val(self.table.pageData.multiFildMatch);
                $('#exportForm').submit();

    二、java代码

    @ResponseBody
        @RequestMapping("/exportWord")
        public void exportHandoverForm(HttpServletRequest request,
                                       HttpServletResponse response, ExportParam exportParam) {
            String projectPath = getProjectPath(request);
            String templateFile = getTemplateFile(exportParam, projectPath, request);
            Map<String, Object> data = new HashMap<>();
            File file = null;
            InputStream in = null;
            ServletOutputStream out = null;
            try {
                // 数据源
                HandoverModel handoverModel = getHandoverFormData(exportParam.getComplainId());
                // 反射机制,获取所有属性对象,在拿到属性值,设置数据
                for (Field field : HandoverModel.class.getDeclaredFields()) {
                    // 暴力反射,不是public修饰的属性也要获取
                    field.setAccessible(true);
                    data.put(field.getName(), field.get(handoverModel));
                }
                // 数据源组成map键值对形式
                data.put("reportorList", handoverModel.getReportorList().getDatas());
                String fileName = handoverModel.getCaseCode();
                String exportFilePath = projectPath + ExportConstant.DEFAULT_EXPORT_PATH;
                logger.info("----------templateFile:" + templateFile);
                logger.info("-----------projectPath:" + projectPath);
                // Configure对象是处理表格数据,可以自适应生成对应行数数据
                Configure config = Configure.newBuilder().customPolicy("reportorList", new FileTablePolicy()).build();
                // XWPFTemplate对象是处理word文档对象,根据map数据源的键值对渲染文档数据
                XWPFTemplate template = XWPFTemplate.compile(templateFile, config).render(data);
                // 文件生成到本地,先生成好文档,再读取到内存中响应给前台
                String downloadFileName = fileName + ".docx";
                File outPutFile = new File(exportFilePath);
                if (!outPutFile.exists()) {
                    outPutFile.mkdirs();
                }
                FileOutputStream outFile = new FileOutputStream(exportFilePath + downloadFileName);
                template.write(outFile);
                outFile.flush();
                outFile.close();
                template.close();
                // 通过文件流读取到文件,再将文件通过response的输出流,返回给页面下载
                file = new File(projectPath + ExportConstant.DEFAULT_EXPORT_PATH + downloadFileName);
                in = new FileInputStream(file);
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/msword");
                response.setHeader("Content-Disposition", "attachment;filename="
                        .concat(String.valueOf(URLEncoder.encode(downloadFileName, "UTF-8"))));
                out = response.getOutputStream();
                byte[] buffer = new byte[512];
                int bytesToRead = -1;
                // 用响应对象response中的输出流读取生成好的文件
                while ((bytesToRead = in.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesToRead);
                }
            } catch (Exception e) {
                logger.error("导出word出错", e);
            } finally {
                if (in != null) try {
                    in.close();
                    if (out != null) out.close();
                    if (file != null) file.delete(); // 删除临时文件
                } catch (IOException e) {
                    logger.error("删除删除临时文件出错", e);
                }
            }
        }

    使用XWPFTemplate引擎,插件化Configure插入表格;

     三、不需要插入表格:

    XWPFTemplate template = XWPFTemplate.compile(templateFile).render(data);
  • 相关阅读:
    Kubernetes(K8S)集群部署搭建图文教程(最全)
    Kubernetes核心原理和搭建
    Navicat Premium 15注册出现“rsa public key not find”
    centos 7永久修改主机名
    docker 部署jenkins,及构建执行scp指令,一直处于构建状态以及钉钉通知配置
    jenkins 无法连接仓库:Command /usr/bin/git ls-remote -h
    mysql 8.0安装包下载地址
    centos7安装xtrabackup 物理备份工具与使用
    Linux vi/vim编辑器
    解决报错docker 启动报 WARNING: IPv4 forwarding is disabled. Networking will not work.
  • 原文地址:https://www.cnblogs.com/wmqiang/p/11602884.html
Copyright © 2011-2022 走看看