Apache POI的Workbook的几种实现类及具体区别解析

 更新时间:2026年07月06日 15:44:05   作者:五月天的尾巴  
在java项目中,我们经常使用Apache POI的包导出Excel文件,但是在创建Workbook的时候,有三种选型HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook可以选择,本文总结一下这三个实现类的区别,感兴趣的朋友一起看看吧

一、前言

在java项目中,我们经常使用Apache POI的包导出Excel文件,但是在创建Workbook的时候,有三种选型HSSFWorkbookXSSFWorkbookSXSSFWorkbook可以选择,本文总结一下这三个实现类的区别。

二、Workbook的三个实现类

在Apache POI中,Workbook接口 代表一个Excel工作簿(即一个Excel文件)。针对不同版本的Excel文件,POI提供了三个主要的实现类:

实现类支持的文件格式对应Excel版本文件扩展名
HSSFWorkbookHSSF (Horrible SpreadSheet Format)Excel 97-2003.xls
XSSFWorkbookXSSF (XML SpreadSheet Format)Excel 2007+.xlsx
SXSSFWorkbook基于XSSF的流式扩展Excel 2007+.xlsx

SXSSFWorkbook‌

  • 也是用于.xlsx格式,但它主要用于处理非常大的电子表格文件,通过在内存中仅保留一定数量的行来优化性能。
  • SXSSFWorkbook非常适合用于生成非常大的电子表格文件,因为它可以减少内存使用。

三个类的API设计高度一致,切换起来非常方便:

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
// 使用HSSFWorkbook创建.xls文件
Workbook workbook = new HSSFWorkbook();
// 使用XSSFWorkbook创建.xlsx文件
Workbook workbook = new XSSFWorkbook();
// 使用SXSSFWorkbook创建.xlsx文件(低内存模式)
Workbook workbook = new SXSSFWorkbook();

三、三个实现类的核心区别

3.1、HSSFWorkbook:老兵不死,但已逐渐凋零

HSSFWorkbook是POI中最古老的实现,对应的是Excel 97-2003版本的二进制格式(.xls)。

主要特点:

  • 行数限制:每个Sheet最多支持65535行,超过会报错
  • 列数限制:最多支持256列
  • 内存模型所有数据全部加载到内存中
  • 性能表现:由于是二进制格式,处理速度反而是三个中最快的

适用场景:

  • 需要兼容老旧系统,必须输出.xls格式
  • 数据量很小(< 6.5万行)
  • 对性能要求极高且数据量可控

3.2、XSSFWorkbook:现代办公的主力军

随着Excel 2007推出新的OpenXML格式(.xlsx),POI推出了XSSFWorkbook来支持这种基于XML的新格式。

主要特点:

  • 行数限制:每个Sheet最多支持1048576行(约104万行)
  • 列数限制:最多支持16384列
  • 内存模型所有数据全部加载到内存中,内存占用是HSSFWorkbook的2-7倍
  • 性能表现:由于XML解析的开销,处理速度最慢,比HSSFWorkbook慢约30倍

适用场景:

  • 需要输出.xlsx格式
  • 数据量中等(几十万行以内)
  • 内存充足,且需要使用完整的Excel功能(样式、公式、图表等)

3.3、SXSSFWorkbook:大数据处理的救星

从POI 3.8版本开始,推出了基于XSSF的流式实现SXSSFWorkbook,专门为了解决大数据量导出时的内存溢出问题。

主要特点:

  • 行数限制:与XSSFWorkbook相同,支持百万行级别
  • 内存模型流式处理默认只在内存中保留100行,超出的行会刷新到磁盘临时文件中
  • 性能表现:介于HSSF和XSSF之间,但内存占用稳定,几乎不随数据量增长

功能限制(重要!):
由于数据被刷新到磁盘,以下功能无法使用

  • autoSizeColumn() - 自动调整列宽
  • cloneSheet() - 克隆工作表
  • 对已刷新行的随机访问(getRow()可能返回null)
  • 公式求值(涉及已刷新行的公式)
  • shiftColumns() - 列位移操作

适用场景:

  • 百万级数据导出
  • 内存受限的环境
  • 不需要上述受限功能(或可以在导出完成后处理)

四、性能数据说话

口说无凭,我们来看一组权威的性能测试数据(来自Baeldung的JMH基准测试):

执行时间对比(单位:毫秒)

行数HSSFWorkbookXSSFWorkbookSXSSFWorkbook
2,500732,658296
10,00034710,9941,808
20,00075421,7333,751
40,0001,45542,3317,342

内存消耗对比(单位:MB)

行数HSSFWorkbookXSSFWorkbookSXSSFWorkbook
2,5008281,871258
10,0001,2684,136209
20,0001,7667,443209
40,0001,47510,119210

从数据中可以清晰看到:

  • XSSFWorkbook是典型的"内存杀手",40k行数据消耗高达10GB内存
  • SXSSFWorkbook的内存占用稳定在210MB左右,优势极其明显
  • HSSFWorkbook虽然速度快,但受限于行数上限,无法处理大规模数据

五、实际开发中的选型建议

5.1、决策树:三步选对Workbook

开始选型
    ↓
是否需要输出.xls格式?
    ├─ 是 → 数据量<6.5万行? → 是 → HSSFWorkbook
    │                        → 否 → 无法满足,考虑分批导出或升级格式
    ↓
是否需要完整的Excel功能(样式、公式、图表等)?
    ├─ 是 → 数据量<10万行且内存充足? → 是 → XSSFWorkbook
    │                              → 否 → 考虑分批写入+ XSSFWorkbook
    ↓
