xssfworkbook write poi ooxml librería descargar create java excel apache-poi

poi - write excel java



Rendimiento POI (5)

Estoy usando POI en mi aplicación web J2EE para generar un libro de trabajo. Sin embargo, encuentro que el POI tarda unos 3 minutos en crear un libro de trabajo con 25K filas (con alrededor de 15 columnas cada una). ¿Se trata de un problema de rendimiento de PDI o está justificado tomar mucho tiempo? ¿Existen otras API conocidas por un mejor rendimiento?


El rendimiento de la escritura de archivos grandes con POI puede reducirse considerablemente si usó la API de POI de ''transmisión'' en lugar de la estándar. De hecho, de forma predeterminada, POI mantendrá todos sus datos en la memoria antes de escribirlos todos de una vez al final. La huella de memoria de esto puede ser ridículamente grande para archivos grandes. En lugar de usar la API de transmisión, puede controlar cómo se usa la memoria y los datos se escriben en el disco progresivamente.

Para crear un libro de trabajo de transmisión, use algo como:

SXSSFWorkbook book = new SXSSFWorkbook(); book.setCompressTempFiles(true); SXSSFSheet sheet = (SXSSFSheet) book.createSheet(); sheet.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk // ...


He comparado Apache POI con la biblioteca JExcel. Parece que JExcel es aproximadamente 4 veces más rápido que el API de Apache, pero el consumo de memoria parece ser más o menos el mismo:

@Test public void createJExcelWorkbook() throws Exception { WritableWorkbook workbook = Workbook.createWorkbook(new File("jexcel_workbook.xls")); WritableSheet sheet = workbook.createSheet("sheet", 0); for ( int i=0; i < 65535; i++) { for ( int j=0; j < 10; j++) { Label label = new Label(j, i, "some text " + i + " " + j); sheet.addCell(label); } } workbook.write(); workbook.close(); } @Test public void createPoiWorkbook() throws Exception { Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("sheet"); for ( int i=0; i < 65535; i++) { Row row = sheet.createRow(i); for ( int j=0; j < 10; j++) { Cell cell = row.createCell(j); cell.setCellValue("some text " + i + " " + j); } } FileOutputStream fileOut = new FileOutputStream("poi_workbook.xls"); wb.write(fileOut); fileOut.close(); }

Lo he probado con JExcel versión 2.6.12 y Apache POI versión 3.7. Necesita descargar las últimas versiones de la biblioteca y ejecutar las pruebas simples que se indican arriba para obtener números más precisos.

<dependency org="org.apache.poi" name="poi" rev="3.7"/> <dependency org="net.sourceforge.jexcelapi" name="jxl" rev="2.6.12"/>

Nota: hay un límite en Apache POI de 65535 filas por hoja.


Me sorprendería mucho ver que POI se toma tanto tiempo para generar dicho archivo. Acabo de generar una hoja con 30000 filas x 10 celdas en aproximadamente 18 s (sin formato, para ser justos). La causa puede ser una de las siguientes:

  • El registro de PDI puede estar activado, como se describe here
  • estas corriendo desde la memoria de intercambio
  • su montón de VM disponible puede ser muy bajo

Si ninguna de las otras respuestas funciona, vea si el JExcel de Andy Khan será mejor. He encontrado que es muy superior a POI para tratar con Excel en Java.


También utilizamos POI en nuestra aplicación web y no tenemos ningún problema de rendimiento, aunque nuestros documentos generados son mucho más pequeños que los suyos. Primero comprobaría si el POI es el verdadero problema aquí. Intente generar esos documentos sin la sobrecarga de J2EE (Unit-Test) y mida el rendimiento. También puede monitorear la carga y el uso de la memoria en su servidor J2EE para ver si los problemas provienen de algunas configuraciones de sistema subóptimas.