EasyExcel自用+分享给有需要的同学
EasyExcel官方文档:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/fill
需求并不难 导出数据 如下图

如果标题不需要动态传参的话 那么官方文档上面的合并标题使用实体注解的方式是比较方便的 如下图


但是无法实现动态的标题 所以我最开始采用了官方文档的模板填充方式自己做个表格模板放到项目中 就是本文第一张图,但是导出时遇到了问题 如下图

在这里需要预置导出文件的保存位置,在自测时当然没什么问题,但是在实际项目中这个没办法预置 因为每个用户保存地址都是未知的
当然可能有很多同学找到这个问题的各种解决方式 我也没去搜过
所以一开始我想到了一个办法 就是前端的同学在导出按钮时触发下用户选择保存文件地址的操作 和前端沟通了下 表示可以 如果看到这里方法可以接收的话后面就不用看了 官方文档代码直接改改就可以了
但是我觉得如果我这个导出和项目其他的导出交互方式不一致会显得另类
我还是想通过直接触发浏览器的保存 也就是触发导出后如下图的效果

所以我结合以前做过的导出做了些改动 直接上代码 各位有需要的同学参考下
pom依赖之类的就不贴了
请求参数除了业务需要的对象还有 HttpServletResponse response
ClassPathResource classPathResource = new ClassPathResource("/templates/模板文件.xlsx");
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyExcel没有关系
String sheetName = "导出表名";
String fileName = null;
try {
fileName = URLEncoder.encode(sheetName, "UTF-8").replaceAll("\\+", "%20");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
try {
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(classPathResource.getInputStream()).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(数据集合, fillConfig, writeSheet);
excelWriter.fill(数据集合, fillConfig, writeSheet);
Map<String, Object> map = MapUtils.newHashMap();
//这里就是占位符 大家根据需要put即可
map.put("nodeName", nodeName);
excelWriter.fill(map, writeSheet);
}
} catch (IOException e) {
e.printStackTrace();
}
平时比较忙 懒得写这些 今天有点时间 正好碰到了就分享下
646

被折叠的 条评论
为什么被折叠?



