Apache POI: Extracción a Excel desde Java

En la mayoria de aplicaciones del sector Tic, los usuarios suelen pedirnos funciones de exportación a Excel, Pdf …

En Java, tenemos disponible el proyecto «The Apache POI Project» (Apache POI) que nos permite generar documentos Office .

apache poi

Vamos a ver la forma de trabajar con Apache POI en un proyecto Java  para exportaciones Excel

Librerías necesarias Apache POI

La última versión estable a fecha de hoy, es la versión 3.11. Podéis descargar la librería de la página de Apache POI o añadir las dependencias con Maven

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.11</version>
</dependency>

Para exportar el fichero en formato .xlsx  es necesario añadir alguna dependencia mas ( poi-ooxml, xmlbeans, dom4j)


<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.9</version>
</dependency>

<dependency>
   <groupId>org.apache.xmlbeans</groupId>
   <artifactId>xmlbeans</artifactId>
   <version>2.6.0</version>
</dependency>

<dependency>
   <groupId>dom4j</groupId>
   <artifactId>dom4j</artifactId>
   <version>1.6.1</version>
</dependency>

Tipos de clases Apache POI

Antes de explicar cómo funciona Apache POI, vamos a ver los distintos tipos de objetos que nos trae POI para generar nuestro documento Excel ya que hay bastante variedad

 HSSFWorkbook  –  org.apache.poi.hssf.usermodel.HSSFWorkbook

Nos va a permitir trabajar con ficheros Excel en formato .xls

XSSFWorkbook  – org.apache.poi.xssf.usermodel.XSSFWorkbook

Nos va a permitir trabajar con ficheros Excel en formato .xlsx

SXSSFWorkbook – org.apache.poi.xssf.streaming.SXSSFWorkbook

Nos va a permitir trabajar con ficheros Excel en formato .xlsx con un uso de memoria eficiente. Muy útil si el documento que vas a generar es de un tamaño excesivo

 

Lectura de un documento Excel en formato .xls usando HSSFWorkbook

HSSFWorkbook workbook = new HSSFWorkbook(fichero);
//Acceso a la primera hoja del documento
HSSFSheet hoja = workbook.getSheetAt(0);
List<String> data = new ArrayList<String>();

//Recorremos las filas del documento
Iterator rows = sheet.rowIterator();
while (rows.hasNext()) {
   HSSFRow row = (HSSFRow) rows.next();
   Iterator cells = row.cellIterator();
   while (cells.hasNext()) {
      HSSFCell cell = (HSSFCell) cells.next();
      if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
         data.add(cell.getRichStringCellValue().getString());
      }
   }
} 

Escritura de un documento Excel en formato .xlsx usando XSSFWorkbook

//Generamos el documento
XSSFWorkbook workBook = new XSSFWorkbook();
//Creamos una hoja en el documento
XSSFSheet sheet = workBook.createSheet();
//Generamos un par de filas
for (int r=0;r < 2; r++ ){
   XSSFRow row = sheet.createRow(r);
   //Generamos un par de celdas
   for (int c=0;c < 2; c++ ){
      XSSFCell cell = row.createCell(c);
      cell.setCellValue("Inserto en la celda " + c);
   }
}
 //Escribimos el resultado en fichero
String nombreFichero = "C:/ejemploCantabriaTic.xlsx"
File file = new File(nombreFichero);
FileOutputStream fileOut = new FileOutputStream(file);

wb.write(fileOut);
fileOut.flush();
fileOut.close(); 

SXSSFWorkbook para documentos de gran tamaño

La forma de uso de esta clase es muy similar a los ejemplos anteriores de lectura y escritura.
La gracia de SXSSFWorkbook, es el tratamiento que hace de memoria con respecto a HSSFWorkbook y XSSFWorkbook.
HSSFWorkbook y XSSFWorkbook mantienen en memoria los datos hasta que se escriben a ficheo. Sin embargo, SXSSFWorkbook permite configurar esta gestión de memoria en su constructor y evitar los temidos HeapSpeace de java que tan poca gracia nos hacen.

Imaginaos que tenemos que enviar a un fichero Excel la salida de una consulta con mas de 10000 registros.
Podemos mantener nuestros registros en memoria hasta sobrepasar un limite, en ese momento mandamos los datos al fichero y liberamos memoria para el siguiente paquete de 300 registros.
Así de fácil:

//Configuramos el limite de registros a mantener en memoria
int limite= 300;
//Aplicamos el limite al constructor
Workbook wb = new SXSSFWorkbook(limite);
Sheet hoja = wb.createSheet();
for(int r = 0; r < lista.size; r++){
   Row row = hoja.createRow(rownum);
   for(int c = 0; c < 10; c++){
      Cell cell = r.createCell(c);
   }
}

File file = new File("C:/ejemploSXSSFWorkbook.xlsx");
FileOutputStream out = new FileOutputStream(file);
wb.write(out);
out.close();
}

En mi experiencia personal con una extracción grande de datos, usar SXSSFWorkbook me supuso reducir los tiempos de 6-7 minutos a menos de 1 minuto.

Post By Rocio Muñoz (37 Posts)

Ingeniera Informatica. Dicen que todos los niños nacen con un pan debajo del brazo ... Yo creo que llevaba un ordenador. Trabajo como programadora en Cic en entornos Java. Apasionada del mundo web y la innovacion social.

Connect

10 Responses to “Apache POI: Extracción a Excel desde Java”