HSSFXSSF和SXSSF区别以及Excel导出优化
Posted 技术宅de小坑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HSSFXSSF和SXSSF区别以及Excel导出优化相关的知识,希望对你有一定的参考价值。
之前有写过运用POI的HSSF方式导出数据到Excel(见:springMVC中使用POI方式导出excel至客户端、服务器实例),但这种方式当数据量大到一定程度时容易出现内存溢出等问题。
首先,POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。他们的区别如下:
HSSF:是操作Excel97-2003版本,扩展名为.xls。
XSSF:是操作Excel2007版本开始,扩展名为.xlsx。
SXSSF:是在XSSF基础上,POI3.8版本开始提供的一种支持低内存占用的操作方式,扩展名为.xlsx。
其次,大家需要了解下Excel不同版本的一些区别,这些限制其实间接的局限了POI提供的API功能。
1、支持的行数、列数
Excel97-2003版本,一个sheet最大行数65536,最大列数256。
Excel2007版本开始,一个sheet最大行数1048576,最大列数16384。
2、文件大小
.xlsx文件比.xls的压缩率高,也就是相同数据量下,.xlsx的文件会小很多。
3、兼容性
Excel97-2003版本是不能打开.xlsx文件的。
Excel2007开始的版本是可以打开.xls文件的。
根据以上内容,大家可以根据自己的需求进行选择,当然海量数据的导出肯定是推荐SXSSF的方式。编码过程中,其实不同方式的使用方式基本相同,所以互相切换也是比较简单的,只要把带有前缀的接口改成对应的就行了。如:
HSSF对应:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell……
XSSF对应:XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell……
SXSSF对应:SXSSFWorkbook、Sheet、Row、Cell……
规律还是挺明显的吧,除了workbook,SXSSF的接口都不带前缀,另外两种方式的各个接口都带有对应的前缀。
另外,前面有提到SXSSF是一种低内存占用的操作方式,因为其提供了一个新的方法:
SXSSFWorkbook w3= new SXSSFWorkbook(100);//内存中保留100条数据,其余写入硬盘临时文件
在数据量超过设置的值时,会在硬盘生成临时文件保存之前的数据,而且POI会根据规则自动删除生成的这些临时文件。
其实到这里已经结束了,但在好奇心的驱使下,个人想看看POI生成的临时文件。所以查了一下,大家说是在系统的缓存文件夹下会产生类似的临时文件,如:
poi-sxssf-sheet6849116696956134782.xml
根据操作系统的不同,通常目录如下:
Windows7: C:\\Users\\xxxx\\AppData\\Local\\Temp (xxxx为windows用户名)
Linux: /var/tmp/
但并没有找到,后来在tomcat的临时文件夹下找到了,如:D:\\Tomcat_7.0.42\\temp。
于是又科普了一下,发现是tomcat的原因,因为在tomcat上运行的应用会通过java.io.tmpdir系统变量获取到临时文件的目录。
大家可以通过下面的语句查看自己应用的临时文件目录:
System.out.println(System.getProperty("java.io.tmpdir"));
虽然POI会根据规则自动删除临时文件,但是知道了文件路径,大家也可以根据实际情况,看是否删除这些临时文件。
以上是关于HSSFXSSF和SXSSF区别以及Excel导出优化的主要内容,如果未能解决你的问题,请参考以下文章
SXSSF 工作簿 createSheet() 在 linux 环境中失败