我尝试构建一个从Oracle到xlsx的报告,但我的服务器冻结了。我这样做:
int i = 0;
while (resultSet.next()) {
//Create a new row in current sheet
Row row = sheet.createRow(i);
//Create a new cell in current row
row.createCell(0).setCellValue(resultSet.getInt(1));
row.createCell(1).setCellValue(resultSet.getString(2));
row.createCell(2).setCellValue(resultSet.getString(3));
row.createCell(3).setCellValue(resultSet.getLong(4));
row.createCell(4).setCellValue(resultSet.getString(5));
row.createCell(5).setCellValue(resultSet.getString(6));
row.createCell(6).setCellValue(resultSet.getString(7));
row.createCell(7).setCellValue(resultSet.getString(8));
row.createCell(8).setCellValue(resultSet.getString(9));
row.createCell(9).setCellValue(resultSet.getString(10));
row.createCell(10).setCellValue(resultSet.getString(11));
row.createCell(11).setCellValue(resultSet.getLong(12));
i++;
}
FileOutputStream out = new FileOutputStream(new File("C:\\new.xls"));
wb.write(out);
out.close();
resultSet.close();
sqlStatment.close();
sqlConnection.close();
我的resultSet
有大约500 000行。我没有错。如何正确构建包含多行的xlsx文件?
答案 0 :(得分:4)
你的问题是由Apache-POI(像大多数API)试图在内存中构建xls文件引起的。要解决此问题,您有两种选择:
SXSSF。这是使用Apache POI库构建的流式解决方案。它的工作方式与您现有的相似,但可以将额外的内容刷新到磁盘,并且可以让您轻松处理大文件。
或者您可以只写CSV文件。这样您就可以放弃整个POI库并编写纯CSV文件。这些可以使用标准Java代码(或者如果您认为需要时使用CSS库)逐行编写,然后在该报告的用户需要时转换为XLSX。 Excel现在没有太多的喧嚣打开CSV文件。