Código Java – Abrir Reportes Creados con JasperReports

Este es el Ejemplo #20 del Topic: Programación Gráfica en Java.

Los reportes son otras de las utilidades más importantes en las aplicaciones ya que su función es dar al usuario información ordenada y limpia así como un formato adecuado para poder ser llevado a impresión o almacenarlo en algún tipo de fichero como .doc, .odt, pdf, etc.

Recuerdo que hace muchos post anteriores hablé sobre JasperReports, una herramienta Open Source para emitir reportes en Java. Pueden usarlo externamente descargándolo desde jasperforge, o instalar el complemento en netbeans como se explicó en el post mencionado (Instalación de JasperReports).

El siguiente paso es realizar el reporte, que no es nada complicado, basta con establecer la conexión a la base de datos que deseemos, arrastrar los campos de las tablas que necesitemos y ordenarlos, darle un formato decente y ya está, al guardarlo debe generarse un fichero .jrxml, al cual invocaremos desde nuestro código fuente.

Antes de continuar, debemos contar en el proyecto con la librería:

jasperreports-3.7.6.jar

Si antes se instaló el JasperReports es posible que la librería ya lo tengamos en el ordenador, incluso el IDE de desarrollo lo tiene indexado, solo deberá ser añadido a proyecto.

Otras de la librerías que necesitaremos están comentados en el encabezado del código de Ejemplo.

El siguiente procedimiento va a recibir como parámetro la ubicación del reporte dentro del proyecto, para ello será necesario incluir los reportes en algún directorio dentro del proyecto en el que trabajamos, en mi caso la estructura es la siguiente:

beastieux --> reports --> MyReporte.jrxml

...

private void abrirReporte(String archivo)

{

    try {

        JasperReport report = JasperCompileManager.compileReport(archivo);

        JasperPrint print = JasperFillManager.fillReport(report, new HashMap(), coneccionSQL());

        JasperViewer.viewReport(print, false);

    } catch (JRException jRException) {

        System.out.println(jRException.getMessage());

    }

}
...

La linea de código encargada de general la ruta absoluta de la ubicación del reporte es el siguiente:


...

getClass().getResource("/beastieux/reports/MiReporte.jrxml").getPath()

...

Además, algo muy importante que se necesita para abrir el reporte es la conexión a la base de datos. En este ejemplo lo hice con PostgreSQL, ustedes pueden hacerlo con el que gusten, pueden verlos en los ejemplos de conexión a diferentes base de datos realizados en los post anteriores de este tutorial. Como observarán, la función coneccionSQL() nos retorna la conexión a la base de datos, el cual será usado directamente como tercer parámetro en la linea:


...

JasperPrint print = JasperFillManager.fillReport(report, new HashMap(), coneccionSQL());

...

Código de Ejemplo:


/**

  • jasperreports-3.7.6.jar

  • commons-digester-1.7.jar

  • commons-logging-1.0.4.jar

  • commons-collections-2.1.1.jar

  • commons-beanutils-1.8.0.jar */

package beastieux.gui; import java.awt.CardLayout; import java.sql.Connection; import java.sql.DriverManager; import java.util.HashMap; import javax.swing.JButton; import javax.swing.JFrame; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.view.JasperViewer; /** *

  • @author beastieux */

