poi - 超大文件读写
基本代码要有,本文仅介绍关键部分。
可以参考:https://gitee.com/seaboot/seaboot-office.git
基础用法
POI 中有 4 个常用的对象,与 Excel 文档结构是对应的:
- WorkBook:一整个 Excel;
- Sheet:一个 Excel 可以有很多表格(如下图所示);
- Row:每一个表格可以包含很多行;
- Cell:每一行包含很多单元格。
WorkBook,Sheet,Row 都是继承自 Iterator,就是各种遍历、迭代。
WorkBook 实现类
代码只需要写一份,要实现不同读写方式,切换不同的 WorkBook 实现类即可。
- HSSFWorkbook Excel2003版本
- XSSFWorkbook Excel2007版本
- StreamingWorkbook 超大文件读取
- SXSSFWorkbook 超大文件写入
超大文件读取
StreamingBook 与其它 WorkBook 有一定区别:它只有 Iterator 的功能,
有点像指针,每次扫描几行,不断向前扫描,直至文件末尾,
而且读取顺序是不可逆的,读到了第三行,无法返回读取第二行。
这意味着,你没办法直接跳过,直接读取第 100 行的数据,编写代码的时候不会报错,会等到运行时报错。
详见:StreamingSheet 源码,大部分 API 都是直接抛出异常。
class Test{
/**
* WorkBook 使用 StreamingSheet
*
* @param is is
* @param rowCacheSize number of rows
* @param bufferSize buffer size in bytes
*/
public void createStreamingReader(InputStream is, int rowCacheSize, int bufferSize) {
try {
this.workbook = StreamingReader.builder()
.rowCacheSize(rowCacheSize)
.bufferSize(bufferSize)
.open(is);
} catch (EncryptedDocumentException e) {
throw new ExcelException("read excel failed!check your file!", e);
}
}
}
超大文件写入
将你代码中的 HSSFWorkbook、XSSFWorkbook 转为 SXSSFWorkbook 即可完成优化,
数据写入过程,与常规写入完全一致,不需要变动自己原先的代码。
class Test{
/**
* 将 HSSFWorkbook、XSSFWorkbook 转为 SXSSFWorkbook 即可完成优化
*
* @param rowAccessWindowSize rowAccessWindowSize
* @since Excel.2007 (.xlsx)
*/
public void createSXSSFWorkbook(int rowAccessWindowSize) {
this.workbook = new SXSSFWorkbook((XSSFWorkbook) this.workbook, rowAccessWindowSize);
}
}
Maven依赖
<dependencys>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.monitorjbl</groupId>
<artifactId>xlsx-streamer</artifactId>
<version>2.2.0</version>
</dependency>
</dependencys>
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!