【发布时间】:2015-04-23 10:10:39
【问题描述】:
我需要使用 Apache POI 将 600-700k 记录写入 xlsx 文件。 我目前使用的代码是:
public void writeRecords(ResultSet rs) {
try{
SXSSFWorkbook wb = new SXSSFWorkbook();
wb.setCompressTempFiles(true);
SXSSFSheet sh = (SXSSFSheet)wb.createSheet("Sheet 1");
Row row = null;
int numColumns = rs.getMetaData().getColumnCount();
// Workbook wb = ExcelFileUtil.createExcelWorkBook(true, 5);
sh.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk
Row heading = sh.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()) {
row = sh.createRow(rowNumber);
for(int y = 0; y < numColumns; y++) {
row.createCell(y+1).setCellValue(rs.getString(y+1));
// wb.write(bos);
}
rowNumber++;
}
FileOutputStream out = new FileOutputStream("C:/Users/test1.xlsx");
wb.write(out);
out.close();
}
catch (Exception e){
e.printStackTrace();
}
它运行良好,但写入约 65k 条记录需要约 50 分钟。 在 5-6 分钟内获取了 65k 条记录的结果集。
有什么方法可以在大约 10-15 分钟内写出 600,000-700,000 条记录 使用 POI。 我们将无法将数据导出为 CSV 格式,因为最终用户已设置为仅导入 xlsx 文件。 问候, 图沙尔
【问题讨论】:
-
你怎么知道 ResultSet 是在 7 秒内获取的?在上面的代码中,您在写入行时仍在获取。
-
另外,当您向其中扔一个包含 700k 行的电子表格时,Excel 的行为如何?那个文件有多大?
-
我在前后记录了时间戳:ps = con.prepareStatement("select * from table_1 where rownum
-
executeQuery不包括获取数据。当您致电next()时会发生这种情况 -
SXSSFWorkbook的默认窗口大小为 100。您应该将此值与rs.next()获取的行数相匹配,正如 Cristobal 在他的回答中提到的那样,以提高总时间,因为 GC 可能能够在获取数据时清理行。
标签: java oracle apache-poi resultset xlsx