SpringBoot结合Easypoi模板导出 路径问题

最近做导出word和excel,因为title太复杂,所以结合EasyPoi的模板来导出。将模板文件放到resources/template下,idea里还可以导出,打包之后不能导出,已解决。

1、准备模板

常用的模板指令就参考官方文档:模板 指令介绍
但是再word中使用求和指令“sum: ”不管用,不知道为什么。所以是在代码里计算之后占位到word中。
模板的位置:
模板的位置
word模板:
word
excel模板:
在这里插入图片描述

2、导出代码

/**
     *  模板:导出word
     * @param template 模板,放在、resources/template下
     * @param paramsMap {{参数}}
     * @param response web 响应
     */
    public void exportWordTemplate(String template, Map<String, Object> paramsMap, HttpServletResponse response) {
        InputStream is = this.getClass().getResourceAsStream(template);
        exportWordTemplate(is, paramsMap,response);
    }
    /**
     *  模板:导出word
     * @param is 模板流,放在、resources/template下
     * @param paramsMap {{参数}}
     * @param response web 响应
     */
    public static void exportWordTemplate(InputStream is, Map<String, Object> paramsMap, HttpServletResponse response) {
        String fileName = paramsMap.getOrDefault("fileName", "exportWord").toString()+".docx";
        try {
            // 文件名
            MyXWPFDocument doc = new MyXWPFDocument(is);
            WordExportUtil.exportWord07(doc, paramsMap);
            // 设置响应体内容类型
            response.setContentType("application/octet-stream");
            // 添加响应头
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            // 暴露新添加的响应头
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            //将word文档流输出到输出流中
            doc.write(response.getOutputStream());
            //关闭流
            doc.close();
        } catch (Exception e) {
            e.printStackTrace();
            log.info(e.getMessage());
            throw new BusinessException(e.getMessage());
        }
    }

    /**
     * 模板:导出excel
     * @param is 模板流,放在、resources/template下
     * @param paramsMap {{参数}}
     * @param response web响应
     */
    public static void exportExcelTemplate(InputStream is, Map<String, Object> paramsMap, HttpServletResponse response) {
        // 文件名
        String fileName = paramsMap.getOrDefault("fileName", "exportExcel").toString() + ".xls";
        try {
            TemplateExportParams params = new TemplateExportParams();
            Workbook workbook = WorkbookFactory.create(is);
            params.setTemplateWb(workbook);
            Workbook book = ExcelExportUtil.exportExcel(params, paramsMap);
            downLoadExcel(fileName,response,book);
        }catch (Exception e) {
            e.printStackTrace();
            log.info(e.getMessage());
            throw new BusinessException(e.getMessage());
        }
    }
     /**
     * excel下载
     *
     * @param fileName 下载时的文件名称
     * @param response
     * @param workbook excel数据
     */
    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
        try {
            fileName = fileName.contains("xls")?fileName:fileName + ".xlsx";
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

3、调用代码

	@PostMapping("/??")
    @ApiOperation("word导出")
    public void exportWeekReport(@RequestBody @Validated StatisticalParamDTO dto)  {
        // 获取导出所需的数据
        Map<String, Object> params = warningStatisticalService.getExportWeekReportParams(dto);
        // 导出word
        InputStream is = this.getClass().getResourceAsStream("/template/weekReportExport.docx");
        EasyPoiUtil.exportWordTemplate(is, params, httpServletResponse);
    }
@GetMapping("/??")
    @ApiOperation("excel导出")
    public void focusControlStatisticalExport() {
        Map<String, Object> params = warningStatisticalService.focusControlStatistical();
        InputStream is = this.getClass().getResourceAsStream("/template/focusControlStatistical.xls");
        EasyPoiUtil.exportExcelTemplate(is, params, httpServletResponse);
    }

4、路径问题

1、报“ No valid entries or contents found, this is not a valid OOXML (Office Open XML) file”错误,在pom.xml中添加:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>docx</nonFilteredFileExtension>
            <nonFilteredFileExtension>doc</nonFilteredFileExtension>
            <nonFilteredFileExtension>xls</nonFilteredFileExtension>
            <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
 </plugin>

2、打包之后找不到路径
因为在static里读取的路径会改变,看了easypoi源码,先在非static方法里读取文件,再把文件流传给esaypoi:

public void exportWordTemplate(String template, Map<String, Object> paramsMap, HttpServletResponse response) {
        InputStream is = this.getClass().getResourceAsStream(template);
        exportWordTemplate(is, paramsMap,response);
    }
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值