Estoy buscando escribir en un archivo excel (formato .xls MS Excel 2003) programáticamente usando Java. Los archivos de salida de Excel pueden contener ~ 200,000 filas que planeo dividir en una cantidad de hojas (64k filas por hoja, debido al límite de Excel).API para escribir enormes archivos de Excel usando java
He intentado utilizar las API POI de apache, pero parece ser un problema de memoria debido al modelo de objetos API. Me veo obligado a agregar celdas/hojas al objeto libro de trabajo en la memoria y solo una vez que se agregan todos los datos, puedo escribir el libro en un archivo. Este es un ejemplo de cómo recomienda el apache i escribir archivos Excel utilizando su API:
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
//Create a row and put some cells in it
Row row = sheet.createRow((short)0);
// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
Claramente, la escritura ~ filas 20k (con unos 10-20 columnas en cada fila) me da la "java.lang temida. OutOfMemoryError: espacio de pila Java ".
He intentado aumentar el volumen inicial JVM y el tamaño máximo de almacenamiento dinámico utilizando los parámetros Xms y Xmx como Xms512m y Xmx1024. Todavía no puedo escribir más de 150k filas en el archivo.
Estoy buscando una manera de transmitir a un archivo de Excel en lugar de construir todo el archivo en la memoria antes de escribirlo en el disco, lo que con suerte ahorrará mucho uso de memoria. Cualquier API o solución alternativa sería apreciada, pero estoy restringido al uso de Java. ¡Gracias! :)
Puedes echar un vistazo a: http://stackoverflow.com/questions/6004379/java-write-excel-files-with-poi-event-model – ParagJ
¿Solo 1024m? Prueba 4086 (4 gigas). Ejecutamos 8 gig vms en el trabajo a veces). Las hojas de cálculo están diseñadas de esa manera, ¿pueden incluso funcionar solo en una parte de una hoja de cálculo a la vez? –