Java导出Excel不生成临时文件解决方案

使用POI创建表格

POI是Apache提供的用于解析MS Office文档的工具类库,关于POI的使用本文不详细说明。
项目新增加导出excel表格的需求,百度后发现很多解决方案都是采用POI生成临时文件到本地,然后返回生成的文件给前端,甚至还有返回新的url或者重定向的。私以为不够优雅,不够高效。

采用byte[]直接返回文件

既然下载文件时是给前端直接返回的byte[],那我们后端是不是也能直接把XSSFWorkbook对象转换为byte[]来直接返回呢?
XSSFWorkbook输入文件时是调用的write(OutputStream stream)方法将当前excel文件写入到一个输出流里面,那我们尝试实例化一个ByteArrayOutputStream,然后写入它试试。

1
2
3
XSSFWorkbook sheets=new XSSFWorkbook();
ByteArrayOutputStream out = new ByteArrayOutputStream();
sheets.write(out);

接着把这个输出流转换成byte[]

1
2
byte[] output=out.toByteArray();
out.close();

注意这里一定要关闭掉输出流,否则会照成内存泄露。
然后直接返回得到的byte[]即可,一测试,顺利通过。关于文件下载不具体说明。
需要的话可以参考Angular多文件上传