Generar Hojas de Excel al vuelo con POI
Para generar una hoja de Excel desde una página web, podemos utilizar el truco de generar una tabla HTML y decirle al
navegador que el ContentType de la página que estamos creando es del tipo application/vnd.ms-excel.
Esto nos resuelve casi el 99% de las generaciones de hojas de calculos.
En algunos proyectos he tenido que generar hojas de cálculos al vuelo, en un formato mucho más presentable, ya
que la anterior solución no nos permite mucha capacidad de maniobra, en cuanto a estilos y formato de presentación de las mismas.
Una de las soluciones que encontré a este problema fue la librería POI. Para poder utilizarla será
necesario descargarse los Jars correspondientes desde la web de Apache POI.
Cada fichero de una hoja de cálculo representa un LIBRO. En un LIBRO podemos tener varias HOJAS,
dentro de cada HOJA tener varias FILAS, y, finalmente, en cada FILA varias CELDAS.
Es posible generar una hoja de calculo desde cero, y escribirla a un fichero. En mi caso lo que haré será
partir de una hoja de cálculo ya generada (guardada en mi sistema de ficheros), rellenarla con información desde
la base de datos.
Voy a generar una hoja de cálculo con información de varias empresas en JSP.
En primer lugar necesito generar un LIBRO a partir de una hoja de cálculo existente y obtener una hoja donde empezar a trabajar:
*Obtenemos mi plantilla*/> POIFSFileSystem df = new POIFSFileSystem(new FileInputStream("C:\\www\\informes\\listadoEmpresas.xls")); /*Generamos un libro de trabajo a partir de mi plantilla*/ HSSFWorkbook libroTrabajo = new HSSFWorkbook(df); /*Obtenemos la primera hoja del libro de trabajo*/ HSSFSheet hoja = libroTrabajo.getSheetAt(0);
Una vez que tenemos la hoja donde empezar a trabajar, procederemos a rellenarla con los datos de las empresas obtenidos.
Crearé una fila por cada una de ellas, y tantas celdas como datos tenga.
int i=0; /*Recorro el cursor de empresas*/ while (resultado!=null && resultado.next()){ /*Obtengo una fila de la hoja*/ HSSFRow fila = hoja.getRow(i); /*Si la hoja no tiene esa fila, la creo*/ if (fila == null) fila = hoja.createRow((short)i); /*Obtengo una celda de la fila*/ HSSFCell celda = fila.getCell((short)0); /*Si no existe la creo*/ if (celda == null) celda = fila.createCell((short)0); /*Indico el tipo de la fila, en este caso numerico*/ /*Existen más tipos, HSSFCell.CELL_TYPE_STRING...*/ celda.setCellType(HSSFCell.CELL_TYPE_NUMERIC); /*Introduzco un valor en la celda*/ celda.setCellValue(resultado.getString("identificador")); ...
Ya tenemos casi todo hecho. Solamente nos queda cerrar la hoja de cálculo:
libroTrabajo.write(response.getOutputStream());
Aquí os podeis descargar el código completo.