Apache POI 是常用的 Java 开发 excel 相关业务功能的工具包.
HSSF: Excel 97 版本, 后缀: .xls
XSSF: Excel 2007 版本, 后缀: .xlsx
SXSSF: 是 Apache POI v3.8+ 之后, 在 XSSF 基础上开发的低内存的流式扩展
1. 常见问题
1.1. 1. excel 数量上限
在 org.apache.poi.ss.SpreadsheetVersion 中预设了 excle 不同版本的行与列的数量上限
1 |
|
如 excel 2007 最大行数是 2^20, 即每一个 Sheet 最大行数 为1048576.
1.2. 2. 打开 excel 文件内存溢出
如果直接 WorkbookFactory.create(InputStream inputStream) 读取 excel 需要非常大的内存, 容易出现内存溢出的情况
解决方案
- 改成读取文件
在官方 API 中有说明, ``WorkbookFactory.create(File file)` 方式读取文件的资源消耗之前方式小.
- 控制加载数据量, 流式处理
1 | <dependency> |
1 | Workbook workbook = StreamingReader.builder() |
1.3. 3. 临时文件
poi 会在执行 write 方法时, 在 /tmp/poifiles 下创建临时文件, 名称形如 poi-sxssf-sheet423173909854689649.xml. 该文件大小依据需要生成文件的数据量决定, 会在线程退出时自动回收.
但如果线程意外退出, 那么该文件就不会回收;
解决方案:
- 清空文件数据, 释放资源占用
删除文件, 并重启服务, 可释放空间. 但如果是线上服务, 无法立即重启, 可通过清空文件数据释放磁盘资源占用.
由于 jvm 对临时文件还存在引用, 直接删除文件无法回收存储空间.
通过 echo "" > temp.xml 命令, 将文件内容清空;
- 主动清除临时文件
生成文件完成后, 主动调用 dispose 方法清除临时文件
1 | try(Workbook workbook = new SXSSFWorkbook(200);){ |