在Apache POI 中,XSSFWorkbook 与 SXSSFWorkbook 的区别
在 Apache POI 中,XSSFWorkbook 和 SXSSFWorkbook 都是用于处理 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();
}

浙公网安备 33010602011771号