public class Ejm20_JasperReport extends JFrame {

public Ejm20_JasperReport()

{

    JButton btn1=new JButton("Abrir Reporte");

        btn1.addActionListener(new java.awt.event.ActionListener() {

        public void actionPerformed(java.awt.event.ActionEvent evt) {

            btn1ActionPerformed(evt);

        }

    });

    this.add(btn1);

    this.setLayout(new CardLayout());

    this.setSize(200,100);

    this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

}

private void btn1ActionPerformed(java.awt.event.ActionEvent evt) {

    abrirReporte(getClass().getResource("/beastieux/reports/MiReporte.jrxml").getPath());

}

private void abrirReporte(String archivo)

{

    try {

        JasperReport report = JasperCompileManager.compileReport(archivo);

        JasperPrint print = JasperFillManager.fillReport(report, new HashMap(), coneccionSQL());

        JasperViewer.viewReport(print, false);

    } catch (JRException jRException) {

        System.out.println(jRException.getMessage());

    }

}

private Connection coneccionSQL()

{

        try

        {

                String cadena;

                cadena="jdbc:postgresql://127.0.0.1:5432/postgres";

                Class.forName("org.postgresql.Driver");

                Connection con = DriverManager.getConnection(cadena, "usuario","contraseña");

                return con;

        }

        catch(Exception e)

        {

               System.out.println(e.getMessage());

        }

        return null;

}

public static void main(String args[])

{

    Ejm20_JasperReport obj = new Ejm20_JasperReport();

    obj.setVisible(true);

}
}

Debemos tener especial cuidado con los reportes creados en diferentes sistemas operativos, mas que nada en los tipos de letras usado (Tipografía), por ejemplo creas el reporte en Windows haciendo uso de Times New Roman te podría generar un error si lo tratas de abrir en Linux o viceversa, al final, eso se corrige en el archivo jrxml generado en las partes donde hace mención a la fuente.

Pueder ir al artículo principal:

Códigos Sencillos hechos en Java

9 thoughts on “Código Java – Abrir Reportes Creados con JasperReports

  1. Me da este error:

    Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
    at Ejm20_JasperReport.btn1ActionPerformed(Ejm20_JasperReport.java:55)
    at Ejm20_JasperReport.access$000(Ejm20_JasperReport.java:25)
    at Ejm20_JasperReport$1.actionPerformed(Ejm20_JasperReport.java:37)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6533)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6298)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    BUILD SUCCESSFUL (total time: 7 seconds)

    1. basicamente es un objeto de alamcenamiento de otros objetos (de tipo nativo o compuestos)
      y permite varias cosas como su ordenamiento y su acceso mediante un key y algunos otros metodos es muy util para mi por ejemplo para buscar valores dentro de un vector …

    2. hasmap te sirve mas que todo para los reportes que requieren de parámetro, a través de este diccionario envías la clave y el valor Ejemplo si tuvieras un reporte en el cual solo quieres extraer los datos filtrados por rango de fecha la consulta sql en el reporte estaría dada de la siguente forma :

      Select campo1,campo2,fecha from “Nombre de tabla” where fecha Between $P{fecha_inicio} AND {fecha_fin} ;

      //en el codigo para mostrar el reporte estaría de la siguiente forma;
      Map parametros=new HashMap();//Creamos el Objeto;
      String fecha_inicio,fecha_fin;
      fecha_inicio=”2015-01-01″;
      fecha_fin=”2015-01-31″;
      //En el key es necesario el mismo nombre que se le dio al parámetro en el reporte el metodo put nos permite añadir objetos al map put(key,valor).
      parametro.put(“fecha_inicio”,fecha_inicio);
      parametro.put(“fecha_fin”,fecha_fin);
      JasperReport report = JasperCompileManager.compileReport(archivo)
      JasperPrint print = JasperFillManager.fillReport(report, parametros, coneccionSQL());
      JasperViewer.viewReport(print, false);

      Para el caso de ejemplo en esta pagina bastara con enviar un null si el reporte no lleva parametros ejemplo:

      JasperReport report = JasperCompileManager.compileReport(archivo)
      JasperPrint print = JasperFillManager.fillReport(report,null, coneccionSQL());
      JasperViewer.viewReport(print, false);

  2. Hola!
    yo tengo un problema doble:
    1.- Cómo puedo desactivar en ireport, los formatos de exportación a XLS, DOC, etc. nada más que quede PDF y la impresión.
    2.- “Error:SQL problems: Table ‘operacion.left’ doesn’t exist” está tabla no existe ese es el nombre de mi base de datos.
    y ya búsque por todos lados en donde puede estar esto y no lo encuentro. esto me aparece en el report query.
    jaspersoft iReport Designer 4.7.1
    Les agradezco su ayuda.

Deja un comentario