前提
Java生成Excel,数据量巨大(打印后10000页),模板复杂。
EasyPoi,EasyExcel不满足复杂模板的需求。最终技术上选用Spire.XLS(社区版即可),性能比POI要好很多。但是Spire.XLS设置行高时,对于超窄行高设置后有失真。例如:行高5.65
解决方案是根据模板的高度用POI重新设置一遍行高。
问题
在生成打印后400页,且每页中224列,76行。共计17024个Cell。需要内存为3.4G。
距离预期打印后10000页的目标,内存使用无法接受。
原因
用POI读取Excel时使用内存会非常多。因为Excel2007之后是用XML方式存储的。通过解压方式获取到原始的XML文件,这个Sheet的XML文件就有150M大小。全部Load到内存中,且转换为Dom对象,内存直接上到5G。3.7G也是POI优化过的结果。
对策
因为只需要设置行高(也可以设置其他内容,但是本项目中没有此类需求,可以根据实际情况自行增加响应代码)。所以采用的是把Excel文件当做ZIP文件进行处理。且不进行解压,再压缩的操作。直接修改其内部XML,直接通过字符串方式设置行高。
改善之后,生成打印后400页Excel内存使用量为500M。为改善前的14%。
影响
此方案适用于对超大Excel进行操作的处理。
如果只是读入数据,可以采用EasyExcel。
如果是模板简单,可以采用EasyPOI。