excel导出注意点

常用EXCEL有Excel2013、2010、2007和老一点的Excel2003较为多见

POI操作EXCEL对象
HSSF:操作Excel 97(.xls)格式 是操作Excel2003以前(包括2003)的版本,扩展名是.xls;
如果想用HSSFWorkbook导出更大行数的excel。(分sheet页)那需要设置更大的运行内存,最大行数取决你的运行虚拟内存。
例如:
修改VM arguments为“-Xms64m -Xmx512m -XX:MaxPermSize=512m“,那么能导出最大的行数在333680~331680之间。

本博提供相关工具类 Poi使用HSSFWorkbook方式导出Excel工具类
XSSF:操作Excel 2007(.xlsx)格式,操作EXCEL内存占用高于HSSF
POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。
SXSSF:从POI3.8 beta3开始支持,基于XSSF,低内存占用。只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。
本博提供相关工具类 Poi使用SXSSFWorkbook方式导出Excel工具类

使用POI的HSSF对象,生成Excel 97(.xls)格式,生成的EXCEL不经过压缩直接导出。
线上问题:负载服务器转发请求到应用服务器阻塞,以及内存溢出 。
如果系统存在大数据量报表导出,则考虑使用POI的SXSSF进行EXCEL操作。

HSSF生成的Excel 97(.xls)格式本身就有每个sheet页不能超过65536行数据,256列的限制。

XSSF生成Excel2007-2010的版本(它的一张表最大支持1048576行,16384列)(.xlsx)格式,条数增加了,每个sheet页104万行,但是导出过程中,内存占用率却高于HSSF.

SXSSF是自3.8-beta3版本后,基于XSSF提供的低内存占用的操作EXCEL对象。
其原理是可以设置或者手动将内存中的EXCEL行写到硬盘中,这样内存中只保存了少量的EXCEL行进行操作。
EXCEL的压缩率特别高,能达到80%,12M的文件压缩后才2M左右。
如果未经过压缩、不仅会占用用户带宽,且会导致负载服务器(apache)和应用服务器之间,
长时间占用连接(二进制流转发),导致负载服务器请求阻塞,不能提供服务。
针对 SXSSF Beta 3.8下,会有临时文件产生,比如:
poi-sxssf-sheet4654655121378979321.xml
文件位置:java.io.tmpdir这个环境变量下的位置
Windows 7下是C:UsersxxxxxAppDataLocalTemp
Linux下是 /var/tmp/

注:HSSFWorkbook和XSSFWorkbook的Excel Sheet导出条数上限(<=2003版)是65535行、256列,(>=2007版)是1048576行,16384列,如果数据量超过了此上限,那么可以使用SXSSFWorkbook来导出。
实际上上万条数据,甚至上千条数据就可以考虑使用SXSSFWorkbook了。
poi4.0.0版本的JDK需要1.8以上,如果JDK是1.7的,那么就使用3.9版本的依赖

注意:
一定要注意文件流的关闭
也要防止前台(页面)连续触发导出EXCEL
最终,这依赖于和客户的沟通问题了,导出数据也要看情况,
一,为了看,分sheet完全没问题
二,数据迁移,这个导出几个xls就行了
三,如果为了分析或者其他原因,只能放在一个sheet页,一匹马拉火车是不可能的,起码不能再用.xls格式了,
并且随着数据量变大,导出时间,内存占用也都是问题,07版本以后的excel每页也仅能支持104万左右

所以综上来看,结合大数据量的导出效率,内存占用,使用流行程度,建议导出为.xlsx格式,采用较新的SXSSF实现
十万级别的数据量,格式不限制的的可以采用hssf,excel为03版本,只支持.xls格式,建议还是采用SXSSF方式
超大数据量采用SXSSF,excel为07之后版本,只支持.xlsx格式

原文地址:https://www.cnblogs.com/jianzhixuan/p/13921584.html