Generar reporte a excel, pdf, powerpoint, word, odt con Ireports


Hola, hace poco en la empresa donde trabajo me asignaron generar un reporte en Pdf, Excel (xlsx), y una presentación en PowePoint, al principio no estaba seguro de como hacerlo, pero tenia ideas que iban más allá. Demore unos cuantas horas investigando acerca del tema y hallé la respuesta.

La herramienta Ireport ha tenido considerable cambios y avances que la hacen ser una herramienta muy sutil y poderosa la hora de querer generar documentos o reportes. Si bien es claro JasperReports  permite especificar rellenar los datos para el informe de salida de dos maneras diferentes: a través de parámetros y datos fuentes, que se presentan por medio de una interfaz genérica llamado JRDataSource, como se muestra en la Figura.
Generar reportes en cualquier formato especificado

Así mismo como nos permite enviarle dos formas de parámetros, también permite generar informes en pdf, xlsx, powerpoint (pptx), odt, word(docx), entre otros, estos formatos de salidas dependen también de la versión de ireport que se este utilizando.

Ahora es claro, ya sabemos que se pueden generar estos tipos de reportes. Ahora como lo hacemos?

Bueno he aquí los pasos para poder generar el reporte deseado.

1. Primero que todo debemos tener un reporte ya generado y compilado. Veamos el mio.

Generar reportes en word, excel, pdf, powerpoint, odt.

Lo que voy a hacer con este reporte es generarlo a excel, así mismo se hara con los demas formatos.

Una vez ya compilado el reporte y que no genere excepciones, obtenemos el .jasper

Ahora bien, veamos cual es el código java para generar y llamar el reporte en cualquier formato, excel, pdf, word, powerPoint, etc.

Este es uno de los métodos que utilizo para generar reportes en cualquier formato, se los comparto y espero que a alguien le sirva de ayuda.


 public void generarReport() {
        FacesContext ctx = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("periodo", periodo);//parametro para el query que genera mis datos de reporte
        response.setContentType("application/pdf");
/*Explico la variable tipoDocumento  se compone de un evento que el usuario ejecuta, es decir que el tipo de documento puede tomar lo siguientes formatos: - xlsx -pdf -docx -odt -ppt*/
        response.setHeader("Content-Disposition", "attachment; filename=\"nombre_del_reporte" + tipoDocumento + "\";");
//        response.setHeader("Content-Disposition", "attachment; filename=\"nombre_del_reporte.pdf\";");
//        response.setHeader("Content-Disposition", "attachment; filename=\"nombre_del_reporte.xlsx\";");
//        response.setHeader("Content-Disposition", "attachment; filename=\"nombre_del_reporte.docx\";");
//        response.setHeader("Content-Disposition", "attachment; filename=\"nombre_del_reporte.pptx\";");
//        response.setHeader("Content-Disposition", "attachment; filename=\"nombre_del_reporte.odt\";");
        try {
            JasperReport reporte;
            JasperPrint jasperPrint = null;
            ServletOutputStream out = response.getOutputStream();
            try {
                reporte = (JasperReport) JRLoader.loadObject(ctx.getExternalContext().getRealPath("WEB-INF/reportes/BalanceFinal.jasper"));
                jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JREmptyDataSource());
            } catch (JRException ex) {
                Logger.getLogger(ReportesView.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                 //Generar reporte a pdf
                if (tipoDocumento.equals("pdf")) {
                    JRExporter exporter;
                    exporter = new JRPdfExporter();
                    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
                    exporter.exportReport();
                } 
                 //Generar reporte a excel
                 else if (tipoDocumento.equals("xlsx")) {
                    JRXlsxExporter exporter = new JRXlsxExporter();
                    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
                    exporter.exportReport();
                }
                 //Generar reporte a powerPoint
                 else if (tipoDocumento.equals("pptx")) {
         JRPptxExporter exporter=new JRPptxExporter();
                    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
                    exporter.exportReport();
                }
               //Generar reporte a word
                 else if (tipoDocumento.equals("docx")) {
                    JRDocxExporter exporter=new JRDocxExporter();
                    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
                    exporter.exportReport();
                }
                 //Generar reporte a ODT
                 else if (tipoDocumento.equals("odt")) {
                    JROdtExporter exporter=new JROdtExporter();
                    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
                    exporter.exportReport();
                }
                out.flush();
                out.close();
                ctx.responseComplete();

                /*
                 JRXlsxExporter docxExporter=new JRXlsxExporter();  
                 docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);  
                 docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, servletOutputStream);  
                 docxExporter.exportReport();  
                 FacesContext.getCurrentInstance().responseComplete();  
                 */
            } catch (JRException ex) {
                Logger.getLogger(ReportesView.class.getName()).log(Level.SEVERE, null, ex);
            }


        } catch (IOException ex) {
            Logger.getLogger(ReportesView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Ahora veamos el método que asigna el tipo de documento por parte del evento del usuario:
//Claro esta que tipoDocumento  es una variable global

public void tipoDoc(String tipoDoc) {
        tipoDocumento = tipoDoc; 
        //Donde el parametro de llegada puede ser - xlsx -pdf -docx -odt -ppt
    }

Y dentro de la plantilla xhtml elaborada en primefaces la estrutura que genere los reportes será de esta forma:
Son commandLink que nos permiten hacer llamado de los reportes en otras pestaña.

<h:commandLink id="habilite" disabled="#{reportesView.reportSeleccionado==''}" actionListener="#reportesView.tipoDoc('pdf')}" action="#{reportesView.ejecutarReporte}" target="_blank" title="Generar Reporte a pdf."> 
           <p:graphicImage value="../resources/images/pdf.png"/>                                                                                
</h:commandLink>
    
<h:commandLink id="habilite2" disabled="#{reportesView.reportSeleccionado==''}" actionListener="#reportesView.tipoDoc('xlsx')}" action="#{reportesView.ejecutarReporte}" target="_blank" title="Generar Reporte a excel">                                    
           <p:graphicImage value="../resources/images/excel.png"/>                                                                                
</h:commandLink>

<h:commandLink id="habilite3" disabled="#{reportesView.reportSeleccionado==''}" actionListener="#reportesView.tipoDoc('docx')}" action="#{reportesView.ejecutarReporte}" target="_blank" title="Generar Reporte a word">                                    
           <p:graphicImage value="../resources/images/word.png"/>                                                                                
</h:commandLink>

<h:commandLink id="habilite3" disabled="#{reportesView.reportSeleccionado==''}" actionListener="#reportesView.tipoDoc('pptx')}" action="#{reportesView.ejecutarReporte}" target="_blank" title="Generar Reporte a powerPoint">                                    
           <p:graphicImage value="../resources/images/pptx.png"/>                                                                                
</h:commandLink>

<h:commandLink id="habilite3" disabled="#{reportesView.reportSeleccionado==''}" actionListener="#reportesView.tipoDoc('odt')}" action="#{reportesView.ejecutarReporte}" target="_blank" title="Generar Reporte a odt">                                    
           <p:graphicImage value="../resources/images/odt.png"/>                                                                                
</h:commandLink>

El reporte generado a excel xlsx queda de la siguiente forma:

Reporte generado a excel - xlxs

De esta forma se puede generar reportes en cualquier formato de los especificados, espero les resuelva las duda a algunas personas y que les haya gustado mi aporte.

Entradas más populares de este blog

Crear un dominio en servidor Glassfish. create-domain. start-domain.

Descargar archivo con JSF, Primefaces, Hibernate.

Crear Pool Conexiones en servidor Glassfish.