背景
今天遇到个要做导出的需求,很快就确定了技术方案用easyExcel,因为poi据说会有OOM问题,作为没有接触特别大型项目的我就不去深究这个问题了。在操作过程中发现了一个问题,直接拷用官方文档的文件导出的文件是空的,在一番研究之下写出了后面的代码,实现了用easyExcel的导出。直接上干货
包引入
这里说个贼有意思的事情,官方文档也是写的简介,简介到pom依赖都没有写。官方文档传送门:
https://www.yuque.com/easyexcel/doc/write
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.9</version>
</dependency>
请求处理代码
@ApiOperation(value = "xxxx", notes = "xxxxxx")
@GetMapping("/xxxx")
@SneakyThrows
public void exportProductInfo(@RequestBody @Valid QualifiedProductCommand command, HttpServletResponse response){
command.getPagination().setPageSize(5000);
ExportDTO exportDTO = finishedGoodsService.qualifiedProduct(command).getData();
String fileName = System.currentTimeMillis() + ".xlsx";
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
WriteSheet writeSheet =new WriteSheet();
writeSheet.setHead(exportDTO.getTitle());
writeSheet.setSheetName("xxx");
excelWriter.write(exportDTO.getContent(),writeSheet);
// 千万别忘记finish 会帮忙关闭流
excelWriter.finish();
}
此处对比官方文档的导出看:
@Test
public void dynamicHeadWrite() {
String fileName = TestFileUtil.getPath() + "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx";
EasyExcel.write(fileName)
// 这里放入动态头
.head(head()).sheet("模板")
// 当然这里数据也可以用 List<List<String>> 去传入
.doWrite(data());
}
当时看这官方代码有点蒙圈,也纳闷为啥流都没有处理还能导出呢。怀疑这是导出到磁盘文件的写法,没去测试过。用官方给出的方式导出文件是空的。加上**EasyExcel.write(response.getOutputStream())**后,便有流可以导出。
如有问题,希望大家评论区留言多多指教!