我需要使用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();
}
工作正常,但需要约50分钟才能写出约65,000条记录。 65k记录的结果集在5-6分钟内获取。
有没有什么办法可以在大约10-15分钟内写出600,000-700,000条记录 使用POI。 我们无法将数据导出为CSV格式,因为最终用户只能导入xlsx文件。 问候, 图莎尔
答案 0 :(得分:3)
检查PreparedStatement的fetchSize。如果未明确设置,则与表格的实际情况相比,该值可能非常小,并且对中等大量数据的查询速度会受到非常的影响。
Check this question了解更多信息。
另外,请考虑是否有必要使用setCompressTempFiles
或SXSSFWorkbook
。如果需要,行保留在内存中的值将以直接比例的方式影响性能。
答案 1 :(得分:0)
如果您的写入文件输出形式为sqlplus,那将会非常快。
在mycsv.sql下面创建文件:
SET DEFINE OFF
SET ECHO OFF
SET SERVEROUTPUT OFF
SET TERMOUT OFF
SET VERIFY OFF
SET FEEDBACK OFF
SET PAGESIZE 10000
SET ARRAYSIZE 5000
REM SET HEAD OFF
SET LINE 500
spool /tmp/mycsvfile.csv;
select * from MY_table;
spool off;
exit;
从Linux提示符可以像
一样运行$> sqlplus username/password @/tmp/mycsv.sql