性能:使用Java,Apache-POI将oracle ResultSet写入XLSX

时间:2015-04-23 10:10:40

标签: java oracle apache-poi resultset xlsx

我需要使用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文件。 问候, 图莎尔

2 个答案:

答案 0 :(得分:3)

检查PreparedStatement的fetchSize。如果未明确设置,则与表格的实际情况相比,该值可能非常小,并且对中等大量数据的查询速度会受到非常的影响。

Check this question了解更多信息。

另外,请考虑是否有必要使用setCompressTempFilesSXSSFWorkbook。如果需要,行保留在内存中的值将以直接比例的方式影响性能。

答案 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