清理easyexcel导出07版Excel时产生的poi-sxssf-sheet*.xml临时文件

最新编辑
临时文件问题已经在官方2.x版本修复了,此文档不具有参考性了

事件起源

因为生产环境每天有大量的Excel文件导出,以前是导出03版,但是03版的每个sheet行数有限而且同样的数据文件本身也比07的要大不少。后来统一换成了导出07版,查资料知道poi的原生导出会有内存使用过高问题,恰好阿里的esayexcel针对此问题进行了优化,最后选型esayexcel。
因为导出的数据没有格式样式要求,只需要原始数据就可以,改造过程也很顺利。通过测试后顺利上线。有一天生产环境突然报警了,tmp/poifiles文件夹磁盘使用量报警;查看发现里面有大量的poi-sxssf-sheet*.xml(*是一串随机数字)临时文件。当时手动清理了,也没有太在意。过了大概有3周吧,又出现了。从这次开始就把调查这个原因提上了日程。

调查过程

首先在本地建立一个maven测试项目,导入github上的easyexcel项目,创建测试数据进行测试。
经过研究发现在导出的过程中会产生两种临时文件,一种是xlsx,一种是xml。导出结束后会将xlsx的临时文件进行清理,但是没有清理xml文件。
清理easyexcel导出07版Excel时产生的poi-sxssf-sheet*.xml临时文件_第1张图片
在本地测试发现,将Tomcat停了(stop),临时文件夹下的xml临时文件会自动清理掉,不知道是window机制还是Tomcat机制。或者过一段时间,可能输出流自动关闭了,这些xml文件也会自动消失。但是生产环境stop是不可能了,等待一段时间自动清理也不靠谱,唯一的办法就是在导出结束后自动删除。

改造过程

经过查找资料和查看源码,发现poi有一个dispose()方法用来清除临时文件。
在ExcelBuilderImpl的finish()方法中获取workbook,通过workbook调用dispose()方法来清除xml文件。
清理easyexcel导出07版Excel时产生的poi-sxssf-sheet*.xml临时文件_第2张图片

改造结果

在调用dispose()方法后,每次导出文件后都会自动将该导出的文件对应的xlsx临时文件和xml临时文件自动删除。
清理easyexcel导出07版Excel时产生的poi-sxssf-sheet*.xml临时文件_第3张图片
如果大家有更好的处理方法,欢迎交流!
最后,感谢esayexcel项目的作者jipengfei!
github地址:https://github.com/alibaba/easyexcel

你可能感兴趣的:(导出文件)