JasperReports - Llenado de informes

El objetivo principal de cualquier herramienta de informes es producir documentos de alta calidad. El proceso de llenado de informes ayuda a la herramienta de informes a lograr esto mediante la manipulación de conjuntos de datos.

Las principales entradas requeridas para el proceso de llenado de informes son:

  • Report Template - Este es un archivo JasperReport real.

  • Report Parameters- Estos son básicamente valores con nombre que se pasan en el momento de completar el informe al motor. Los discutiremos en el capítulo Parámetros del informe .

  • Data Source- Podemos llenar un archivo Jasper a partir de una variedad de fuentes de datos como una consulta SQL, un archivo XML, un archivo csv, una consulta HQL (Hibernate Query Language), una colección de Java Beans, etc. Esto se discutirá en detalle en Report Capítulo de fuentes de datos .

La salida generada por este proceso es una .jrprint documento que está listo para ser visto, impreso o exportado a otros formatos. La clase de fachada net.sf.jasperreports.engine.JasperFillManager se usa generalmente para llenar una plantilla de informe con datos. Esta clase tiene varios métodos fillReportXXX () que llenan las plantillas de informes (las plantillas pueden ubicarse en el disco, seleccionarse de los flujos de entrada o suministrarse directamente como en la memoria).

Hay dos categorías de métodos fillReportXXX () en esta clase de fachada:

  • El primer tipo recibe un objeto java.sql.Connection como tercer parámetro. La mayoría de las veces, los informes se llenan con datos de una base de datos relacional. Esto se logra mediante:

    • Conéctese a la base de datos a través de JDBC.

    • Incluya una consulta SQL dentro de la plantilla de informe.

    • El motor JasperReports usa la conexión pasada y ejecuta la consulta SQL.

    • Por tanto, se genera una fuente de datos del informe para completar el informe.

  • El segundo tipo, recibe un objeto net.sf.jasperreports.engine.JRDataSource, cuando los datos que deben completarse están disponibles en otros formularios.

Llenado de plantillas de informes

Escribamos una plantilla de informe. El contenido del archivo JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) es el siguiente:

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

<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
   http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
   name = "jasper_report_template" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <queryString>
      <![CDATA[]]>
   </queryString>
   
   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>
   
   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>

   <columnHeader>
      <band height = "23">
  
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" 
               width = "535" height = "15" backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
			
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
				
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>
   
   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" 
               width = "535" height = "14" backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

A continuación, pasemos una colección de objetos de datos de Java (beans de Java), al motor JasperReport, para completar este informe compilado.

Escriba un POJO DataBean.java, que representa el objeto de datos (bean Java). Esta clase define dos objetos String, es decir, 'nombre' y 'país'. Guárdelo en el directorioC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Escriba una clase DataBeanList.java, que tenga lógica empresarial para generar una colección de objetos de Java Bean. Esto se pasa al motor JasperReports para generar el informe. Aquí estamos agregando 4 objetos DataBean en la Lista. Guárdelo en el directorioC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Escribe un archivo de clase principal JasperReportFill.java, que obtiene la colección de beans de Java de la clase (DataBeanList) y la pasa al motor JasperReports, para completar la plantilla de informe. Guárdelo en el directorioC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "c://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);
      Map parameters = new HashMap();
      try {
         JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Generando informes

Ahora compilaremos y ejecutaremos estos archivos utilizando nuestro proceso de compilación ANT habitual. El archivo build.xml es el siguiente:

El archivo de importación, baseBuild.xml, se selecciona del capítulo Configuración del entorno y debe colocarse en el mismo directorio que build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </target>
   
   <target name = "compilereportdesing" description = "Compiles the JXML file and
      produces the .jasper file.">
      
      <taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
         <classpath refid = "classpath" />
      </taskdef>
      
      <jrc destdir = ".">
         <src>
         
            <fileset dir = ".">
               <include name = "*.jrxml" />
            </fileset>
         </src>
         <classpath refid = "classpath" />
      </jrc>
		
   </target>
	
</project>

A continuación, abramos la ventana de la línea de comandos y vayamos al directorio donde se coloca build.xml. Finalmente, ejecute el comando ant -Dmain-class = com.tutorialspoint.JasperReportFill (executereport es el objetivo predeterminado) de la siguiente manera:

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

compile:
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:27:
   warning: 'includeantruntime' was not set, defaulting to
   build.sysclasspath=last; set to false for repeatable builds
   [javac] Compiling 1 source file to
   C:\tools\jasperreports-5.0.1\test\classes

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 8 seconds

Como resultado de la ejecución anterior, se genera un archivo jasper_report_template.jrprint en el mismo directorio que el archivo .jasper (en este caso, se genera en C: \ tools \ jasperreports-5.0.1 \ test).