在Apache POI 中,XSSFWorkbook 与 SXSSFWorkbook 的区别

在 Apache POI 中,XSSFWorkbookSXSSFWorkbook 都是用于处理 Excel 文件(.xlsx 格式)的类。

1. XSSFWorkbook(全内存模式)

  • 原理:将整个 Excel 文件加载到内存中处理。
  • 优点
    • 支持完整功能:公式计算、样式修改、图表操作等。
    • 适合小文件(通常小于 100MB)。
  • 缺点:内存占用高,大文件可能导致 OutOfMemoryError
// 从前端接收 MultipartFile(Spring框架示例)
MultipartFile file = ...; // 前端上传的文件
try (InputStream is = file.getInputStream()) {
    XSSFWorkbook workbook = new XSSFWorkbook(is); // 全内存加载
    // 读取数据(例如第一个Sheet)
    XSSFSheet sheet = workbook.getSheetAt(0);
    for (Row row : sheet) {
        for (Cell cell : row) {
            String value = cell.getStringCellValue();
            // 处理单元格数据...
        }
    }
}

2. SXSSFWorkbook(流式处理)

  • 原理:基于滑动窗口(Window)机制,仅将部分数据保留在内存中,其余写入临时磁盘文件。
  • 优点
    • 内存占用极低,可处理超大型文件(GB 级别)。
    • 通过 rowAccessWindowSize 控制内存中的行数。
  • 缺点
    • 功能受限:不支持公式计算、模板操作、样式修改等。
    • 数据只读:已写入磁盘的行不可回退访问。
  • 适用场景:仅需顺序读取/写入数据的超大文件。
MultipartFile file = ...; // 前端上传的文件
try (InputStream is = file.getInputStream()) {
    // 先用 XSSFWorkbook 解析输入流
    XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
    // 转为 SXSSFWorkbook(指定窗口大小)
    SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook, 100); // 内存保留100行
    SXSSFSheet sheet = workbook.getSheetAt(0);
    
    // 逐行流式读取
    Iterator<Row> rowIterator = sheet.iterator();
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        Iterator<Cell> cellIterator = row.cellIterator();
        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            String value = cell.getStringCellValue();
            // 处理单元格数据...
        }
        // 清理内存:处理完的行从窗口移除
        ((SXSSFRow) row).flush();
    }
    // 清理临时文件
    workbook.dispose();
}
posted @ 2025-07-12 11:55  Ritchie^._.^  阅读(763)  评论(0)    收藏  举报