使用 POI 将大型结果集写入 Excel 文件
2022-09-01 02:00:35
这是一种内联,将一个大的结果集写入文件,但有问题的文件是一个Excel文件。
我正在使用Apache POI库编写一个Excel文件,其中包含从ResultSet对象检索到的大型数据集。数据范围可以从几千条记录到大约100万条记录;不确定这如何转换为Excel格式的文件系统字节。
以下是我编写的测试代码,用于检查编写如此大的结果集所花费的时间,以及 w.r.t CPU & Memory 的性能影响。
protected void writeResultsetToExcelFile(ResultSet rs, int numSheets, String fileNameAndPath) throws Exception {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileNameAndPath));
int numColumns = rs.getMetaData().getColumnCount();
Workbook wb = ExcelFileUtil.createExcelWorkBook(true, numSheets);
Row heading = wb.getSheetAt(0).createRow(1);
ResultSetMetaData rsmd = rs.getMetaData();
for(int x = 0; x < numColumns; x++) {
Cell cell = heading.createCell(x+1);
cell.setCellValue(rsmd.getColumnLabel(x+1));
}
int rowNumber = 2;
int sheetNumber = 0;
while(rs.next()) {
if(rowNumber == 65001) {
log("Sheet " + sheetNumber + "written; moving onto to sheet " + (sheetNumber + 1));
sheetNumber++;
rowNumber = 2;
}
Row row = wb.getSheetAt(sheetNumber).createRow(rowNumber);
for(int y = 0; y < numColumns; y++) {
row.createCell(y+1).setCellValue(rs.getString(y+1));
wb.write(bos);
}
rowNumber++;
}
//wb.write(bos);
bos.close();
}
上面的代码没有太多的运气。创建的文件似乎增长迅速(每秒约70Mb)。因此,我在大约10分钟后停止了执行(当文件达到7Gb时终止了JVM),并尝试在Excel 2007中打开该文件。当我打开它的那一刻,文件大小变为8k(!),只创建标题和第一行。不知道我在这里错过了什么。
有什么想法吗?