POI--------》Workbook接口
- HSSFWorkbook :
这个实现类是我们早期使用最多的对象,它可以操作 Excel2003 以前(包含 2003)的所有 Excel 版本。在 2003 以前 Excel 的版本后缀还是.xls
- XSSFWorkbook :
这个实现类现在在很多公司都可以发现还在使用,它是操作的 Excel2003--Excel2007 之间的版本,Excel 的扩展名是.xlsx
- SXSSFWorkbook :
这个实现类是 POI3.8 之后的版本才有的,它可以操作 Excel2007 以后的所有版本 Excel,扩展名是.xlsx
HSSFWorkbook
它是 POI 版本中最常用的方式,不过:
- 它的缺点是 最多只能导出 65535 行,也就是导出的数据行数超过这个数据就会报错;
- 它的优点是 不会报内存溢出。(因为数据量还不到 7w 所以内存一般都够用,首先你得明确知道这种方式是将数据先读取到内存中,然后再操作)
XSSFWorkbook
- 优点:这种形式的出现是为了突破
HSSFWorkbook
的 65535 行局限,是为了针对 Excel2007 版本的 1048576 行,16384 列,最多可以导出 104w 条数据; - 缺点:伴随的问题来了,虽然导出数据行数增加了好多倍,但是随之而来的内存溢出问题也成了噩梦。因为你所创建的 book,Sheet,row,cell 等在写入到 Excel 之前,都是存放在内存中的(这还没有算 Excel 的一些样式格式等等),可想而知,内存不溢出就有点不科学了!!!
SXSSFWorkbook
从 POI 3.8 版本开始,提供了一种基于 XSSF 的低内存占用的 SXSSF 方式:
优点:
- 这种方式不会一般不会出现内存溢出(它使用了硬盘来换取内存空间,
- 也就是当内存中数据达到一定程度这些数据会被持久化到硬盘中存储起来,而内存中存的都是最新的数据),
- 并且支持大型 Excel 文件的创建(存储百万条数据绰绰有余)。
缺点:
- 既然一部分数据持久化到了硬盘中,且不能被查看和访问那么就会导致,
- 在同一时间点我们只能访问一定数量的数据,也就是内存中存储的数据;
sheet.clone()
方法将不再支持,还是因为持久化的原因;- 不再支持对公式的求值,还是因为持久化的原因,在硬盘中的数据没法读取到内存中进行计算;
- 在使用模板方式下载数据的时候,不能改动表头,还是因为持久化的问题,写到了硬盘里就不能改变了;
根据这样几种情况做分析选择:
1、当我们经常导入导出的数据不超过 7w 的情况下,可以使用 HSSFWorkbook
或者 XSSFWorkbook
都行;
2、当数据量查过 7w 并且导出的 Excel 中不牵扯对 Excel 的样式,公式,格式等操作的情况下,推荐使用SXSSFWorkbook
;
3、当数据量查过 7w,并且我们需要操做 Excel 中的表头,样式,公式等,这时候我们可以使用 XSSFWorkbook
配合进行分批查询,分批写入 Excel 的方式来做;