jueves, 1 de septiembre de 2011

Crear informes con JasperReports en Java

Recientemente he estado comparando librerías para hacer reportes en java. Tras haber usado en proyectos anteriores otras librerías, finalmente me he decantado por  JasperReports ya que programando solo una plantilla .jrxml él se encarga de exportarla a un gran número de formatos y además dicha plantilla ya no tienes que crearla a mano sino que puedes hacerla en vista diseño con la herramienta opensource iReport.

JasperReports es una popular librería de reportes open source (LGPL) escrita en Java. Desafortunadamente no está muy bien documentada y puede costar un poco crear tu primer reporte si no buscas bien. Por ello, intentaré resumir todo lo necesario para empezar con JasperReports por si a alguien le puede servir.

Lo primero es descargar la última versión de esta herramienta, directamente desde la página del proyecto http://jasperforge.org/projects/jasperreports para poder descargar no es necesario registrarse en el sitio si pinchas donde pone “No Thanks, Continue to Download”, luego haces click en el primer enlace de la lista para descargar el zip que contenga la última versión (cuando yo lo hice era la JasperReports 4.0.2)

Una vez que termine la descarga, descomprime el archivo, aquí hay varias carpetas, la que nos interesa es la que dice lib y dist, de la carpeta dist, sacamos el jar de jasperReport que necesitemos dependiendo del tipo que sea nuestro proyecto, para un proyecto web cogeremos el jasperreports-4.0.2.jar y lo pegaremos en la carpeta lib de nuestro proyecto.

Tras esto, copia los siguientes jars de la carpeta lib de jasperReports a la carpeta lib de tu proyecto y agregalas al classpath para poder compilar los reports que crees con la herramienta iReport:
commons-beanutils-1.8.0.jar
commons-collections-2.1.1.jar
commons-digester-1.7.jar
commons-logging-1.0.4.jar
groovy-all-1.7.5.jar
iText-2.1.7.jar
jasperreports-4.0.2.jar
jasperreports-applet-4.0.2.jar
jasperreports-fonts-4.0.2.jar
jasperreports-javaflow-4.0.2.jar
jaxen-1.1.1.jar

Si te has descargado una versión más reciente de JasperReport no debes fijarte en los numeros de versión que aparecen en las librerías anteriores puesto que habrán cambiado.
Una vez ya tengas en el classpath todas las librerías, vamos a crear nuestro primer reporte, uno muy sencillo, todavía no voy a mostrar como pasarle datos ni parámetros, por el momento solo sacaremos un hola mundo en el reporte.
Para crear reportes el procedimiento es el siguiente, primero necesitas diseñar el report para lo cual lo mejor es utilizar la herramienta open source iReport que te permite evitarte tener que escribir el .jrxml (su formato es XML) del reporte a mano puesto que es un entorno como el del netbeans con vista diseño, vista de código y preview y es muy sencillo crear un reporte con ella.
Una vez que hayas creado el diseño del reporte lo guardas con extensión .jrxml, después necesitas compilarlo para generar su correspondiente archivo .jasper, la compilación se hace una sola vez y una vez que tienes el fichero.jasper lo cargas en memoria y le mandas los parámetros e información que quieres desplegar (en caso de que te sea necesario), lo exportas al formato deseado y lo guardas
Ahora que tenemos la idea del proceso completo, comenzaremos con el primer paso, el cual es diseñar el reporte en jrxml. Pero antes vamos a explicar los elementos que debe contener un típico fichero jrxml:
  • <jasperReport> - es el elemento raíz
  • <title> - su contenido se imprime solo una vez al comienzo de el reporte y como su nombre indica es el título que el reporte tendrá.
  • <pageHeader> - esta sección será impresa en cada página que el reporte contenga, es la cabecera del reporte.
  • <columnHeader> - esta sección se utiliza para poner la cabecera de la sección “detail”, en otras palabras el titulo de la información desplegada en el “detail”.
  • <detail> - esta sección  es el body del report, es decir, es donde se colocan la información a desplegar del reporte, generalmente en esta sección se despliegan tablas.
  • <pageFooter> - esta sección el pie de página y es impresa al final de cada página del reporte, aquí puedes poner el número de página o alguna otra información.
  • <band> - define una sección del reporte, todos los elementos de arriba contienen un elemento hijo <band>
Todos los elementos son opcionales, excepto el elemento raiz jasperReport A continuación veréis un ejemplo de jrxml para generar un simple reporte que muestra "Hello World!"

<?xml version="1.0"?>
<!DOCTYPE jasperReport
  PUBLIC "-//JasperReports//DTD Report Design//EN"
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="Simple_Report">
 <detail>
    <band height="20">
      <staticText>
        <reportElement x="180" y="0" width="200" height="20"/>
        <text><![CDATA[Hello World!]]></text>
      </staticText>
    </band>
  </detail>
</jasperReport>

Para este simple ejemplo (le guardaremos con el nombre jasperreports_demo.jrxml) he omitido los elementos opcionales <title>, <pageHeader> y <pageFooter>. El elemento <staticText> como su nombre indica sirve para mostrar texto estático en el reporte, para ello contiene el elemento <text> en el cual introduciremos el texto que queramos que se muestre en el reporte.
Los jrxml necesitan ser compilados en un formato binario que es especifico para JasperReports. Para compilarlo hay que llamar al metodo compileReport() de la clase net.sf.jasperreports.engine.JasperCompileManager.
Hay varias versiones de este método, en nuestro ejemplo usaremos una en la que se le pasa un único parámetro de tipo String con la ruta relativa del jasperreports_demo.jrxml anterior.
A continuación se muestra la clase que genera el report:

public class JasperReportsIntro
{
  public static void main(String[] args)
  {
    JasperReport jasperReport;
    JasperPrint jasperPrint;
    try
    {
      //1)Compilamos el archivo XML y lo cargamos en memoria
      jasperReport = JasperCompileManager.compileReport(
          "reports/jasperreports_demo.jrxml");
 
      //2)Llenamos el reporte con la información y parámetros necesarios (En este caso nada)
      jasperPrint = JasperFillManager.fillReport(
          jasperReport, new HashMap(), new JREmptyDataSource());
 
      //3)Exportamos el reporte a pdf y lo guardamos en disco
      JasperExportManager.exportReportToPdfFile(
          jasperPrint, "reports/simple_report.pdf");
    }
    catch (JRException e){
      e.printStackTrace();
    }
  }
}       
En el ejemplo anterior primero compilamos el jrxml, para aplicaciones reales, esto basta con hacerlo solo una vez, y generas un archivo jasper, luego en el paso 2 se le pasan tres parámetros a la función fillReport, el cual es el reporte, un HashMap con los parámetros y no se le pasa información, por ahora no le estamos pasando nada, ya que esto es solo una introducción.
Espero que este post os haya servido como introducción y hasta la próxima!

No hay comentarios:

Publicar un comentario