Skip to main content

Libro JEE7 Capitulo 06 iReport

Capitulo 06 iReport

Puedes descargarlo en pdf
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0

Encuesta
https://docs.google.com/forms/d/1WG7uzOe17V4u36fC05V3ijYEPZ8fhJD1NPUrkNBS0Jk/alreadyresponded?usp=send_form


En este capítulo mostraremos la forma de crear reportes de una manera muy sencilla utilizando iReport.


Pasos:
  1. Descargar el plugin iReport
  2. Crear reporte
  3. Desarrollar el código para imprimir reporte.


Descargamos el plugin de iReport para NetBeans






Descomprimir el archivo .zip

Desde el menú de NetBeans Tools-->Plugins-->Pestaña Downloaded-->Presionar el botón Add Plugins

En el proyecto seleccionar Build with dependences

Nos ubicamos en resources -->clic derecho y seleccionar New-->Categories: Other→ File Types: Folder

Crear el paquete reportes dentro de resources

Nos ubicamos en reportes y seleccionar  NewOther


Seleccionar Categories: Report
                    File Types: Empty report


dar el nombre





se muestra el diseñador de reportes





Revisamos los atributos del Entity Estatus.java


Abrimos el reporte y en  Field agregamos los tres fields. Clic derecho seleccionar Add Field

se genera el nombre field1
renombrar a idestatus, estatus,esinicial

En la paleta le cambiamos el tipo de dato en las propiedades
Propiedad Field Class
Arrastramos los campos a la sección Detail1, de manera automática se coloca en la columna el título.

Arrastras label Static Text  desde la paleta a la sección Page Header
En el texto colocamos ESTATUS y las propiedades seleccionamos Bold, para que lo coloque en negrita.

En Tools arrastramos Current date para agregar la fecha del sistema.

compilamos el reporte
En la barra se genera el mensaje de compilación exitosa

Se muestra el reporte compilado








CREAR CDI/BEANS PARA MANEJO DE IMPRESIONES

CDI Beans GestorImpresion.java lo usaremos para gestionar las diversos métodos para realizar las impresiones.
Crearemos los métodos con dos parámetros List<?> t , colocamos el ? para que podamos pasar cual list de objetos al método, y String ruta, es la ruta del reporte, HashMap para los parámetros que usaremos en los reportes.
  • imprimir(List<?> t,String ruta,HashMap hashmap) ,imprime la lista de objetos pasados
  • pdf(List<?> t, String ruta, HashMap hashmap), genera un pdf
  • docx(List<?> t, String ruta, HashMap hashmap), genera un archivo docx
  • xlsx(List<?> t, String ruta, HashMap hashmap), genera un archivo xlsx
  • odt(List<?> t, String ruta, HashMap hashmap), genera un archivo odt
  • ppt(List<?> t, String ruta, HashMap hashmap), genera un archivo ppt
  • preparar(List<?> t, String ruta, HashMap hashmap), se utiliza internamente para configurar el entorno del reporte.
De esta manera podemos invocar el reporte desde el controller, donde pasaremos la lista de objetos
public String imprimir() {
       String ruta = "/resources/reportes/estatus.jasper";
       HashMap parameters = new HashMap();
       gestorImpresion.imprimir(estatusFacade.getEstatusList(), ruta, parameters);

       return null;
   }


Crear el CDI Beans
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: GestorImpresion
  • Package com.avbravo.scrumweb.generales
  • Scope: request







Código completo  de GestorImpresion.java

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRPptxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;

/**
*
* @author avbravo
*/
@Named
@RequestScoped

public class GestorImpresion {

   JRBeanCollectionDataSource ds;
   FacesContext facesContext;
   ServletContext scontext;
   JasperPrint jasperPrint;

   /**
    * Creates a new instance of GestorImpresion
    */
   public GestorImpresion() {
   }

