简介
SXSSFWorkbook
是Apache POI库中的一个类,主要用于处理大容量的Excel文件。专为处理.xlsx格式的Excel文件设计,即Office Open XML(OOXML)格式。它不适用于旧的.xls(BIFF8 BIFF记录格式)文件。如果你需要处理大容量的.xls文件,Apache POI库中并没有直接对应的内存优化解决方案,但可以通过分块读写数据的方式实现类似效果。对于xlsx文件的大数据量操作,使用SXSSFWorkbook
是最佳实践。
相比于传统的XSSFWorkbook
(用于操作XLSX格式的文件),SXSSFWorkbook
在内存使用上做了优化,SXSSFWorkbook
通过维护一个有限大小的工作表缓存(默认100行)来减少内存消耗。当缓存满时,它会将最旧的行数据写入硬盘并从内存中移除,从而使得程序能够在处理大数据量时避免内存溢出的问题。
1.导出数据到EXCEL
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class SXSSFExcelExporter {
public void exportToExcel(List dataList, String outputPath) throws IOException {
// 创建一个SXSSFWorkbook对象,参数100表示缓存的最大行数
SXSSFWorkbook workbook = new SXSSFWorkbook(100);
// 创建一个新的工作表
Sheet sheet = workbook.createSheet("Data Sheet");
// 创建表头样式(可选)
CellStyle headerCellStyle = createHeaderCellStyle(workbook);
// 写入表头数据
Row headerRow = sheet.createRow(0);
for (int i = 0; i values;
// getter 方法...
public List getValues() {
return values;
}
}
public static void main(String[] args) throws IOException {
// 假设已经有了一个数据列表
List dataList = ...;
String outputPath = "output.xlsx";
SXSSFExcelExporter exporter = new SXSSFExcelExporter();
exporter.exportToExcel(dataList, outputPath);
}
}
在上述代码中,首先创建了一个 SXSSFWorkbook
实例,并设置了一个适当的行缓存大小。接着,创建一个工作表并在其中添加表头和数据行。最后,将生成的工作簿内容写入指定路径的 .xlsx 文件中。
为了确保高效处理大数据集,请确保将实际数据源分批次读取或查询,并在每次处理完一批数据后调用 SXSSFWorkbook
的 flush()
或 dispose()
方法来释放已写出到磁盘的行所占用的内存。
2.读取EXCEL数据
SXSSFWorkbook
不仅可以用来导出数据,也可以用于读取和修改Excel文件中的数据。虽然它最常被提及的用途是处理大数据量时高效地将数据写入.xlsx格式的Excel文件中,但该类同样提供了对工作簿、工作表以及单元格级别的操作接口,因此你可以使用它来:
- 创建新的Excel文件并填充数据(导出)。
- 打开现有的.xlsx文件,并逐行或分批次读取数据。
- 修改已有的.xlsx文件内容,比如更新特定行或列的数据。
- 删除或添加新的工作表到工作簿中。
由于其设计初衷是为了优化内存使用,所以在读取大文件时,SXSSF
模式不会一次性加载整个文件到内存中,而是按需加载部分数据,这对于读取或修改大型数据集非常有用。不过,在进行大量读写操作时,需要注意其内部的行缓存策略可能会导致较旧的数据从内存中移除并被写入硬盘临时存储区域。
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class SXSSFExcelReader {
public void readExcel(String filePath) throws IOException {
// 创建文件输入流
FileInputStream fis = new FileInputStream(new File(filePath));
// 创建 SXSSFWorkbook 对象
SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 参数指定行缓存大小,这里是100行
try {
// 获取第一个工作表
XSSFSheet sheet = workbook.getXSSFSheetAt(0);
// 读取数据
for (Row row : sheet) {
for (Cell cell : row) {
String cellValue = "";
switch (cell.getCellType()) {
case STRING:
cellValue = cell.getStringCellValue();
break;
case NUMERIC:
cellValue = String.valueOf(cell.getNumericCellValue());
break;
// 处理其他类型(BOOLEAN, FORMULA, BLANK, ERROR等)
// ...
}
System.out.print(cellValue + "\t");
}
System.out.println();
}
} finally {
// 关闭 SXSSFWorkbook 以释放资源
workbook.close();
fis.close();
}
}
}
这段代码首先创建一个 SXSSFWorkbook
实例,并通过文件路径打开.xlsx文件。然后,它获取工作簿中的第一个工作表,并逐行、逐单元格地读取内容。
请注意,在实际应用中,您可能需要根据单元格的类型适当地处理每个单元格的内容,上面的示例仅演示了字符串和数值类型的简单处理方式。此外,如果文件中有多张工作表,您可以通过 getSheetAt(int index)
或 getSheet(String name)
方法访问不同索引或名称的工作表。