HSSF 是POI项目里专门处理Excel '97(-2007)的一部分, 而XSSF\SXSSF 则是专门处理Excel 2007 OOXML (.xlsx)文件格式;
HSSF和XSSF\SXSSF 提供多种方式来解析,修改,创建Excel文档:
- low level structures for those with special needs
- an eventmodel api for efficient read-only access
- a full usermodel api for creating, reading and modifying XLS files
如果你只是想读Excel表格内容, 那么用eventmodel就可以了,可以在 org.apache.poi.hssf.eventusermodel package 或者 org.apache.poi.xssf.eventusermodel package ,选哪一个取决Excel文件是xls还是xlsx。
如果要修改Excel文档使用usermodel api,当然也可以用来生成Excel;
值得一提的是usermodel会比eventuser model占用更多的内存, 但是他的优点是,使用起来更加简单。同时需要注意XSSF 支持的Excel 2007 OOXML (.xlsx) 文件是基于xml的, 他的内存占用会比老的HSSF(.xls) 二进制文件更大;
自从3.8-beta3, POI 提供了低内存占用的 SXSSF API
SXSSF 是一个 XSSF API兼容的流式扩展,可以在堆内存有限的情况下,用来生成一个非常大的表格,。SXSSF 实现了低内存占用通过限制行数的加载通过一个滑动的窗口, 而XSSF 会一次性加载文档的所有行数据。 SXSSF会把老的数据卸载硬盘里生成一个临时文件。
在自动flush模式里,滑动可入窗口是可以自定义的,来指定具体保持多少行数据在内存中。当达到这个设定值时,每一行新数据的生成,都会同时移除一行最老的数据到硬盘中。 又或者,窗口的大小可以设定成动态的,意思是窗口可以周期的flush出多余行数据;
和 XSSF比起来,因为SXSSF使用的是流式的处理方式,会有以下限制:
- 同一时间只有限制数量的行数据可以被访问到;
- 不支持Sheet.clone();
- 不支持公式估值
1. SXSSF (Streaming Usermodel API)
正如前面所说,SXSSF可以指定可入窗口的大小。有两种方法可以设置,1.是通过构造方法:new SXSSFWorkbook(int windowSize) ,2. 是通过给每个sheet设置,SXSSFSheet#setRandomAccessWindowSize(int windowSize)
当一行新的数据通过createRow()生成是,unflushed的数据量就会超出指定的窗口大小,就会直接导致,行下标最低的那一行数据直接被flush掉,并且也就无法再通过getRow()获取;
默认的窗口大小是100行,SXSSFWorkbook.DEFAULT_WINDOW_SIZE;
当设置的窗口大小为-1时,意思是不限制窗口大小。在这种情况下,只要没有手动调用flushRows(),意味着所有数据都是不受限制的。
SXSSFWorkbook 默认使用的是inline strings而不是shared strings(这两者的区别可以Google一下)。效率是非常高的, 因为没有任何文档需要缓存起来, 但是同时会导致一些不兼容的问题。inline string生成的文件 还会比shared strings 占用更多的磁盘空间。
需要注意的是,当使用到诸如合并单元格,超链接,注释,等需要存在内存中的属性是,任然会导致消耗客观 的内存;