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 :)

Muchas gracias por el aporte, me genera el excel pero me da pete el Microsoft Excel al intentar abrir el archivo que he generado y descargado. Y dandole a abrir directamente tampoco me abre, lo unico bueno que despues de tres intentos al tercero si me abre pero no sé porque me pasa esto. Es como si el Excel que me generara no estuviera bien del todo. Haber si puedes ayudarme. Muchas gracias.
ResponderEliminarHola, lo que puede ser es que cuando lo intentes abrir no este terminada la descarga completamente. EL archivo te abre con algún error en el office ?
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarPodrías compartirnos los archivos?
ResponderEliminarBuenas tambien tengo el mismo problemas el archivo sale con error no lo puedo visualizar en el excel.
ResponderEliminar