当前位置: 首页 > news >正文

Java 导出大数据到 Excel 表格

背景

之前的项目一直是用XSSFWorkbook来做 Excel 导出,在遇到大数据导出时,经常会遇到 OOM。在 Apache Poi 3.8 之后的版本提供的 SXSSFWorkbook 可以优雅的解决这个问题。

原理

SXSSFWorkbook 被称为流式 API,主要是因为它采用了流式写入(streaming write)机制,能够有效地处理大数据量的 Excel 文件,而不会导致内存溢出(OOM)。以下是它的工作原理和特点:

  1. 流式写入机制
    SXSSFWorkbook 是 Apache POI 提供的一种用于处理大数据量的 Excel 文件格式(XLSX)的 API。它的核心思想是:

只保留部分数据在内存中:SXSSFWorkbook 不会将所有数据一次性加载到内存中,而是通过滑动窗口的方式,只保留当前处理的行数据在内存中。

将数据写入临时文件:当内存中的数据达到一定量时,SXSSFWorkbook 会将数据写入磁盘上的临时文件,从而释放内存。

按需加载:在写入完成后,SXSSFWorkbook 会将临时文件中的数据合并到最终的 Excel 文件中。

这种机制类似于流式处理(streaming),数据像水流一样逐步处理,而不是一次性加载到内存中。

  1. 与 XSSFWorkbook 的区别
    XSSFWorkbook:

适用于小数据量。

将所有数据加载到内存中,生成一个完整的 Excel 文件。

当数据量很大时,容易导致内存溢出(OOM)。

SXSSFWorkbook:

适用于大数据量。

只保留部分数据在内存中,其余数据写入临时文件。

通过流式写入机制,避免内存溢出。

  1. 滑动窗口机制
    SXSSFWorkbook 使用滑动窗口(sliding window)来控制内存中的数据量:

你可以通过构造函数设置窗口大小(即内存中保留的行数)。

SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 内存中最多保留 100 行

当写入的行数超过窗口大小时,最早的行会被写入临时文件,并从内存中移除。

这种方式确保了内存占用始终在一个可控的范围内。
4. 临时文件管理
SXSSFWorkbook 在写入过程中会生成临时文件(通常存储在磁盘上)。

写入完成后,可以通过 workbook.dispose() 清理这些临时文件。

临时文件的存在是流式写入的关键,它允许将数据分批写入磁盘,而不是一次性加载到内存中。

  1. 流式写入的优势
    低内存占用:由于数据是逐步写入磁盘的,内存占用非常低,适合处理大数据量。

支持大数据量:可以轻松处理几十万甚至上百万行的数据。

灵活性:通过调整窗口大小,可以平衡内存占用和性能。

代码示例

import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFRow;
import java.io.FileOutputStream;
import java.io.IOException;

public class SXSSFExample {
    public static void main(String[] args) throws IOException {
        // 创建 SXSSFWorkbook,设置窗口大小为 100 行
        SXSSFWorkbook workbook = new SXSSFWorkbook(100);
        SXSSFSheet sheet = workbook.createSheet("Data");

        // 写入 1000 行数据
        for (int i = 0; i < 1000; i++) {
            SXSSFRow row = sheet.createRow(i);
            row.createCell(0).setCellValue("Row " + i);
            row.createCell(1).setCellValue("Data " + i);
        }
        // 写入到文件
        try (FileOutputStream out = new FileOutputStream("large_data.xlsx")) {
            workbook.write(out);
        }
        // 清理临时文件
        workbook.dispose();
    }
}

其他补充

SXSSFWorkbook 是 Apache POI 提供的用于处理大数据量的 Excel 文件(XLSX 格式)的工具。它的行数上限主要受以下两个因素的限制:

  1. Excel 文件格式的限制
    SXSSFWorkbook 生成的 Excel 文件是基于 Office Open XML (OOXML) 格式的,也就是 .xlsx 文件。这种格式的行数上限是:

最大行数:1,048,576 行(即 2^20 行)。

最大列数:16,384 列(即 2^14 列,列标签为 XFD)。

这是 Excel 本身的限制,与 SXSSFWorkbook 无关。如果你尝试写入超过 1,048,576 行,Excel 会直接报错。

  1. 内存和磁盘的限制
    SXSSFWorkbook 通过流式写入机制将数据写入临时文件,因此它的行数上限还受到以下因素的限制:

磁盘空间:SXSSFWorkbook 会将超出内存窗口大小的数据写入临时文件。如果数据量非常大,临时文件可能会占用大量磁盘空间。

JVM 内存:虽然 SXSSFWorkbook 通过流式写入减少了内存占用,但如果单行数据非常大(例如包含大量列或复杂格式),仍然可能导致内存不足。

操作系统限制:操作系统对单个文件的大小和打开文件数也有限制。

  1. 实际使用中的建议
    行数接近上限时:如果需要写入接近 1,048,576 行的数据,建议将数据拆分到多个工作表中。

优化内存使用:

设置合理的窗口大小(例如 new SXSSFWorkbook(100)),以平衡内存和性能。

避免在单行中存储过多数据或使用复杂格式。

监控磁盘空间:确保磁盘有足够的空间存储临时文件。

相关文章:

  • DeepSeek group-limited expert routing和负载均衡
  • Secret Cow Code S
  • PS内发光、外发光
  • 关于读写锁:有个线程在读,能写吗?有个线程在写,能读吗?
  • python 同一行显示多条语句
  • 探秘Transformer系列之(9)--- 位置编码分类
  • Java 大视界 -- 基于 Java 的大数据分布式任务调度系统设计与实现(117)
  • Hexo常用指令大全
  • 递归—基础算法
  • 【Java数据结构】前K个高频单词
  • Linux - 网络基础(应用层,传输层)
  • 详细解析MFC第一个桌面应用程序
  • 零基础C语言学习日志23(动态内存管理)
  • Windows下安装VMware Workstation 17并设置支持MacOS
  • 基于单片机的室外休闲智能座椅设计(论文+源码)
  • 第4章 Function 语意学2: Virtual Member Functions
  • merge函数
  • 大模型架构记录2
  • 阿里云 ESA 游戏行业解决方案|安全防护、加速、低延时的技术融合
  • 2025.3.9机器学习笔记:文献阅读
  • 一箭六星,朱雀二号改进型遥二运载火箭发射成功
  • 辽宁援疆前指总指挥王敬华已任新疆塔城地委副书记
  • 朝鲜称将在各领域采取反制措施,应对美国敌对挑衅
  • 英德宣布开发射程超2000公里导弹,以防务合作加强安全、促进经济
  • 腾讯一季度净利增14%:AI直接拉动广告收入增长,王者荣耀流水创新高
  • 特朗普中东行:“能源换科技”背后的权力博弈|907编辑部