   public String imprimir(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           ByteArrayOutputStream baos = new ByteArrayOutputStream();
           JRPdfExporter exporter = new JRPdfExporter();
           exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
           exporter.exportReport();
           byte[] bytes = baos.toByteArray();
           if (bytes != null && bytes.length > 0) {
               HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
               response.setContentType("application/pdf");
               response.setHeader("Content­disposition", "inline; filename=\"relatorioPorData.pdf\"");
               response.setContentLength(bytes.length);
               ServletOutputStream outputStream = response.getOutputStream();
               outputStream.write(bytes, 0, bytes.length);
               outputStream.flush();
               outputStream.close();
           }
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String pdf(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.pdf");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String docx(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.docx");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JRDocxExporter docxExporter = new JRDocxExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String xlsx(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.xlsx");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JRXlsxExporter docxExporter = new JRXlsxExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String odt(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.odt");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JROdtExporter docxExporter = new JROdtExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String ppt(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.pptx");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JRPptxExporter docxExporter = new JRPptxExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   private void preparar(List<?> t, String ruta, HashMap hashmap) {
       try {
           ds = new JRBeanCollectionDataSource(t);
           facesContext = FacesContext.getCurrentInstance();
           facesContext.responseComplete();
           scontext = (ServletContext) facesContext.getExternalContext().getContext();
           jasperPrint = JasperFillManager.fillReport(scontext.getRealPath(ruta), hashmap, ds);
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
   }
 }


































Editar EstatusDataController.java , inyectar GestionImpresion y agregar el método imprimir().En este indicaremos la ruta del reporte, la lista de entitys y el HashMap con los parámetros. E invocamos al método correspondiente en GestionImpresion

@Inject
   GestorImpresion gestorImpresion;

public String imprimir() {
       String ruta = "/resources/reportes/estatus.jasper";
       HashMap parameters = new HashMap();
       gestorImpresion.imprimir(estatusFacade.getEstatusList(), ruta, parameters);
       return null;
   }

/*
*imprimir un solo entity
*/
public String imprimir() {
List<Estatus> list = new ArrayList<>();
list.add(estatus);
       String ruta = "/resources/reportes/estatus.jasper";
       HashMap parameters = new HashMap();
       gestorImpresion.imprimir(list, ruta, parameters);
       return null;
   }



















Editamos estatuslist.xhmtl, agregamos un footer con el boton imprimir, utilizamos en este caso immediate=”true”, para evitar que se realicen las validaciones, ya que desamos mostrar el reporte directamente.

<f:facet name="footer">
             <p:commandButton immediate="true" id="printButton" value="#{app['boton.print']}" action="#{estatusDataController.imprimir()}" icon="ui-icon-print" ajax="false" />                                                                     
  </f:facet>
                        </p:dataTable>
                        </p:dialog>

Cuando ejecutamos el proyecto y seleccionamos estatuslist, se muestra el botón Imprimir
al presionarlo se muestra el reporte para imprimir


Comments

Estimado profesor como siempre sus aportes son de suma importancia y utilidad.

Seguí los pasos y funciona a la perfección en un ambiente de desarrollo.

Pero en producción al intentar visualizar el archivo pdf el navegador arroja un mensaje de error ""Format error : Not a PDF or corrupted"

Deberia modificar alguna linea para obtener la ruta ?

O el problema se da porque al generar el archivo .WAR los archivos que estan en la carpeta recursos son omitidos ?

Saludos
Estimado profesor como siempre sus aportes son de suma importancia y utilidad.

Realice todos los pasos y funciona a la perfeccion en un ambiente de desarollo.

El problema esta al momento de generar el archivo .war y subir a la aplicacion al servidor para produccion , es entonces cuando al momento de visualizar el reporte el navegador arroja elmensaje de "Format error : Not a PDF or corrupted" .

Eso se debe a que los archivos que estan en la carpeta recursos son omitidos al momento de hacer el deploy o deberia cambiar alguna linea para obtener la ruta exacta de los reportes ?

Desde ya muchas gracias-

Saludos.

Popular posts from this blog

Tutorial básico de aplicaciones Web con NetBeans parte 1

NetBeans ofrece un excelente soporte para el desarrollo de aplicaciones Web, en esta ocasión lo haremos utilizando el Framework Java Server Faces 2.0. En el Menu Seleccionamos Nuevo->Proyecto y luego en Categorias Java Web y en tipo de Proyectos Web  Application indicamos el nombre del proyecto Seleccinamos el servidor Web, usamos GlassFish ya que este soporta EJB3.0 y JSF 2.0 Framework Java Server Faces El IDE genera el esquelto del proyecto Web Pages   almacenamos las paginas .html, xhtml, jsf, los archivos de recursos, los scripts .js, imagenes Source Packages    Son las clases Java  Test Packages    Son las clases que usamos para los Test Libraries     Tenemos las bibliotecas de Java y GlassFish necesarias para ejecutar la aplicación Web. Test Libraries     Están las bibliotecas usadas para los test  Configuration Files    Archivos de configuración de la aplicación. Ejecutamos la...

Incrementar Memoria NetBeans

Algunas veces necesitamos incrementar la memoria para un mejor rendimiento. http://www.netbeans.org/community/releases/55/uml-download.html Este es un ejemplo para UML. Descripción en ingles. Increasing Memory Settings (applicable to all builds) The default memory settings for NetBeans should be increased for UML projects. If you have the available memory, Locate your NetBeans installation directory ($install_dir). This can be found by starting up NetBeans and selecting Help -> About then select the Detail tab. Edit the $install_dir/etc/netbeans.conf file. Find the line defining netbeans_default_options . Increase the maximum memory attribute to -J-Xmx512m. If you experience heap overflows while working with larger files, you should increase this value further.

Test con JUnit

El viernes dicte un taller en el que conversábamos sobre Tecnologías Java y luego desarrollamos una aplicación muy básica para demostrar como utilizar JUnit con NetBeans. Pasos: 1. Crear un proyecto Desktop con NetBeans 2. Crear una clase llamada Operaciones 3. Diseñados un formulario y agregramos componentes de manera que quede similar a la figura Código de los botones try { double a = Double.parseDouble(jTextField1.getText()); double b = Double.parseDouble(jTextField2.getText()); Operaciones operaciones = new Operaciones(); double r = operaciones.Sumar(a, b); jTextField3.setText(String.valueOf(r)); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex.getMessage().toString()); } 4. Creamos los test Seleccionamos las clases En el menu Herramientas,seleccionamos Crear pruebas JUnit Seleccionamos la versión de JUnit En la ventana siguiente seleccionamos los parámetros para nuestras pruebas . Le quitamos la selección a Probar Inicializador y Probar Finalizador NetBeans crea las...