poi - 超大文件读写

基本代码要有,本文仅介绍关键部分。

可以参考:https://gitee.com/seaboot/seaboot-office.git

基础用法

POI 中有 4 个常用的对象,与 Excel 文档结构是对应的:

  • WorkBook:一整个 Excel;
  • Sheet:一个 Excel 可以有很多表格(如下图所示);
  • Row:每一个表格可以包含很多行;
  • Cell:每一行包含很多单元格。

WorkBook,Sheet,Row 都是继承自 Iterator,就是各种遍历、迭代。

Alt

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>

posted on 2023-03-17 10:08  疯狂的妞妞  阅读(394)  评论(0编辑  收藏  举报

导航