先了解下excel版本区别
excel2003 | excel2007及以上 | |
后缀 | .xls | .xlsx |
结构 | 二进制格式 | xml数据结构 |
特点 | 存储容量有限 | xml压缩,占用空间小,操作效率高 |
可以看到2007及以上版本为xml数据结构,对后续海量数据处理起到关键作用。
apachePoi官方对excel2007使用xssf对象,可以分为三种模式:
用户模式:有很多封装的方法,但非常耗内存
事件模式:基于sax方式解析xml,它可以逐行扫描xml文档,一边扫描一边解析(扩展:dom解析是把所有数据一次性加载到内存)
sxssf对象:通过临时存储空间生成excel,用来导出海量数据excel文件
百万数据导出
出现的问题:当使用poi工具导出数据报表时,系统在导出时出现oom异常
分析问题:使用VisualVM工具监测到在导出报表的过程中,不断的触发垃圾回收,堆内存越来越多,最后导致oom;可以推测出poi解析报表数据时是一次性加载内存中,内存不足触发垃圾回收,然而不断有数据加载到内存,直至jvm发生oom。
解决方案:使用sxssf对象来导出海量数据。sxssf对象操作数据报表时设置内存中对象数量的最大数量,当超过阀置,则会创建临时磁盘.xml文件,不断将内存的数据存入临时文件并清空内存去加载未处理的对象数据,这样内存中对象的数量是固定,就不会照成内存溢出
注意事项:因为将数据存入临时文件是对磁盘进行操作,而写磁盘的速度比内存慢很多,可能会出现写临时文件照成拥堵
百万数据读取
出现问题:当使用poi工具读取百万数据报表,系统在读取时出现oom异常
分析问题:和百万数据导出出现的问题一致:加载到内存的数据过大,导致内存溢出
解决方案:基于事件模式读取百万数据,使用sax逐行读取,一边读取一边解析,使用完即销毁本条数据,因此不需要将数据存储到内存中,避免了内存溢出
注意事项:因为是用完一行则销毁,则不能重复使用数据