Scrivere un set di risultati di grandi dimensioni in un file Excel utilizzando POI

Questo è un po ‘in linea con la scrittura di un ampio ResultSet su un file, ma il file in questione è un file Excel.

Sto utilizzando la libreria POI di Apache per scrivere un file Excel con un set di dati di grandi dimensioni recuperato da un object ResultSet. I dati potrebbero variare da poche migliaia di record a circa 1 milione; non so come questo si traduce in byte del file system in formato Excel.

Quello che segue è un codice di prova che ho scritto per verificare il tempo impiegato per scrivere un set di risultati così ampio e anche l’implicazione delle prestazioni di CPU e memoria.

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(); } 

Non ho molta fortuna con il codice sopra. Il file che viene creato sembra crescere rapidamente (~ 70 Mb al secondo). Così ho interrotto l’esecuzione dopo circa 10 minuti (ho ucciso la JVM quando il file raggiunge 7Gb) e ho provato ad aprire il file in Excel 2007. Nel momento in cui lo apro, la dimensione del file diventa 8k (!) E solo l’intestazione e la prima fila sono creati. Non sono sicuro di cosa mi manchi qui.

Qualche idea?