是否需要处理超大数据量(>10万行)?
    ├─ 是 → 能否接受功能限制? → 是 → SXSSFWorkbook
    │                        → 否 → 考虑EasyExcel或分批导出
    ↓
默认选择 → XSSFWorkbook(常规场景)

5.2、实战经验分享

场景1:常规报表导出(几千到几万行)

// 推荐使用XSSFWorkbook,功能完整,开发简单
try (Workbook workbook = new XSSFWorkbook()) {
    // 正常的样式、公式处理
}

场景2:百万级数据导出,无需复杂样式

// SXSSFWorkbook是最佳选择
SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 设置内存窗口大小为100
try {
    // 分批写入数据
    for (...) {
        Row row = sheet.createRow(...);
        // 填充数据
    }
} finally {
    // 务必清理临时文件
    workbook.dispose();
    workbook.close();
}

场景3:需要复杂样式,但数据量也大
这种情况下可以采取折中方案

  1. 使用XSSFWorkbook创建模板,设置好所有样式
  2. 使用SXSSFWorkbook基于模板填充数据
  3. 或者使用EasyExcel等封装库

六、SXSSFWorkbook使用注意事项

如果选择了SXSSFWorkbook,有几个坑需要特别注意:

6.1、及时清理临时文件

SXSSFWorkbook workbook = new SXSSFWorkbook();
try {
    // 处理数据...
} finally {
    workbook.dispose(); // 删除临时文件
    workbook.close();
}

6.2、避免使用受限功能

// 以下代码会抛出异常
sheet.autoSizeColumn(0); // IllegalStateException
workbook.cloneSheet(0);   // IllegalStateException

6.3、合理设置窗口大小

// 窗口大小设置原则:
// - 越小,内存占用越低,但功能限制影响越大
// - 越大,可用功能越多,但内存占用越高
SXSSFWorkbook workbook = new SXSSFWorkbook(500); // 根据实际需求调整

七、结语

Apache POI的三个Workbook实现类各有千秋,没有绝对的"最好",只有最适合你当前场景的选择。简单总结一下:

  • HSSFWorkbook:老当益壮,但已是过去式
  • XSSFWorkbook:中规中矩,日常开发主力
  • SXSSFWorkbook:黑马选手,大数据场景必备

在实际项目中,建议根据数据量、功能需求、内存限制这三个维度综合评估。如果数据量真的到了百万级别,且功能需求复杂,也可以考虑阿里开源的EasyExcel,它在POI基础上做了进一步的封装和优化,同样值得关注。

希望这篇文章能帮你彻底搞懂POI的Workbook家族,从此不再为Excel导出发愁!

到此这篇关于Apache POI的Workbook的几种实现类及具体区别的文章就介绍到这了,更多相关Apache POI Workbook内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Apache Doris 中Compaction问题分析和典型案例分析

    Apache Doris 中Compaction问题分析和典型案例分析

    这篇文章主要介绍了Apache Doris 中Compaction问题分析和典型案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-08-08
  • Linux中实时查看日志的三种方法

    Linux中实时查看日志的三种方法

    本文介绍了Linux中实时查看日志的三种方法:使用tail命令(结合-f选项和grep进行过滤),利用multitail工具实现多日志文件的拆分视图监控,以及用less命令的+F选项实时跟踪文件变化,这些方法帮助系统管理员更有效地监控和分析日志文件,需要的朋友可以参考下
    2025-02-02
  • Linux服务使用宝塔面板搭建网站并发布公网访问

    Linux服务使用宝塔面板搭建网站并发布公网访问

    宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,本文我们将演示使用宝塔面板快速简单搭建本地web网站,并做内网穿透,实现不在同个局域网下的用户也可以访问到本地web站点,无需公网IP,也不用设置路由器,需要的朋友可以参考下
    2023-08-08
  • 在Linux/WSL2环境下安装和配置Claude Code的全过程

    在Linux/WSL2环境下安装和配置Claude Code的全过程

    这篇文章就带你从0开始,在Linux/WSL2环境下完成安装、API配置到成功启动的Claude Code 全流程,我会用API中转服务简化 国内直连,避免翻 墙和海外账户问题,尽量把每个步骤讲清楚,让你少踩坑,需要的朋友可以参考下
    2026-05-05
  • 使用 bind 设置 DNS 服务器的方法

    使用 bind 设置 DNS 服务器的方法

    Bind9是一个强大的Linux下开放源代码的DNS服务器软件,这篇文章主要介绍了使用 bind 设置 DNS 服务器的方法,需要的朋友可以参考下
    2020-03-03
  • linux apache下虚拟主机配置方法

    linux apache下虚拟主机配置方法

    配置linux下虚拟主机的朋友能用的到,一个备份,感谢作者
    2008-07-07
  • CentOS系统使用yum命令报错问题及解决

    CentOS系统使用yum命令报错问题及解决

    文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家
    2024-12-12
  • Ubuntu忘记密码重置的详细教程

    Ubuntu忘记密码重置的详细教程

    虚拟机装了Ubuntu,太久没有用导致密码忘记了,自己捣鼓了下,成功修改原账户密码,所以本文记录了一下Ubuntu忘记密码重置的详细教程,感兴趣的小伙伴跟着小编一起来看看吧
    2025-03-03
  • Linux、CentOS下安装zip与unzip指令功能(服务器)

    Linux、CentOS下安装zip与unzip指令功能(服务器)

    这篇文章主要介绍了Linux、CentOS下安装zip与unzip指令的操作方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-11-11
  • Linux中实现线程同步的6种方法

    Linux中实现线程同步的6种方法

    本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例代码展示了如何在多线程环境中正确地管理共享资源,确保线程安全,需要的朋友可以参考下
    2024-11-11

最新评论