Hola a todos,
Uno de estos días necesite crear un reporte de Excel con Java. Pero que el resultado de este, fuera un mensaje en el navegador indicándome si deseaba guardarlo o abrirlo, pero me tope con que casi todos los ejemplos que se encuentran en internet, solo muestran como crear un Excel en una ruta especifica ( como C://miCarpeta/ ), pero que hay si lo que quiero es que se cree el Excel y el mismo navegador sea el que me de la opción de abrirlo o guardarlo?
Bueno en este pequeño tutorial describiré a continuación, como realizar un evento en JSF para que como resultado el explorador nos permita abrir o guardar un Excel.
Para esto, ya debes tener claro como crear una pagina con J2EE (java web), también como desplegarla en un servidor de tu preferencia, y el mapeo de Beans.
Para este ejemplo utilizaremos la librería de Apache POI, el cual pueden descargar en la pagina oficial
http://poi.apache.org/download.html
o en otra de su preferencia
(http://www.java2s.com/Code/Jar/p/Downloadpoi39jar.htm).
Bueno, entonces manos a la obra,
Primero: creamos una JSP que puede ser similar a esta, el tema del diseño queda en sus manos :)
Uno de estos días necesite crear un reporte de Excel con Java. Pero que el resultado de este, fuera un mensaje en el navegador indicándome si deseaba guardarlo o abrirlo, pero me tope con que casi todos los ejemplos que se encuentran en internet, solo muestran como crear un Excel en una ruta especifica ( como C://miCarpeta/ ), pero que hay si lo que quiero es que se cree el Excel y el mismo navegador sea el que me de la opción de abrirlo o guardarlo?
Bueno en este pequeño tutorial describiré a continuación, como realizar un evento en JSF para que como resultado el explorador nos permita abrir o guardar un Excel.
Para esto, ya debes tener claro como crear una pagina con J2EE (java web), también como desplegarla en un servidor de tu preferencia, y el mapeo de Beans.
Para este ejemplo utilizaremos la librería de Apache POI, el cual pueden descargar en la pagina oficial
http://poi.apache.org/download.html
o en otra de su preferencia
(http://www.java2s.com/Code/Jar/p/Downloadpoi39jar.htm).
Bueno, entonces manos a la obra,
Primero: creamos una JSP que puede ser similar a esta, el tema del diseño queda en sus manos :)
<table width="100%" style="text-align:center; margin: 0 auto; border:0;" cellpadding="0" cellspacing="0">
<tr>
<td>
<h2> Generar Excel</h2>
</td>
</tr>
<tr>
<td><h:form id="formConsultarUsuarios">
<h:panelGroup style="text-align:center; margin: 0 auto; border:0;">
<h:panelGrid columns="2" id="grillaFiltrosUser" border="0"
style="text-align:left; margin: 0 auto;">
<h:outputLabel id="lblNombres" style="text-align:right" value="Nombre Excel" />
<h:inputText id="nombrePerfil" maxlength="50" value="#{TestBean.nombrePerfil}" />
</h:panelGrid>
<h:panelGrid columns="2" id="grillaBotones2" border="0" style="text-align:left; margin: 0 auto;">
<h:commandButton value="Generar" id="btnGenerarExcel" action="#{TestBean.generarExcel}"
styleClass="linkbutton" />
<h:commandButton value="Limpiar" id="btnCancelar" action="#{TestBean.limpiar}"
styleClass="linkbutton" />
</h:panelGrid>
</h:panelGroup>
</h:form></td>
</tr>
</table>
Nota, no olvides registrar el Bean en el FecesConfig.xml
Segundo: Creamos el Bean llamado “TestBean”.
En este Bean, tendremos 3 arreglos que serán los que recorreremos para pintar la información:
private String[] nombres ={"Nombre 1","Nombre 2","Nombre 3","Nombre 4","Nombre 5"};
private String[] telefonos ={"Telefono 1","Telefono 2","Telefono 3","Telefono 4","Telefono 5"};
private String[] direcciones ={"Direccion 1","Direccion 2","Direccion 3","Direccion 4","Direccion 5"};
después vendrá el llamado al método del Bean, y procederemos a crear el Excel.
Crearemos en el Bean un método llamado "Generar Excel" y en el agregaremos
//Libro Excel
HSSFWorkbook libro = new HSSFWorkbook();
//Hoja Excel
HSSFSheet hoja = libro.createSheet();
// Se crea una fila dentro de la hoja
HSSFRow fila = null;
try
{
//cramos la celda
HSSFCell celda = null;
//Realizamos un ciclo para recorrer los arrelgos privados
for(int i =0; i<this.nombres.length;i++)
{
fila = hoja.createRow(i);
//Nombre
celda = fila.createCell(0);
celda.setCellValue(nombres[i]);
//Telefono
celda = fila.createCell(1);
celda.setCellValue(telefonos[i]);
//dirección
celda = fila.createCell(2);
celda.setCellValue(direcciones[i]);
}
libro.setSheetName(0, getNombreExcel());
La parte de este tutorial mas importante sera que una vez tengamos el objeto del libro de excel, procederemos a obtener el arreglo de byte's que este creo, de la siguiente manera:
byte[] xls = libro.getBytes();
Con este arreglo de byte's ya podemos pasarlo al explorador y que este nos presente la opción solo debemos escribir:
String contentType = "application/vnd.ms-excel";
//Obtenemos el Contexto
FacesContext fc = FacesContext.getCurrentInstance();
//Obtenemos el Response
HttpServletResponse response = (HttpServletResponse)fc.getExternalContext().getResponse();
response.setHeader("Content-disposition", "attachment; filename=" + getNombreExcel());
//Se indicamos el tipo de contenido
response.setContentType(contentType);
//Escribimos en el Response los bytes
response.getOutputStream().write(xls);
//Forzamos a la finalización y cierre de los objetos necesarios
response.getOutputStream().flush();
response.flushBuffer();
fc.responseComplete();
Al finalizar esto, debería mostrarnos el resultado que queremos.
También, crearemos el método para limpiar el campo de texto llamado "Limpiar", que sera:
public String limpiar()
{
nombreExcel ="";
return null;
}
Nota: queda a su consideración los estilos de las filas y un contenido verdadero, espero les sea de Ayuda. Cualquier cosa estoy para resolver sus preguntas ;)
Condigo completo del Bean:
public class TestBean {
private String nombreExcel;
private String[] nombres ={"Nombre 1","Nombre 2","Nombre 3","Nombre 4","Nombre 5"};
private String[] telefonos ={"Telefono 1","Telefono 2","Telefono 3","Telefono 4","Telefono 5"};
private String[] direcciones ={"Direccion 1","Direccion 2","Direccion 3","Direccion 4","Direccion 5"};
public TestBean()
{
nombreExcel="";
}
public String generarExcel()
{
byte[] xls = new byte[0];
//Libro Excel
HSSFWorkbook libro = new HSSFWorkbook();
//Hoja Excel
HSSFSheet hoja = libro.createSheet();
// Se crea una fila dentro de la hoja
HSSFRow fila = null;
try
{
//cramos la celda
HSSFCell celda = null;
//Realizamos un ciclo para recorrer los arrelgos privados
for(int i =0; i<this.nombres.length;i++)
{
fila = hoja.createRow(i);
//Nombre
celda = fila.createCell(0);
celda.setCellValue(nombres[i]);
//Telefono
celda = fila.createCell(1);
celda.setCellValue(telefonos[i]);
//dirección
celda = fila.createCell(2);
celda.setCellValue(direcciones[i]);
}
libro.setSheetName(0, getNombreExcel());
//Obtenemos los bytes del Excel
xls = libro.getBytes();
//Generamos el Excel
String contentType = "application/vnd.ms-excel";
//Obtenemos el Contexto
FacesContext fc = FacesContext.getCurrentInstance();
//Obtenemos el Response
HttpServletResponse response = (HttpServletResponse)fc.getExternalContext().getResponse();
response.setHeader("Content-disposition", "attachment; filename=" + getNombreExcel());
//Se indicamos el tipo de contenido
response.setContentType(contentType);
//Escribimos en el Response los bytes
response.getOutputStream().write(xls)
//Forzamos a la finalización y cierre de los objetos necesarios
response.getOutputStream().flush();
response.flushBuffer();
fc.responseComplete();
} catch (Exception e)
{
System.out.println("Error generando Excel.");
}
return null;
}
public String limpiar()
{
nombreExcel ="";
return null;
}
public String getNombreExcel() {
return nombreExcel;
}
public void setNombreExcel(String nombreExcel) {
this.nombreExcel = nombreExcel;
}
}
Quedo atento a sus comentarios y Opiniones, Muchas Gracias :)
