HSSFWorkbook:处理Excel2003以前(包括2003)的版本,扩展名是.xls,不可以打开编辑07版的xlsx文件,行列的上限为65536行,256列。
XSSFWorkbook:处理Excel2007的版本,扩展名是.xlsx,也能打开编辑03版的xls文件,行列的上限为1048575行,16384列。
若是excel中数据量超过上述最大行数,由于HSSFWorkbook和XSSFWorkbook是在内存中进行数据处埋,如临时文件过大,且无法处理过量数据,则会导致OOM。
SXSSFWorkbook可用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel,用硬盘空间换内存。
SXSSFWorkbook处理方式:
当SXSSFWorkbook设置窗口数据的数目为100时,当处理到第101行的数据时,会将rownum=0的行的数据刷新到磁盘并从内存中删除,当rownum达到102时,将刷新rownum=1的行刷新到磁盘并从内存中删除,以此类推……
所以SXSSFWorkbook是用硬盘空间换内存,并且已经超出窗口数据量的数据,也就是写入磁盘的数据,无法再被读取。
以下文字内容均来自官方文档
官方文档链接:
https://poi.apache.org/spreadsheet/how-to.html#sxssf
SXSSF(package:org.apache.poi.xssf.streaming)是XSSF的API-compatible streaming的扩展,用于生成数据量很多的excel,并且能够进行分区。SXSSF通过对数据进行分区处理达到占用较小内存,而XSSF允许访问文档中的所有行。SXSSF超出处理窗口故据量的数据会被写入硬盘(Windows电脑的话,是写入到c盘根目录下的temp文件夹),所以SXSSF写入硬盘的数据无法在后续处理中再次进行访问。
可以通过new SXSSFWorkbook(int windowsize)在创建workbook时指定窗口容纳数据的大小,也可以通过SXSSFSheet#setRandomAccessWindowsize(int windowsize)按工作表设置窗口大小。
当通过createRow()创建了一行新的数据,但此时进行处理的指定的窗口数据量并没有进行更新,则这条创建出来的新的数据无法通过getRow()访问。
SXSSFWorkbook默认窗口数据量为100,可以通过SXSSFWorkbook.DEFAULT_WINDOW_SIZE进行设置。
windowSize为-1表示无限制访问。在这种情况下,所有未通过调用flushRows()刷新的记录都可用于随机访问。
注意:SXSSF会分配必须要通过调用dispose方法才能够删除的临时文件。
SXSSFWorkbook默认使用内联字符串而不是共享字符串表,这很大的节省了资源,因为没有文档内容需要保存在内存中,但也被称为制作与某些客户不兼容的文档。在启用共享字符串的情况下,文档中的所有唯一字符串必须保存在内存中。根据您的文档内容,这可能比共享字符串被禁用时使用更多的资源。
注意:存储在内存中的信息,如被频繁使用,仍然有许多东西可能会占用大量内存,例如:合并区域.超链接、评论…
可根据内存大小和兼容性需求,决定是否后用共享字符串。