JasperReports - Guía rápida

¿Qué es un informe?

Un informe es una presentación de información significativa, bien definida y resumida. Por lo general, las actividades de rutina se automatizan y los datos se resumen en un "Informes" que respaldan las decisiones. Los informes representan datos desordenados habituales en cuadros, gráficos y otras formas de representaciones gráficas.

Reportar plantilla

Generalmente, la mayoría de las herramientas de generación de informes comerciales adoptan el siguiente diseño para generar informes.

TÍTULO
ENCABEZADO DE PÁGINA
ENCABEZADO DE LA COLUMNA
DETALLE
PIE DE COLUMNA
PIE DE PÁGINA
RESUMEN

A continuación se muestran las descripciones de cada elemento mencionado en el diagrama:

S.NO Elemento y descripción
1

title

El título contiene el 'Título' del informe. Aparece solo una vez al principio del informe, por ejemplo, "Informe de puntos de tutoriales".

2

pageHeader

PageHeader puede contener información de fecha y hora y / o el nombre de la organización. Esto aparece en la parte superior de cada página.

3

columnHeader

ColumnHeader enumera los nombres de esos campos específicos, que desea mostrar en el informe, por ejemplo, "Nombre del autor", "Hora de inicio", "Hora de finalización", "Horas trabajadas", "Fecha", etc.

4

detail

El detalle es la parte donde se muestran las entradas de los campos específicos (enumerados en columnHeader), por ejemplo, "Manisha", "9:00", "18:00", "9", "10.02.2013".

5

columnFooter

ColumnFooter puede mostrar la suma de cualquiera de los campos, por ejemplo, "Total de horas trabajadas:" 180 ".

6

pageFooter

PageFooter puede contener información sobre el recuento de páginas. Aparece al final de cada página, por ejemplo, "1/23".

7

summary

El resumen contiene información inferida de la parte "detalle", por ejemplo, después de enumerar el número de horas trabajadas por cada autor, el total de horas trabajadas por cada autor se puede poner en un gráfico visual como gráfico circular, gráfico, etc.

JasperReports

Los siguientes son los problemas comunes que se enfrentan durante el desarrollo del informe:

  • Core changes - Por lo general, refleja los cambios o mejoras comerciales que se requieren para cambiar la lógica central del informe.

  • Results exporting - Existe una amplia gama de formatos a los que se puede exportar su informe, como: HTML, Texto, PDF, MS Excel, RTF, ODT, valores separados por comas, XML o imagen.

  • Complicated reports - Los subinformes y los informes de tablas cruzadas son un buen ejemplo.

  • Charts reports - Gráficos visuales, por ejemplo, gráfico, circular, línea XY, barra, medidor y series de tiempo.

Para eliminar la sobrecarga de los puntos mencionados anteriormente y facilitar el proceso de informes, se introdujeron muchos marcos, herramientas, bibliotecas y aplicaciones de terceros. JasperReports es uno de ellos.

JasperReportses un motor de informes Java de código abierto. Está basado en Java y no tiene su propia sintaxis de expresión. JasperReports tiene la capacidad de entregar contenido enriquecido en la pantalla, en la impresora o en archivos PDF, HTML, XLS, RTF, ODT, CSV, TXT y XML. Como no es una herramienta independiente, no se puede instalar por sí sola. En cambio, está integrado en aplicaciones Java al incluir su biblioteca en CLASSPATH de la aplicación.

JasperReports es una biblioteca de clases de Java y no está destinada a los usuarios finales, sino que está dirigida a los desarrolladores de Java que necesitan agregar capacidades de informes a sus aplicaciones.

Características de JasperReports

Algunas de las características importantes de JasperReports son:

  • Tiene un diseño de informe flexible.

  • Puede presentar datos de forma textual o gráfica.

  • Los desarrolladores pueden proporcionar datos de varias formas.

  • Puede aceptar datos de múltiples fuentes de datos.

  • Puede generar marcas de agua (una marca de agua es como una imagen secundaria que se coloca sobre la imagen principal).

  • Puede generar subinformes.

  • Es capaz de exportar informes en una variedad de formatos.

JasperReports es una biblioteca Java pura y no una aplicación independiente. No se puede ejecutar por sí solo, por lo que debe integrarse en otra aplicación Java del lado del cliente o del servidor. Como está basado en Java, se puede ejecutar en cualquier plataforma que admita Java (JDK 1.3 y superior). Todas las funcionalidades de JasperReport están reunidas en un solo archivo JAR, jasperreports-xxxjar. Este JAR junto con las bibliotecas requeridas y opcionales (archivo .ZIP) se pueden descargar desde el sitio: JasperReport Library Link . Descargue la última versión desde este enlace.

El archivo ZIP incluye el archivo JAR de JasperReports junto con el código fuente de JasperReports, los JAR dependientes y muchos ejemplos que demuestran las funcionalidades de JasperReport.

Entorno JasperReport

Para comenzar a crear los informes, debemos configurar el entorno listo. Extraiga el archivo JasperReport.ZIP descargado a cualquier ubicación (en nuestro caso, lo hemos extraído a C: \ tools \ jasperreports-5.0.1). La estructura del directorio del archivo extraído es la misma que se muestra a continuación:

Aquí está el detalle de todos los directorios:

  • build : contiene los archivos de clase JasperReport compilados.

  • demo : contiene varios ejemplos que demuestran varios aspectos de la funcionalidad de JasperReports.

  • dist : contiene el archivo jasperreports-xxxjar. Agregaremos este archivo JAR a nuestro CLASSPATH para aprovechar JasperReports.

  • docs : contiene una copia local de la documentación de JasperReports.

  • lib : contiene todos los archivos JAR necesarios, tanto para compilar JasperReports como para usarlo en nuestras aplicaciones.

  • src : contiene el código fuente de JasperReports.

  • build.xml : un archivo de compilación ANT para compilar el código fuente de JasperReports. Si no tenemos la intención de modificar JasperReports, no necesitamos usar este archivo, ya que JasperReports se distribuye en forma compilada.

  • changes.txt : un documento de texto que explica las diferencias entre las versiones actual y anterior de la biblioteca de clases JasperReports.

  • license.txt : documento de texto que contiene el texto completo de la licencia LGPL (Licencia pública general reducida).

  • readme.txt : un documento de texto que contiene instrucciones sobre cómo crear y ejecutar los ejemplos proporcionados.

Básicamente, solo usamos jasperreports-xxxjar en dist y JAR en el directorio lib para generar informes. Como JasperReports es una herramienta de código abierto, si se reconoce algún defecto o error durante la ejecución en jasperreports-xxxjar, podemos solucionarlo y compilar el JAR nuevamente usando el archivo build.xml.

Establecer el CLASSPATH

Para usar JasperReport, necesitamos establecer los siguientes archivos en nuestro CLASSPATH -

  • jasperreports-xxxjar, donde xxx es la versión de JasperReports. Esto se encuentra en el directorio C: \ tools \ jasperreports-xxx \ dist).

  • Todos los archivos JAR del subdirectorio lib (C: \ tools \ jasperreports-xxx \ lib).

En el momento de la instalación, usamos JasperReport versión 5.0.1. Haga clic derecho en 'Mi PC' y seleccione 'Propiedades', haga clic en el botón 'Variables de entorno' en la pestaña 'Avanzado'. Ahora actualice la variable 'Ruta' con estoC:\tools\jasperreports-5.0.1\dist\jasperreports-5.0.1.jar:C:\tools\jasperreports-5.0.1\lib. Ahora está listo para crear sus informes.

En todos los ejemplos de este tutorial, hemos utilizado tareas ANT para generar informes. losbuildfile se encarga de importar todos los archivos JAR necesarios para generar informes. Por lo tanto, configurar CLASSPATH como se mencionó anteriormente solo ayudará a aquellos que deseen generar informes sin usar ANT.

Configuración de compilación

Todos los ejemplos de este tutorial:

  • se han escrito utilizando un editor de texto simple.

  • se han guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

  • se han compilado y ejecutado desde el símbolo del sistema, utilizando Apache ANT. Usaremos unbaseBuild.xml archivo, que importaremos en ANT build.xmlarchivo en los capítulos siguientes. Guarde este archivo en C: \ tools \ jasperreports-5.0.1 \ test. A continuación se muestra el contenido del archivo baseBuild.xml:

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportExample" basedir = ".">
   <description>Previews our JasperReport XML Design</description>
   <property name = "file.name" value = "jasper_report_template" />
   
   <!-- Directory where the JasperReports project file was extracted
   needs to be changed to match the local environment -->
   <property name = "jasper.dir" value = "../" />
   <property name = "dist.dir" value = "${jasper.dir}/dist" /> <property name = "lib.dir" value = "${jasper.dir}/lib" />
   <property name = "src.dir" value = "src" />
   <property name = "classes.dir" value = "classes" />
   <property name = "main-class" value = "com.tutorialspoint.HelpMe" />

   <path id = "classpath">
      <pathelement location = "./" />
      <pathelement location = "${classes.dir}" /> <fileset dir = "${lib.dir}">
         <include name = "**/*.jar" />
      </fileset>
	  
      <fileset dir = "${dist.dir}"> <include name = "**/*.jar" /> </fileset> </path> <target name = "compile" depends = "clean-sample"> <mkdir dir = "${classes.dir}"/>
		
      <javac srcdir = "${src.dir}" destdir = "${classes.dir}" 
         classpathref = "classpath" />
   </target>
   
   <target name = "run" depends = "compile">
      <echo message = "Running class : ${main-class}"/> <java fork = "true" classname = "${main-class}">
         <classpath>
            <path refid = "classpath" />
         </classpath>
      </java>
   </target>
   
   <target name = "clean-sample">
      <delete dir = "${classes.dir}" /> <delete file = "./${file.name}.jasper" />
      <delete file = "./${file.name}.jrprint" />
   </target>
   
</project>

Este archivo tiene todos los destinos requeridos, como limpiar los directorios, compilar los archivos java y ejecutar los archivos de clase.

A continuación se muestran los detalles, mencionados por varios directorios en baseBuild.xml. Suponiendo que el directorio actual es C: \ tools \ jasperreports-5.0.1 \ test) -

  • jasper.dir - es el directorio C: \ tools \ jasperreports-5.0.1

  • lib.dir - es el directorio C: \ tools \ jasperreports-5.0.1 \ lib

  • src.dir - es C: \ tools \ jasperreports-5.0.1 \ test \ src

  • classes.dir - es C: \ tools \ jasperreports-5.0.1 \ test \ classes

  • clase principal - com.tutorialspoint.HelpMe. Esta clase es una clase simple que se ejecuta, cuando no se pasa ningún nombre de archivo de clase desde la línea de comandos. Guarde este archivo en C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

public class HelpMe {
   public static void main(String[] args) {
      System.out.println("This is the default class executed."
         + "Please pass the fully qualified class" + " name to be executed as command line"
         + " parameter, for example," + " com.tutorialspoint.HelpMe ");
   }
}

Clases de gerentes de Jasper

Hay varias clases que se utilizarán para compilar un diseño de informe JRXML, para completar un informe, para imprimir un informe, para exportar a archivos PDF, HTML y XML, ver los informes generados y diseñar el informe.

La lista de estas clases es:

  • net.sf.jasperreports.engine.JasperCompileManager: se utiliza para compilar una plantilla de informe JRXML.

  • net.sf.jasperreports.engine.JasperFillManager: se utiliza para completar un informe con datos de la fuente de datos.

  • net.sf.jasperreports.engine.JasperPrintManager: se utiliza para imprimir los documentos generados por la biblioteca JasperReports.

  • net.sf.jasperreports.engine.JasperExportManager: se utiliza para obtener contenido PDF, HTML o XML para los documentos producidos por el proceso de llenado de informes.

  • net.sf.jasperreports.view.JasperViewer: representa una aplicación Java Swing simple, que puede cargar y mostrar informes.

  • net.sf.jasperreports.view.JasperDesignViewer: se utiliza en el momento del diseño para obtener una vista previa de las plantillas de informes.

Configuración de Apache ANT

Vamos a construir todos los ejemplos usando Apache ANT. Por lo tanto, consulte el capítulo ANT - Configuración del entorno para configurar Apache ANT en su sistema.

El propósito principal de JasperReports es crear documentos orientados a páginas, listos para imprimir de una manera simple y flexible. El siguiente diagrama de flujo muestra un flujo de trabajo típico al crear informes.

Como se muestra en la imagen, el ciclo de vida tiene las siguientes fases distintas:

  • Diseño del informe : en este paso, creamos el archivo JRXML, que es un documento XML que contiene la definición del diseño del informe. Podemos utilizar cualquier editor de texto o iReportDesigner para crearlo manualmente. Si se utiliza iReportDesigner, el diseño se diseña de forma visual, por lo que se puede ignorar la estructura real del JRXML.

  • Compilación del informe : en este paso, JRXML se compila en un objeto binario llamado archivo Jasper (* .jasper). Esta compilación se realiza por motivos de rendimiento. Los archivos Jasper son lo que necesita enviar con su aplicación para ejecutar los informes.

  • Ejecutar el informe (completar datos en el informe) : en este paso, los datos de la aplicación se completan en el informe compilado. La clase net.sf.jasperreports.engine.JasperFillManager proporciona las funciones necesarias para completar los datos en los informes. Se crea un archivo de impresión Jasper (* .jrprint), que se puede utilizar para imprimir o exportar el informe.

  • Exportación del informe al formato deseado : en este paso, podemos exportar el archivo de impresión Jasper creado en el paso anterior a cualquier formato usando JasperExportManager. Como Jasper proporciona varias formas de exportación, por lo tanto, con la misma entrada, podemos crear múltiples representaciones de los datos.

En los capítulos siguientes se ofrece una descripción detallada de cada uno de los pasos anteriores.

Las plantillas JRXML (o archivos JRXML) en JasperReport son archivos XML estándar, que tienen una extensión de .jrxml. Todos los archivos JRXML contienen la etiqueta <jasperReport>, como elemento raíz. Esto a su vez contiene muchos subelementos (todos ellos son opcionales). El marco JasperReport puede manejar diferentes tipos de fuentes de datos. En este tutorial, mostraremos cómo generar un informe básico, simplemente pasando una colección de objetos de datos Java (usando beans de Java) al motor JasperReport. El informe final mostrará una lista de personas con las categorías que incluyen sus nombres y países.

Los siguientes pasos se tratan en este capítulo para describir cómo diseñar un JasperReport

  • Creación de una plantilla de informe JRXML y.
  • Vista previa de la plantilla de informe XML.

Creación de una plantilla de informe JRXML

Cree el archivo JRXML, que es jasper_report_template.jrxmlusando un editor de texto y guarde este archivo en C: \ tools \ jasperreports-5.0.1 \ test según la configuración de nuestro entorno.

<?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>

Aquí están los detalles de los campos principales en la plantilla de informe anterior:

  • <queryString>: está vacío (ya que estamos pasando datos a través de Java Beans). Por lo general, contiene la instrucción SQL, que recupera el resultado del informe.

  • <nombre de campo>: este elemento se utiliza para mapear datos de fuentes de datos o consultas en plantillas de informes. name se reutiliza en el cuerpo del informe y distingue entre mayúsculas y minúsculas.

  • <fieldDescription>: este elemento asigna el nombre del campo con el elemento apropiado en el archivo XML.

  • <staticText>: define el texto estático que no depende de fuentes de datos, variables, parámetros o expresiones de informes.

  • <textFieldExpression>: esto define la apariencia del campo de resultado.

  • $ F {país}: esta es una variable que contiene el valor del resultado, campo predefinido en la etiqueta <nombre del campo>.

  • <banda>: las bandas contienen los datos, que se muestran en el informe.

Una vez que el diseño del informe esté listo, guárdelo en el directorio C: \.

Vista previa de la plantilla de informe XML

Hay una utilidad net.sf.jasperreports.view.JasperDesignViewer disponible en el archivo JAR de JasperReports, que ayuda a obtener una vista previa del diseño del informe sin tener que compilarlo o completarlo. Esta utilidad es una aplicación Java independiente, por lo que se puede ejecutar con ANT.

Escribamos un objetivo ANT viewDesignXMLpara ver el JRXML. Entonces, creemos y guardemosbuild.xmlen el directorio C: \ tools \ jasperreports-5.0.1 \ test (debe colocarse en el mismo directorio donde se coloca JRXML). Aquí está el archivo build.xml:

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewDesignXML" basedir = ".">

   <import file = "baseBuild.xml" />
   <target name = "viewDesignXML" description = "Design viewer is 
      launched to preview the JXML report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-XML" />
         <arg value = "-F${file.name}.jrxml" />
         <classpath refid = "classpath" />
      </java>
   </target>

</project>

A continuación, abramos un símbolo del sistema y vayamos al directorio donde se coloca build.xml. Ejecuta el comandoant(Dado que viewDesignXML es el destino predeterminado). La salida es la siguiente:

C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

viewDesignXML:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[java] log4j:WARN Please initialize the log4j system properly.

La advertencia de Log4j se puede ignorar y, como resultado de la ejecución anterior, se abre una ventana con la etiqueta "JasperDesignViewer", que muestra la vista previa de nuestra plantilla de informe.

Como vemos, solo se muestran las expresiones de informe para obtener los datos, ya que JasperDesignViewer no tiene acceso a la fuente de datos real ni a los parámetros del informe. Termine JasperDesignViewer cerrando la ventana o presionando Ctrl-c en la ventana de la línea de comandos.

Hemos generado la plantilla JasperReport (archivo JRXML) en el capítulo anterior. Este archivo no se puede utilizar directamente para generar informes. Tiene que ser compilado en el formato binario nativo de JasperReport, llamadoJasperarchivo. Al compilar, transformamos el objeto JasperDesign en el objeto JasperReport -

La interfaz net.sf.jasperreports.engine.design.JRCompiler juega un papel central durante la compilación. Esta interfaz tiene varias implementaciones según el lenguaje utilizado para las expresiones de informe, que se pueden escribir en Java, Groovy, JavaScript o cualquier otro lenguaje de programación siempre que la implementación del compilador pueda evaluarlo en tiempo de ejecución.

Podemos compilar el archivo JRXML de las siguientes dos formas:

  • Recopilación programática.
  • Compilación mediante tarea ANT.

Compilación programática de JRXML

La API de JasperReports ofrece una clase de fachada net.sf.jasperreports.engine.JasperCompileManager para compilar un JasperReport. Esta clase consta de varios métodos estáticos públicos para compilar plantillas de informes. La fuente de las plantillas pueden ser archivos, flujos de entrada y / o objetos de memoria.

El contenido del archivo JRXML (jasper_report_template.jrxml) es el siguiente. Se guarda en el directorioC:\tools\jasperreports-5.0.1\test -

<?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>

El siguiente código demuestra la compilación del archivo jasper_report_template.jrxml anterior .

package com.tutorialspoint;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;

public class JasperReportCompile {

   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test" + 
         "/jasper_report_template.jrxml";

      System.out.println("Compiling Report Design ...");
      try {
          /**
          * Compile the report to a file name same as
          * the JRXML file name
          */
         JasperCompileManager.compileReportToFile(sourceFileName);
      } catch (JRException e) {
         e.printStackTrace();
      }
      System.out.println("Done compiling!!! ...");
   }
}

Compilación de plantillas

Como siguiente paso, guardemos el contenido anterior en el archivo. C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.javae importe baseBuild.xml en el archivo build.xml como se muestra a continuación. El baseBuild.xml ya tiene elcompile y run objetivos -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "run" basedir = ".">

   <import file = "baseBuild.xml"/>

</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 comandoant -Dmain-class = com.tutorialspoint.JasperReportCompile como -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.JasperReportCompile
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.JasperReportCompile
   [java] Compiling Report Design ...
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] Done compiling!!! ...

BUILD SUCCESSFUL
Total time: 8 seconds

Como resultado de la compilación anterior, verá que el archivo de plantilla jasper_report_template.jasper se generó en el directorio C: \ tools \ jasperreports-5.0.1 \ test.

Vista previa de la plantilla de informe compilado

El net.sf.jasperreports.view.JasperDesignViewer se puede utilizar para obtener una vista previa de las plantillas de informes compiladas y las plantillas JRXML.

Para avanzar más, agreguemos un nuevo objetivo viewDesignal archivo build.xml anterior, que nos permitirá obtener una vista previa del informe compilado. A continuación se muestra el build.xml revisado:

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 = "viewDesign" basedir = ".">

   <import file = "baseBuild.xml" />
   <target name = "viewDesign" description="Design viewer is launched 
      to preview the compiled report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-F${file.name}.jasper" />
         <classpath refid = "classpath" />
      </java>
   </target>

</project>

Ejecutemos el comando - ant(viewDesign es el destino predeterminado) en el símbolo del sistema. Se abre la ventana JasperDesignViewer mostrando el archivo Jasper como se muestra a continuación:

Compilación a través de la tarea ANT

Como la compilación de plantillas de informes se parece más a un trabajo en tiempo de diseño que a un trabajo en tiempo de ejecución, la biblioteca JasperReport tiene una tarea ANT personalizada. Para ciertas situaciones, cuando se crea un archivo JRXML en tiempo de ejecución, no podemos usar esta tarea ANT. La tarea ANT personalizada se llama JRC y la implementa la clase: net.sf.jasperreports.ant.JRAntCompileTask . Su sintaxis y comportamiento son muy similares a los integrados<javac> Tarea ANT.

Compilación de plantillas

Agreguemos un nuevo objetivo compilereportdesinga nuestro build.xml existente. Aquí, la carpeta de origen se especifica mediante una etiqueta <src> anidada con los catálogos de archivos. La etiqueta de origen anidada permite compilar plantillas de informes que se encuentran dispersas en muchas ubicaciones diferentes y no están agrupadas en una única carpeta de origen de informes raíz. A continuación se muestra el build.xml revisado:

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "compilereportdesing" basedir = ".">
   
   <import file = "baseBuild.xml" />
   <target name = "viewDesign" description = "Design viewer is 
      launched to preview the compiled report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-F${file.name}.jasper" />
         <classpath refid = "classpath" />
      </java>
		
   </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 el símbolo del sistema y vayamos al directorio donde se coloca build.xml. Ejecuta el comandoant(compilereportdesing es el destino predeterminado); La salida es la siguiente:

C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See
   http://logging.apache.org/log4j/1.2/faq.html#noconfig
   for more info.
   [jrc] File :
   C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

BUILD SUCCESSFUL
Total time: 5 seconds

El archivo jasper_report_template.jasper se genera en el sistema de archivos (en nuestro caso, C: \ tools \ jasperreports-5.0.1 \ test directorio). Este archivo es idéntico al archivo generado mediante programación llamando a net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile (). Podemos obtener una vista previa de este archivo jaspe, ejecutandoant viewDesign.

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.

Los principales insumos necesarios 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 .

El resultado generado por este proceso es un .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).

La salida del proceso de llenado de informes Los objetos JasperPrint se pueden ver utilizando un componente de visor incorporado, o imprimirse o exportarse a formatos de documentos más populares como PDF, HTML, RTF, XLS, ODT, CSV o XML. La visualización y la impresión de los documentos de Jasper se discutirán en este capítulo y la exportación se discutirá en el próximo capítulo, es decir, "Exportar informes".

Ver informes

JasperReport proporciona un visor integrado para ver los informes generados en su formato original. Es un componente basado en swing y otras aplicaciones Java pueden integrar este componente sin tener que exportar los documentos a otros formatos para poder verlos o imprimirlos. La clase net.sf.jasperreports.view.JRViewer representa este componente visual. Esta clase también se puede personalizar según las necesidades de la aplicación, subclasificándola.

JasperReports también tiene una aplicación Swing, que utiliza el componente visual para ver los informes. Esta aplicación ayuda a ver informes en el mismo formato que se produce * .jrprint. Esta aplicación Swing está implementada en la clase net.sf.jasperreports.view.JasperViewer . Para ver los informes que utilizan esta clase, debemos ajustarlos a un objetivo ANT.

Ver el informe generado

El siguiente ejemplo demuestra cómo ver un informe usando la clase JasperViewer

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 JasperReports, 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();
      }
   }
}

Escribamos un objetivo viewFillReportal archivo build.xml. 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer
      to preview the report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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(viewFillReport es el destino predeterminado). Como resultado, vemos una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:

Impresión de informes

Podemos imprimir los documentos generados por la biblioteca JasperReports (en su formato propietario, es decir, objetos JasperPrint ) usando la clase net.sf.jasperreports.engine.JasperPrintManager . Esta es una clase de fachada que se basa en la API de impresión de Java 2. También podemos imprimir los documentos una vez que los documentos JasperReport se exportan a otros formatos como HTML o PDF.

Impresión del informe generado

El siguiente código demuestra la impresión de un informe. Actualicemos nuestra clase existente JasperReportFill. Usaremos el método JasperPrintManager.printReport () . Este método toma el nombre del archivo fuente (aquí pasamos el archivo .jrprint , que generamos en el paso anterior usando el método JasperFillManager.fillReportToFile ()) como primer parámetro. El segundo parámetro es el booleano para mostrar el diálogo de impresión estándar (lo hemos configurado entrue aquí).

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.JasperPrintManager;
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";
      String printFileName = null;
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
    	   printFileName = JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
         if(printFileName != null){
            JasperPrintManager.printReport( printFileName, true);
         }
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Ahora, guardemos este archivo en el directorio C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint. Compilaremos y ejecutaremos este archivo usando ANT. El contenido de build.xml es el siguiente:

<?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 el símbolo del sistema y vayamos al directorio donde se coloca build.xml. Finalmente, ejecute el comandoant -Dmain-class=com.tutorialspoint.JasperReportPrint. Como resultado, aparece un cuadro de diálogo de impresión. Haga clic en Aceptar para imprimir el documento.

Hemos visto en el capítulo anterior cómo imprimir y ver un documento generado por JasperReport. Aquí veremos cómo transformar o exportar estos informes a otros formatos como PDF, HTML y XLS. Se proporciona la clase de fachada net.sf.jasperreports.engine.JasperExportManager para lograr esta funcionalidad. Exportar significa transformar el objeto JasperPrint (archivo .jrprint) en un formato diferente.

El siguiente código (JasperReportExport.java) demuestra el proceso de exportación del documento JasperReport. JasperExportManager proporciona métodos para exportar un informe a PDF, HTML y XML únicamente. Para exportar al formato XLS, hemos utilizado la clase net.sf.jasperreports.engine.export.JRXlsExporter . Este código genera los siguientes tres archivos:

  • sample_report.pdf
  • sample_report.html
  • sample_report.xls

Exportar a otros formatos

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, contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los que se indican a continuación:

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;
   }
}

El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los que se indican a continuación:

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.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRXlsExporter;

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

      Map parameters = new HashMap();
      try {
         printFileName = JasperFillManager.fillReportToFile(sourceFileName,
            parameters, beanColDataSource);
         if (printFileName != null) {
            /**
             * 1- export to PDF
             */
            JasperExportManager.exportReportToPdfFile(printFileName,
               "C://sample_report.pdf");

            /**
             * 2- export to HTML
             */
            JasperExportManager.exportReportToHtmlFile(printFileName,
               "C://sample_report.html");

            /**
             * 3- export to Excel sheet
             */
            JRXlsExporter exporter = new JRXlsExporter();

            exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME,
               printFileName);
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
               "C://sample_report.xls");

            exporter.exportReport();
         }
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Aquí, hemos incluido la lógica para exportar el archivo de impresión jasper a formato pdf, html y xls.

Generando informes

Compilemos y ejecutemos los archivos anteriores utilizando nuestro proceso de compilación ANT habitual. El archivo build.xml es el siguiente:

<?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>

Vaya al símbolo del sistema y luego al directorio C: \ tools \ jasperreports-5.0.1 \ test, donde se coloca build.xml. Finalmente, ejecute el comandoant -Dmain-class=com.tutorialspoint.JasperReportFill. La salida es la siguiente:

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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting t
   [javac] Compiling 4 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.

executereport:
   [echo] Im here

BUILD SUCCESSFUL
Total time: 32 seconds

Como resultado de la ejecución anterior, encontrará tres archivos sample_report.pdf, sample_report.html, sample_report.xls generados en el directorio C: \.

La entrada principal para completar un informe son: plantilla de informe, parámetros y fuentes de datos. Este capítulo describirá los parámetros y en el próximo capítulo discutiremos las fuentes de datos.

Los parámetros son las referencias de objeto, que se pasan durante las operaciones de llenado de informes al motor de informes. Los datos que no se pueden pasar a través de la fuente de datos, se pueden pasar utilizando parámetros. Los datos como el nombre del autor, el título del informe, etc. se pueden pasar a través de parámetros. Una plantilla JasperReports o una plantilla JRXML puede tener cero o más elementos de parámetro.

Declaración de parámetros

Declaración de parámetros de la siguiente manera:

<parameter name = "exampleParameter" class = "java.lang.String" />

El atributo de nombre

El atributo de nombre del elemento <parameter> es obligatorio. Hace referencia al parámetro en las expresiones del informe por su nombre. El nombre del parámetro debe ser una sola palabra. No debe contener caracteres especiales como puntos o comas.

El atributo de clase

El atributo de clase también es obligatorio y especifica el nombre de la clase para los valores de los parámetros. Su valor predeterminado es java.lang.String . Esto se puede cambiar a cualquier clase disponible en tiempo de ejecución. Independientemente del tipo de parámetro de informe, el motor se encarga de convertir las expresiones de informe en las que se utiliza el token $ P {}, por lo que no es necesario realizar las conversiones manuales.

Los valores de los parámetros del informe siempre se empaquetan en un objeto java.util.Map, que tiene el nombre del parámetro como clave. Los parámetros del informe se pueden utilizar en la cadena de consulta del informe para personalizar aún más el conjunto de datos recuperados de la base de datos. Actúan como filtros dinámicos en la consulta que proporciona datos para el informe.

Parámetros incorporados

A continuación se muestran los parámetros de informe predefinidos, listos para usar en las expresiones:

S.NO Nombre y descripción del parámetro
1

REPORT_PARAMETERS_MAP

Contiene un mapa con todos los parámetros integrados y definidos por el usuario.

2

REPORT_CONNECTION

Esto apunta a la clase java.sql.Connection proporcionada por el usuario, utilizada para fuentes de datos JDBC.

3

REPORT_DATA_SOURCE

Esta es una instancia proporcionada por el usuario de JRDataSource que representa uno de los tipos de fuente de datos integrados o uno definido por el usuario.

4

REPORT_MAX_COUNT

Este es un valor java.lang.Integer , que permite a los usuarios limitar los registros de la fuente de datos.

5

REPORT_SCRIPTLET

Esto apunta a net.sf.jasperreports.engine.JRAbstractScriptlet y contiene una instancia del scriptlet de informe proporcionado por el usuario.

6

REPORT_LOCALE

Esta es una instancia de java.util.Locale , que contiene la configuración regional deseada del paquete de recursos.

7

REPORT_RESOURCE_BUNDLE

Esto apunta al objeto java.util.ResourceBundle y contiene mensajes localizados.

8

REPORT_TIME_ZONE

Esta es una instancia de java.util.TimeZone , utilizada para el formato de fecha.

9

REPORT_VIRTUALIZER

Esta es una instancia del objeto net.sf.jasperreports.engine.JRVirtualizer y se utiliza para la virtualización de la página (optimizar el consumo de memoria).

10

REPORT_CLASS_LOADER

Esta es una instancia de java.lang.ClassLoader que se utilizará durante el proceso de llenado del informe para cargar recursos como imágenes, fuentes y plantillas de subinformes.

11

IS_IGNORE_PAGINATION

Si se establece en java.lang.Boolean.TRUE, el informe se generará en una página larga y no se producirán saltos de página.

Ejemplo

Pasemos ReportTitle y Author al informe (generado por JasperReportFill.java). Archivo revisadoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java es como sigue -

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();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los siguientes:

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;
   }
}

El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los que se indican a continuación:

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;
   }
}

Agreguemos parámetros el <ReportTitle> y <Author> a nuestra plantilla de informe existente ( Diseños de informe de capítulo ). El título y el autor del informe se mostrarán al principio del informe. La plantilla de informe revisada (jasper_report_template.jrxml) es la siguiente. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <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>

   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
           
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
				
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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>

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />

   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview
      the report stored in the .JRprint file.">
      
		
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino 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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

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

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig
   for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.

viewFillReport:
   [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: 18 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la siguiente pantalla:

Aquí, vemos que el ReportTitle "Lista de contactos" y el Autor "Preparado por Manisha" se muestran al principio del informe.

Las fuentes de datos son contenedores de datos estructurados. Mientras genera el informe, el motor JasperReports obtiene datos de las fuentes de datos. Los datos se pueden obtener de las bases de datos, archivos XML, matrices de objetos y colección de objetos. Vimos en el capítulo Llenado de Informes , el método fillReportXXX () espera recibir una fuente de datos del informe, que tiene que completar, en forma denet.sf.jasperreports.engine.JRDataSource objeto o un java.sql.Connection (cuando los datos del informe se encuentran en una base de datos relacional).

La interfaz JRDataSource tiene solo dos métodos, que deben implementarse:

  • public boolean next () lanza JRException;

    • En el momento de completar el informe, el motor de informes llama a este método en el objeto de origen de datos cuando se itera a través de los datos.

  • public Object getFieldValue (JRField jrField) lanza JRException;

    • Este método proporciona el valor para cada campo de informe en el registro de fuente de datos actual.

La única forma de recuperar datos de la fuente de datos es utilizando los campos del informe. Hay varias implementaciones predeterminadas de la interfaz JRDataSource, dependiendo de la forma en que se adquieran los registros en la fuente de datos.

Implementaciones de fuentes de datos

La tabla que se muestra a continuación resume las fuentes de datos y sus clases de implementación:

Fuente de datos Clase de implementación
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Basado en mapas net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource
TableModel net.sf.jasperreports.engine.data.JRTableModelDataSource
XML net.sf.jasperreports.engine.data.JRXmlDataSource
CSV net.sf.jasperreports.engine.data.JRCsvDataSource
XLS net.sf.jasperreports.engine.data.JRXlsDataSource
Vacío net.sf.jasperreports.engine.JREmptyDataSource

Fuentes de datos JDBC

Clase JRResultSetDataSourcecraps un objeto java.sql.ResultSet . Se trata de las implementaciones de fuentes de datos más utilizadas cuando los datos del informe se extraen de una base de datos relacional. Si se pasa una java.sql.Connection al motor, primero ejecuta la consulta relacionada y almacena el objeto java.sql.ResultSet devuelto en una instancia de JRResultSetDataSource.

Fuentes de datos JavaBean

Clases JRBeanArrayDataSource y JRBeanCollectionDataSourcerepresentan implementaciones que pueden envolver matrices y colecciones de objetos JavaBean. Cada objeto dentro de la matriz o colección se verá como un registro en este tipo de fuente de datos. El mapeo entre una propiedad JavaBean particular y el campo de informe correspondiente se realiza mediante convenciones de nomenclatura. El nombre del campo del informe debe ser el mismo que el nombre de la propiedad JavaBean como se especifica en las especificaciones de JavaBeans.

En todos los ejemplos de este tutorial, hemos utilizado JRBeanCollectionDataSource.

Fuentes de datos basadas en mapas

Las clases de implementación JRMapArrayDataSource y JRMapCollectionDataSourceson útiles si la aplicación principal ya almacena los datos de informes disponibles en la memoria como objetos java.util.Map . Cada objeto Mapa de la colección o matriz envuelta se considera un registro virtual en la fuente de datos, y el valor de cada campo de informe se extrae del mapa utilizando el campo de informe denominado como clave.

Fuentes de datos de TableModel

En muchas aplicaciones del lado del cliente, los datos se muestran en formato tabular. Un requisito común en muchas aplicaciones es permitir que el usuario imprima este formato tabular como un informe. Clase de implementaciónJRTableModelDataSourcehace que la tarea de generar informes en formato tabular sea trivial para las aplicaciones Swing. Esta clase envuelve un objeto javax.swing.table.TableModel. Se puede acceder a las columnas del objeto TableModel envuelto por sus nombres o por sus índices basados ​​en 0.

Fuentes de datos XML

Clase JRXmlDataSourcees una implementación de fuente de datos basada en DOM, que usa expresiones XPath para seleccionar datos del documento XML. Los registros en la fuente de datos XML están representados por elementos de nodo seleccionados mediante la expresión XPath. Los valores de campo se recuperan de cada registro utilizando la expresión XPath proporcionada por la descripción del campo (elemento <fieldDescription> en JRXML).

XPath es un lenguaje que se utiliza para navegar por los atributos y elementos de un documento XML. Puede encontrar más información sobre XPath enhttp://www.w3.org/TR/xpath.

Fuentes de datos CSV

JRCsvDataSourcerepresenta una implementación para fuentes de datos, que recuperan sus datos de archivos de texto estructurados; generalmente CSV. Los valores de campo se recuperan utilizando su índice de columna.

Fuentes de datos XLS

JRXlsDataSourcerepresenta una implementación para fuentes de datos, que recuperan sus datos de documentos de Excel. El mapeo de campo de informe para esta implementación de fuente de datos también se basa en el índice de columna de campo.

Fuentes de datos vacías

La clase JREmptyDataSource, simula una fuente de datos con un número determinado de registros vacíos virtuales en su interior. Las herramientas de la interfaz de usuario lo utilizan para ofrecer funciones básicas de vista previa de informes, o en plantillas de informes especiales, o con fines de prueba y depuración.

Fuentes de datos rebobinables

los net.sf.jasperreports.engine.JRRewindableDataSourceextiende la interfaz básica de JRDataSource . Agrega solo un método, llamado moveFirst (), a la interfaz. Este método está destinado a mover el cursor al primer elemento de la fuente de datos.

Las fuentes de datos rebobinables son útiles cuando se trabaja con subinformes colocados dentro de una banda que no puede dividirse debido a la configuración isSplitAllowed = "false" y no hay suficiente espacio en la página actual para que se genere el subinforme.

Todas las implementaciones de fuentes de datos anteriores son rebobinables excepto JRResultSetDataSource, ya que no admite mover el puntero de registro hacia atrás. Esto plantea un problema solo si esta fuente de datos se usa manualmente para ajustar un java.sql.ResultSet antes de pasarlo al subinforme. No hay ningún problema, si la consulta SQL reside en la plantilla de subinforme, ya que el motor la ejecutará nuevamente al reiniciar el subinforme en la página siguiente.

Proveedores de fuentes de datos

La biblioteca JasperReports tiene una interfaz net.sf.jasperreports.engine.JRDataSourceProvider. Esto ayuda a crear y eliminar objetos de origen de datos. Al crear una plantilla de informe utilizando herramientas GUI, se necesita una herramienta especial para personalizar la fuente de datos del informe. JRDataSourceProvider es la forma estándar de conectar fuentes de datos personalizadas en una herramienta de diseño. Una implementación personalizada de esta interfaz debe implementar los siguientes métodos que permitan crear y eliminar objetos de fuente de datos y también métodos para enumerar los campos de informe disponibles dentro de la fuente de datos si es posible:

public boolean supportsGetFieldsOperation();

public JRField[] getFields(JasperReport report)
   throws JRException, UnsupportedOperationException;

public JRDataSource create(JasperReport report) throws JRException;

public void dispose(JRDataSource dataSource) throws JRException;

Los campos de informe son elementos que representan la asignación de datos entre la fuente de datos y la plantilla de informe. Los campos se pueden combinar en las expresiones del informe para obtener el resultado deseado. Una plantilla de informe puede contener cero o más elementos <field>. Al declarar campos de informe, la fuente de datos debe proporcionar datos correspondientes a todos los campos definidos en la plantilla de informe.

Declaración de campo

La declaración de campo se realiza como se muestra a continuación:

<field name = "FieldName" class = "java.lang.String"/>

El atributo de nombre

El atributo de nombre del elemento <field> es obligatorio. Hace referencia al campo en las expresiones de informe por nombre.

El atributo de clase

El atributo de clase especifica el nombre de la clase para los valores de campo. Su valor predeterminado es java.lang.String . Esto se puede cambiar a cualquier clase disponible en tiempo de ejecución. Independientemente del tipo de campo de informe, el motor se encarga de convertir las expresiones de informe en las que se utiliza el token $ F {}, por lo que las conversiones manuales no son necesarias.

campo Descripción

El elemento <fieldDesciption> es un elemento opcional. Esto es muy útil al implementar una fuente de datos personalizada. Por ejemplo, podemos almacenar una clave o alguna información, mediante la cual podemos recuperar el valor del campo de la fuente de datos personalizada en tiempo de ejecución. Al usar el elemento <fieldDesciption> en lugar del nombre del campo, puede superar fácilmente las restricciones de las convenciones de nomenclatura de campos al recuperar los valores de campo de la fuente de datos.

A continuación se muestra un fragmento de código de nuestro archivo JRXML existente ( Diseños de informes de capítulo ). Aquí, podemos ver el uso dename, classy fieldDescription elementos.

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

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

Ordenar campos

En los momentos en que se requiere la clasificación de datos y la implementación de la fuente de datos no la admite (por ejemplo, fuente de datos CSV), JasperReports admite la clasificación de fuentes de datos basada en campos en memoria. La clasificación se puede realizar utilizando uno o más elementos <sortField> en la plantilla de informe.

Si se especifica al menos un campo de clasificación, durante el proceso de llenado del informe, la fuente de datos se pasa a una instancia de JRSortableDataSource . Esto, a su vez, obtiene todos los registros de la fuente de datos, realiza la clasificación en memoria de acuerdo con los campos especificados y reemplaza la fuente de datos original.

El nombre del campo de clasificación debe ser idéntico al nombre del campo del informe. Los campos usados ​​para ordenar deben tener tipos que implementen java.util.Comparable. La clasificación de orden natural se realiza para todos los campos excepto los de tipo java.lang.String (para el tipo de cadena, se utiliza el clasificador correspondiente a la configuración regional de llenado del informe). Cuando se especifican varios campos de clasificación, la clasificación se realizará utilizando los campos como claves de clasificación en el orden en que aparecen en la plantilla de informe. El siguiente ejemplo demuestra la función de clasificación.

Ejemplo de informe ordenado

Agreguemos el <sortField> elemento a nuestra plantilla de informe existente ( diseños de informe de capítulo ). Clasifiquemos el país del campo en orden descendente. La plantilla de informe revisada (jasper_report_template.jrxml) es la siguiente. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595" pageHeight = "842" 
   columnWidth = "515" leftMargin = "40" rightMargin = "40" 
   topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <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>
  
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
            
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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>

Los códigos de Java para el llenado de informes no se modifican. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son los que se indican a continuación:

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();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los que se indican a continuación:

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;
   }
}

El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los que se indican a continuación:

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;
   }
}

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview
      the report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino 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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

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

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig
   for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.

viewFillReport:
   [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: 18 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:

Aquí, podemos ver que los nombres de los países están ordenados alfabéticamente en orden descendente.

Las expresiones de informe son las poderosas funciones de JasperReports, que nos permiten mostrar datos calculados en un informe. Los datos calculados son los datos que no son datos estáticos y no se pasan específicamente como parámetro de informe o campo de fuente de datos. Las expresiones de informe se crean a partir de la combinación de parámetros, campos y datos estáticos del informe. El lenguaje Java se utiliza para escribir expresiones de informes de forma predeterminada. Los compiladores JasperReports admiten otros lenguajes de secuencias de comandos para expresiones de informes, como el lenguaje de secuencias de comandos Groovy, JavaScript o la secuencia de comandos BeanShell.

Este capítulo le explicará cómo funcionan las expresiones de informe, asumiendo que se han escrito utilizando únicamente el lenguaje Java. En una plantilla de informe JRXML, hay varios elementos que definen expresiones como:

  • <variableExpression>
  • <initialValueExpression>
  • <groupExpression>
  • <printWhenExpression>
  • <imageExpression>
  • <textFieldExpression>

Declaración de expresión

Básicamente, todas las expresiones de informe son expresiones de Java, que pueden hacer referencia a los campos del informe, las variables del informe y los parámetros del informe.

Referencia de campo en expresión

Para utilizar una referencia de campo de informe en una expresión, el nombre del campo debe colocarse entre $F{y} secuencias de caracteres, como se muestra a continuación -

<textfieldexpression>
   $F{Name}
</textfieldexpression>

A continuación se muestra un fragmento de código de nuestro archivo JRXML existente (capítulo Diseños de informes) :

<textFieldExpression class = "java.lang.String">
   <![CDATA[$F{country}]]>
</textFieldExpression>

Referencia variable en expresión

Para hacer referencia a una variable en una expresión, debemos poner el nombre de la variable entre $V{y} como se muestra en el ejemplo que se muestra a continuación:

<textfieldexpression>
   "Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>

Referencia de parámetro en expresión

Para hacer referencia a un parámetro en una expresión, el nombre del parámetro debe colocarse entre $P{y} como se muestra en el ejemplo que se muestra a continuación:

<textfieldexpression>
   "ReportTitle : " + $P{Title}
</textfieldexpression>

A continuación se muestra un fragmento de código de nuestro archivo JRXML existente, que demuestra la referencia de un parámetro en una expresión. (JRXML del capítulo Diseños de informes ) -

<textField isBlankWhenNull = "true" bookmarkLevel = "1">
   <reportElement x = "0" y = "10" width = "515" height = "30"/>
   
   <textElement textAlignment = "Center">
      <font size = "22"/>
   </textElement>
   
   <textFieldExpression class = "java.lang.String">
      <![CDATA[$P{ReportTitle}]]>
   </textFieldExpression>
   
   <anchorNameExpression>
      <![CDATA["Title"]]>
   </anchorNameExpression>
</textField>

<textField isBlankWhenNull = "true">
   <reportElement  x = "0" y = "40" width = "515" height = "20"/>
   
   <textElement textAlignment = "Center">
      <font size = "10"/>
   </textElement>
   
   <textFieldExpression class = "java.lang.String">
      <![CDATA[$P{Author}]]>
   </textFieldExpression>
</textField>

Como ha visto anteriormente, las referencias de parámetros, campos y variables son de hecho objetos Java reales. Conociendo su clase a partir de la declaración de parámetro, campo o variable realizada en la plantilla de informe, incluso podemos llamar a métodos en esas referencias de objeto en las expresiones.

El siguiente ejemplo muestra - cómo extraer y mostrar la primera letra del campo de informe java.lang.String "Nombre" -

<textFieldExpression>
   $F{Name}.substring(0, 1)
</textFieldExpression>

Referencia de paquete de recursos en Expression

Para hacer referencia a un recurso en una expresión, la clave debe colocarse entre$R{y} como se muestra en el ejemplo que se muestra a continuación:

<textfieldexpression>
   $R{report.title}
</textfieldexpression>

Según la configuración regional proporcionada por el tiempo de ejecución y la clave report.title , se carga el paquete de recursos asociado con la plantilla de informe. Por lo tanto, el título del informe se muestra extrayendo el valor de Cadena del paquete de recursos. Puede encontrar más información sobre internacionalización en el capítulo Internacionalización .

Calculadora

Calculator es una entidad en JasperReports, que evalúa expresiones e incrementa variables o conjuntos de datos en el momento de completar el informe. Durante el proceso de compilación, el compilador produce y almacena la información en el informe de compilación. Esta información se utiliza durante el tiempo de llenado del informe para construir una instancia de la clase net.sf.jasperreports.engine.fill.JRCalculator.

El archivo fuente de Java es generado y compilado por compiladores de informes basados ​​en Java sobre la marcha. Esta clase generada es una subclase del JRCalculator, y el código de bytes producido al compilarlo se almacena dentro del objeto JasperReport. Este bytcode se carga en el momento de completar el informe y se crea una instancia de la clase resultante para obtener el objeto de calculadora necesario para la evaluación de la expresión.

Expresiones condicionales

JasperReports no admite declaraciones if-else al definir expresiones de variable. En su lugar, puede utilizar los operadores ternarios{cond} ? {statement 1} : {statement 2}. Este operador se puede anidar dentro de una expresión Java para obtener el resultado deseado en función de múltiples condiciones.

Ejemplo de expresión condicional en el informe

Modifiquemos la plantilla de informe existente ( Diseños de informe de capítulo ) y agreguemos una expresión condicional para el país del campo. La plantilla de informe revisada (jasper_report_template.jrxml) es la siguiente. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595" pageHeight = "842" 
   columnWidth = "515" leftMargin = "40" rightMargin = "40" 
   topMargin = "50" bottomMargin = "50">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <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>
   
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]> </textFieldExpression> <anchorNameExpression> <![CDATA["Title"]]> </anchorNameExpression> </textField> <textField isBlankWhenNull = "true"> <reportElement x = "0" y = "40" width = "515" height = "20"/> <textElement textAlignment = "Center"> <font size = "10"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </title>
   
   <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}.isEmpty() ? "NO COUNTRY" : $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>

Los códigos de Java para el llenado de informes son los siguientes. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son como -

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();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son como -

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;
   }
}

Agregaremos un nuevo registro con el campo de país vacío en nuestra Lista de beans de Java. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son como -

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")); dataBeanList.add(produce("Tanmay", ""));
      
      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;
   }
}

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) se muestra a continuación.

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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview
      the report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class = com.tutorialspoint.JasperReportFill (viewFullReport es el destino predeterminado) como -

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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

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

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See
   http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.

viewFillReport:
    [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: 5 minutes 5 seconds

C:\tools\jasperreports-5.0.1\test>

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:

Aquí, podemos ver, para el último registro, no habíamos pasado ningún dato para el campo país, se está imprimiendo "NINGÚN PAÍS".

Las variables de informe son objetos especiales creados sobre la expresión del informe.

Las variables de informe simplifican las siguientes tareas:

  • Expresiones de informe, que se utilizan mucho en toda la plantilla de informe. Estas expresiones se pueden declarar solo una vez utilizando las variables del informe.

  • Las variables de informe pueden realizar varios cálculos basados ​​en los valores de las expresiones correspondientes, como recuento, suma, promedio, mínimo, máximo, varianza, etc.

Si las variables se definen en un diseño de informe, entonces se pueden hacer referencia a estas nuevas variables en las expresiones. Por lo tanto, el orden en el que se declaran las variables en el diseño de un informe es importante.

Declaración de variable

Una declaración de variable es la siguiente:

<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
   incrementGroup = "CityGroup" calculation = "Count">
   <variableExpression>
      <![CDATA[Boolean.TRUE]]>
   </variableExpression>
</variable>

Como se vio anteriormente, el elemento <variable> contiene un número de atributos. Estos atributos se resumen a continuación:

El atributo de nombre

De manera similar a los parámetros y campos , el atributo de nombre del elemento </variable> es obligatorio. Permite hacer referencia a la variable por su nombre declarado en las expresiones del informe.

El atributo de clase

El atributo de clase también es obligatorio que especifica el nombre de la clase para los valores de las variables. Su valor predeterminado es java.lang.String . Esto se puede cambiar a cualquier clase disponible en la ruta de clases, tanto en el momento de la compilación del informe como en el momento de completar el informe. El motor se encarga de la conversión de tipos en las expresiones de informes en las que se utiliza el token $ V {}, por lo que no se requiere la conversión de tipos manual.

Cálculo

Este atributo determina qué cálculo realizar en la variable al completar el informe. Las siguientes subsecciones describen todos los valores posibles para el atributo de cálculo del elemento <variable>.

  • Promedio : el valor de la variable es el promedio de cada valor no nulo de la expresión de la variable. Válido solo para variables numéricas.

  • Recuento : el valor de la variable es el recuento de instancias no nulas de la expresión de la variable.

  • Primero : el valor de la variable es el valor de la primera instancia de la expresión de la variable. Los valores posteriores se ignoran.

  • Más alto : el valor de la variable es el valor más alto para la expresión de la variable.

  • Más bajo : el valor de la variable es el valor más bajo para la expresión de la variable en el informe.

  • Nada : no se realizan cálculos en la variable.

  • Desviación estándar : el valor de la variable es la desviación estándar de todos los valores no nulos que coinciden con la expresión del informe. Válido solo para variables numéricas.

  • Suma : el valor de la variable es la suma de todos los valores no nulos devueltos por la expresión del informe.

  • Sistema : el valor de la variable es un cálculo personalizado (calculando el valor de esa variable usted mismo, utilizando la funcionalidad scriptlets de JasperReports).

  • Varianza : el valor de la variable es la varianza de todos los valores no nulos devueltos por la evaluación de la expresión de la variable del informe.

Clase Fábrica Incrementadora

Este atributo determina la clase utilizada para calcular el valor de la variable al llenar el registro actual en el informe. El valor predeterminado sería cualquier clase que implementenet.sf.jasperreports.engine.fill.JRIncrementerFactory. El motor utilizará la clase de fábrica para crear instancias de objetos incrementadores en tiempo de ejecución, según el atributo de cálculo establecido para la variable.

IncrementType

Esto determina cuándo recalcular el valor de la variable. Este atributo utiliza valores, como se muestra a continuación:

  • Columna : el valor de la variable se vuelve a calcular al final de cada columna.

  • Grupo : el valor de la variable se vuelve a calcular cuando cambia el grupo especificado por incrementGroup.

  • Ninguno : el valor de la variable se vuelve a calcular con cada registro.

  • Página : el valor de la variable se vuelve a calcular al final de cada página.

  • Informe : el valor de la variable se vuelve a calcular una vez, al final del informe.

IncrementGroup

Esto determina el nombre del grupo en el que se recalcula el valor de la variable, cuando incrementType es Group . Toma el nombre de cualquier grupo declarado en la plantilla de informe JRXML.

ResetType

Esto determina cuándo se restablece el valor de una variable. Este atributo utiliza valores, como se muestra a continuación:

  • Columna : el valor de la variable se restablece al comienzo de cada columna.

  • Grupo : el valor de la variable se restablece cuando cambia el grupo especificado por incrementGroup.

  • Ninguno : el valor de la variable nunca se restablece.

  • Página : el valor de la variable se restablece al principio de cada página.

  • Informe : el valor de la variable se restablece solo una vez, al comienzo del informe.

ResetGroup

Esto determina el nombre del grupo en el que se restablece el valor de la variable, cuando resetType es Group . Los valores de este atributo serían el nombre de cualquier grupo declarado en la plantilla de informe JRXML.

Variables de informe integradas

Hay algunas variables de sistema integradas, listas para usar en expresiones, de la siguiente manera:

S.NO Nombre y descripción de la variable
1

PAGE_NUMBER

El valor de esta variable es su número de página actual. Puede usarse para mostrar tanto el número de página actual como el número total de páginas usando una característica especial de los elementos del campo de texto de JasperReports, el atributo EvaluationTime .

2

COLUMN_NUMBER

Esta variable contiene el número de columna actual.

3

REPORT_COUNT

Esta variable de informe contiene el número total de registros procesados.

4

PAGE_COUNT

Esta variable contiene el número de registros que se procesaron al generar la página actual.

5

COLUMN_COUNT

Esta variable contiene el número de registros que se procesaron al generar la columna actual.

6

GroupName_COUNT

El nombre de esta variable se deriva del nombre del grupo al que corresponde, con el sufijo _COUNT secuencia. Esta variable contiene el número de registros del grupo actual.

Ejemplo

Agreguemos una variable (countNumber) a nuestra plantilla de informe existente ( Diseños de informe de capítulo ). Prefijamos el recuento a cada registro. La plantilla de informe revisada (jasper_report_template.jrxml) es la siguiente. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <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>
   
   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression>
         <![CDATA[Boolean.TRUE]]>
      </variableExpression>
   </variable>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
			
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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["  " + String.valueOf($V{countNumber}) +"."+$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

Los códigos de Java para el llenado de informes no se modifican. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son los que se indican a continuación:

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();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los que se indican a continuación:

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;
   }
}

El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los que se indican a continuación:

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;
   }
}

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

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 = "viewFillReport" basedir = ".">
   
   <import file = "baseBuild.xml" />
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview
      the report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino predeterminado) como -

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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

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

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig
   for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.

viewFillReport:
   [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: 18 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como en la siguiente pantalla:

Aquí, vemos que el recuento tiene un prefijo para cada registro.

Hablamos de la estructura de una plantilla de informe simple en el capítulo Introducción . En líneas similares, JasperReports estructura la plantilla de informe en varias secciones. Las secciones son partes del informe que tienen una altura especificada y pueden contener objetos del informe como líneas, rectángulos, imágenes o campos de texto.

El motor de informes itera a través de los registros virtuales de la fuente de datos del informe proporcionada, en el momento de completar el informe. Dependiendo del comportamiento definido de cada sección, el motor muestra cada sección del informe cuando es apropiado. Por ejemplo, la sección de detalles se representa para cada registro en la fuente de datos. Cuando se producen saltos de página, las secciones de encabezado y pie de página se representan según sea necesario.

En JasperReports, las secciones de informes y terminología también se denominan report bands. Las secciones están formadas por una o más bandas. Estas secciones se llenan repetidamente en el momento de generar el informe y preparan el documento final.

Secciones principales

Una plantilla de informe en JasperReports tiene las siguientes secciones principales:

<title></title>

<pageheader></pageheader>

<columnheader></columnheader>

<groupheader></groupheader>

<detail></detail>

<groupfooter></groupfooter>

<columnfooter></columnfooter>

<pagefooter></pagefooter>

<lastpagefooter></lastpagefooter>

<summary></summary>

<nodata></nodata>

<background></background>

La siguiente tabla resume cada una de las secciones:

S.NO Sección y descripción
1

Title

Esta sección aparece solo una vez al comienzo del informe.

2

Page Header

Esta sección aparece al principio de cada página del documento generado.

3

Column Header

Esta sección aparece al principio de cada columna en el documento generado. Si el informe solo tiene una columna definida, se ignoran las secciones de encabezado y pie de columna.

4

Group Header

Esta sección es introducida por un grupo de informes (capítulo Grupos ). Cada vez que la expresión de agrupación cambia su valor, la sección del encabezado del grupo se imprime encima de la sección de detalles. En caso de que se defina más de un grupo, el encabezado del grupo se imprime en el orden de definición del grupo.

5

Detail

Esta sección se repite para cada línea de datos proporcionada por la fuente de datos del informe. La sección de detalle puede estar formada por varias bandas.

6

Group Footer

Esta sección es introducida por un grupo de informes (capítulo Grupos ). La sección de pie de página del grupo se imprime debajo de la sección de detalles antes de que cambie el valor de la expresión de agrupación. El pie de página del grupo siempre se imprime para la última línea de datos en la fuente de datos. En caso de que, si se define más de un grupo, el pie de página del grupo se imprime en el orden inverso a la definición del grupo.

7

Column Footer

Esta sección aparece al final de cada columna. Si el recuento de columnas del informe es 1, se ignoran las secciones de encabezado y pie de columna.

8

Page Footer

Esta sección aparece al final de cada página.

9

Last Page Footer

Esta sección reemplaza el pie de página normal en la última página del informe. En caso de que la sección de resumen también esté presente, es posible que esta no sea la última página del documento. Esta sección a veces es útil cuando la información resumida debe mostrarse en la parte inferior de la última página.

10

Summary

Esta sección aparece solo una vez al final del informe.

11

No Data

Esta sección se imprime cuando la propiedad del informe Cuando no se imprimen datos se establece en Sección sin datos . Si la sección <noData> está definida en la plantilla de informe, y si la fuente de datos está vacía, entonces la sección <noData> será la única que se tendrá en cuenta en el momento del llenado y su contenido generará la salida del informe.

12

Background

La sección de fondo se muestra en cada página y no puede desbordarse a la página siguiente. Los elementos colocados en esta sección se evalúan en el momento de la inicialización de la página y se muestran en segundo plano. Todos los demás objetos de página se muestran encima de los objetos de fondo. Esta sección es útil para crear marcas de agua en la página.

Sección, elementos y relación de atributos

El siguiente diagrama muestra la relación de elementos y atributos en una sección de un informe.

Elementos de la sección

Todas las secciones del informe mencionadas anteriormente son opcionales. Pero cualquier plantilla de informe tendrá al menos una de esas secciones. Cada una de estas secciones contiene un solo <band> elemento como su único subelemento. A <band> puede contener cero o más subelementos siguientes -

<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> o <elementGroup>

Cada uno de estos elementos debe contener un solo <reportElement> como su primer elemento (excepto elementGroup). A <reportElement> determina cómo se distribuyen los datos para ese elemento en particular. A diferencia de las variables y los parámetros, no es necesario que los elementos del informe tengan un nombre, porque normalmente no es necesario obtener ningún elemento individual dentro de una plantilla de informe.

La siguiente tabla resume los atributos de <reportElement> -

Atributo Descripción Valores válidos
X Especifica la coordenada x del elemento de banda. Un valor entero que indica la coordenada x del elemento en píxeles. Este atributo es obligatorio.
y Especifica la coordenada y del elemento de banda. Un valor entero que indica la coordenada y del elemento en píxeles. Este atributo es obligatorio.
anchura Especifica el ancho del elemento de banda. Un valor entero que indica el ancho del elemento en píxeles. Este atributo es obligatorio.
altura Especifica la altura del elemento de banda. Un valor entero que indica la altura del elemento en píxeles. Este atributo es obligatorio.
llave Identificador único del elemento de la banda. Un valor de cadena único.
stretchType Especifica cómo se estira el elemento cuando se estira la banda contenedora

NoStretch (default) - El elemento no se estirará.

RelativeToTallestObject - El elemento se estirará para acomodar el objeto más alto de su grupo.

RelativeToBand - El elemento se estirará para adaptarse a la altura de la banda.

Tipo de Posición Especifica la posición del elemento cuando la banda se estira.

Float - El elemento se moverá dependiendo del tamaño de los elementos circundantes.

FixRelativeToTop (default) - El elemento mantendrá una posición fija con respecto a la parte superior de la banda.

FixRelativeToBottom - El elemento mantendrá una posición fija con respecto a la parte inferior de la banda.

isPrintRepeatedValues Especifica si se imprimen valores repetidos.

true (default) - Se imprimirán los valores repetidos.

false - Los valores repetidos no se imprimirán.

modo Especifica el modo de fondo del elemento. Opaco, Transparente
isRemoveLineWhenBlank Especifica si el elemento debe eliminarse cuando está en blanco y no hay otros elementos en el mismo espacio horizontal. verdadero Falso
isPrintInFirstWholeBand Especifica si el elemento debe imprimirse en una banda completa, es decir, una banda que no esté dividida entre páginas o columnas del informe. verdadero Falso
isPrintWhenDetailOverFlows Especifica si el elemento se imprimirá cuando la banda se desborde a una nueva página o columna. verdadero Falso
printWhenGroupChanges Especifica que el elemento se imprimirá cuando cambie el grupo especificado. Un valor de cadena.
color primario Especifica el color de primer plano del elemento. Ya sea un valor RGB hexadecimal precedido por el carácter #, o uno de los siguientes valores predefinidos: negro, azul, cian, darkGray, gris, verde, lightGray, magenta, naranja, rosa, rojo, amarillo, blanco.
color de fondo Especifica el color de fondo del elemento. Igual que los valores válidos para forecolor

Atributos de sección

A continuación se muestran los atributos de una sección de informe:

Altura

La altura de la sección especifica la altura en píxeles de esa sección en particular y es muy importante en el diseño general del informe.

Imprimir cuando la expresión

Una expresión booleana que determina si la sección debe imprimirse o no.

Split permitido

Una bandera que indica si la sección puede dividirse cuando no cabe en la página actual. Si es verdadero, la sección se transferirá a la página siguiente. Tenga en cuenta que, en caso de que la sección no quepa en la página siguiente, la sección se dividirá independientemente del valor de la bandera. splitType puede tomar los siguientes valores:

  • splitType = "Stretch:" Divide el contenido ampliado . Si la sección se extiende en la página actual (si el espacio disponible es menor que la altura declarada), la región que se agrega a la altura original puede dividirse en la página siguiente.

  • splitType = "Prevent:" Evita la división en el primer intento. Si la sección no cabe en la página siguiente, la división ocurre normalmente, ya que la prevención de división de banda es efectiva solo en el primer intento de división.

  • splitType = "Inmediato:" Dividir inmediatamente. La banda puede dividirse en cualquier lugar excepto arriba, su elemento más alto.

Ejemplo

Para demostrar cada sección, escribamos la plantilla de informe (jasper_report_template.jrxml). Guarde este archivo enC:\tools\jasperreports-5.0.1\testdirectorio. En este archivo, estaríamos mostrando un texto en cada una de las secciones (discutimos anteriormente). El contenido del archivo es el que se indica a continuación:

<?xml version = "1.0" encoding = "UTF-8"?>

<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" pageWidth = "300" pageHeight = "300" 
   columnWidth = "300" leftMargin = "0" rightMargin = "0" 
   topMargin = "0" bottomMargin = "0" >

   <title>
      <band height = "50">
         
         <textField>
            <reportElement x = "100" y = "16" width = "100" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Title"]]>
            </textFieldExpression>
        
         </textField>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "40">
         
         <textField>
            <reportElement  mode = "Opaque" x = "100" y = "10" 
               width = "90" height = "20"/>
            
            <textElement>
               <font isBold = "true"/>
            </textElement>
            
            <textFieldExpression>
               <![CDATA["Page Header"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </pageHeader>
   
   <columnHeader>
      <band height = "40">
            
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            
            <textElement>
               <font isItalic = "true"/>
            </textElement>
            
            <textFieldExpression>
               <![CDATA["Column Header"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </columnHeader>
   
   <detail>
      <band height ="40">
         
         <textField>
            <reportElement mode = "Opaque" x = "100" y = "10" 
               width = "90" height = "20" backcolor = "#99CCFF"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Report Details"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Column Footer"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </columnFooter>
   
   <pageFooter>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Page Footer"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </pageFooter>
   
   <lastPageFooter>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Last Page Footer"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </lastPageFooter>
   
   <summary>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Summary"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </summary>
	
</jasperReport>

El código java para completar y generar el informe se muestra a continuación. Guardemos este archivoJasperReportFill.java al directorio C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperReportFill {
   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/" + 
         "jasper_report_template.jasper";

      try {
         JasperFillManager.fillReportToFile(sourceFileName, null,
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

Aquí, usamos una instancia de JREmptyDataSource al completar informes para simular una fuente de datos con un registro en ella, pero con todos los campos en este único registro siendo nulos.

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es el siguiente.

El archivo de importación, baseBuild.xml, se obtiene 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 = "viewFillReport" basedir = ".">
   
   <import file = "baseBuild.xml" />
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview 
      the report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
		
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino 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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defau
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFac
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnviro
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 minutes 22 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como en la siguiente pantalla:

Aquí, podemos ver en cada uno de los apartados que se imprime un texto. Cabe señalar que como JRXML contiene un elemento <lastPageFooter>, se mostrará en la última página del informe en lugar de mostrar el elemento <pageFooter>. Los elementos <columnHeader> y <columnFooter> solo se mostrarán en el informe, si tiene más de una columna.

Los grupos en JasperReports ayudan a organizar los datos en el informe de una manera lógica. Un grupo de informes representa una secuencia de registros consecutivos en la fuente de datos, que tienen algo en común, como el valor de ciertos campos de informe. Un grupo de informes se define mediante el elemento <group>. Un informe puede tener cualquier número de grupos. Una vez declarados, los grupos pueden ser referidos a lo largo del informe.

Un grupo de informes tiene tres elementos:

  • Expresión de grupo : indica los datos que deben cambiar para iniciar un nuevo grupo de datos.

  • Sección de encabezado de grupo : ayuda a colocar la etiqueta al comienzo de los datos agrupados.

  • Sección de pie de página del grupo : ayuda a colocar la etiqueta al final de los datos agrupados.

Durante la iteración a través de la fuente de datos en el momento de completar el informe, si el valor de la expresión del grupo cambia, se produce una ruptura del grupo y las secciones <groupFooter> y <groupHeader> correspondientes se insertan en el documento resultante.

El mecanismo de grupo de informes no realiza ninguna clasificación de los datos proporcionados por la fuente de datos. La agrupación de datos funciona como se esperaba solo cuando los registros de la fuente de datos ya están ordenados según las expresiones de grupo utilizadas en el informe.

Atributos de grupo

El elemento <group> contiene atributos que nos permiten controlar cómo se distribuyen los datos agrupados. Los atributos se resumen en la siguiente tabla:

S.NO Atributo y descripción
1

name

Esto es obligatorio. Hace referencia al grupo en las expresiones de informe por su nombre. Sigue las mismas convenciones de nomenclatura que mencionamos para los parámetros, campos y variables del informe. Se puede utilizar en otros atributos JRXML cuando desee hacer referencia a un grupo de informes en particular.

2

isStartNewColumn

Cuando se establece en verdadero , cada grupo de datos comenzará en una nueva columna. El valor predeterminado es falso .

3

isStartNewPage

Cuando se establece en verdadero , cada grupo de datos comenzará en una nueva página. El valor predeterminado es falso .

4

isResetPageNumber

Cuando se establece en verdadero , el número de página del informe se restablecerá cada vez que se inicie un nuevo grupo. El valor predeterminado es falso.

5

isReprintHeaderOnEachPage

Cuando se establece en verdadero , el encabezado del grupo se volverá a imprimir en cada página. El valor predeterminado es falso .
6

minHeightToStartNewPage

Define la cantidad mínima de espacio vertical necesario en la parte inferior de la columna para colocar el encabezado del grupo en la columna actual. La cantidad se especifica en unidades de informe.

7

footerPosition

Representa la posición del pie de página del grupo en la página, así como su comportamiento en relación con las secciones del informe que le siguen. Su valor puede ser: Normal , StackAtBottom , ForceAtBottom y CollateAtBottom . El valor predeterminado es Normal .

8

keepTogether

Cuando se establece en verdadero , evita que el grupo se divida en su primer intento de ruptura.

Ejemplo

Agreguemos un grupo (CountryGroup) a la plantilla de informe existente ( Diseños de informe de capítulo ). Se cuenta la ocurrencia de cada país y el recuento se muestra como el pie de página del grupo. En el encabezado del grupo, se antepone el recuento de cada registro. La plantilla de informe revisada (jasper_report_template.jrxml) es la siguiente. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <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>
   
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <variable name = "CountryNumber" class = "java.lang.Integer"
      incrementType = "Group" incrementGroup = "CountryGroup"
      calculation = "Count">
      <variableExpression><![CDATA[Boolean.TRUE]]></variableExpression>
   </variable>
   
   <group name = "CountryGroup" minHeightToStartNewPage = "60">
      <groupExpression><![CDATA[$F{country}]]></groupExpression> <groupHeader> <band height = "20"> <textField evaluationTime = "Group" evaluationGroup = "CountryGroup" bookmarkLevel = "1"> <reportElement mode = "Opaque" x = "0" y = "5" width = "515" height = "15" backcolor = "#C0C0C0"/> <box leftPadding = "10"> <bottomPen lineWidth = "1.0"/> </box> <textElement/> <textFieldExpression class = "java.lang.String"> <![CDATA[" " + String.valueOf($V{CountryNumber}) + ". "
                  + String.valueOf($F{country})]]> </textFieldExpression> <anchorNameExpression> <![CDATA[String.valueOf($F{country})]]>
               </anchorNameExpression>
            </textField>
         
         </band>
      </groupHeader>
      
      <groupFooter>
         <band height = "20">
            
            <staticText>
               <reportElement x = "400" y = "1" width = "60" height = "15"/>
               <textElement textAlignment = "Right"/>
               <text><![CDATA[Count :]]></text>
            </staticText>
            
            <textField>
               <reportElement x = "460" y = "1" width = "30" height = "15"/>
               <textElement textAlignment = "Right"/>
               
               <textFieldExpression class = "java.lang.Integer">
                  <![CDATA[$V{CountryGroup_COUNT}]]> </textFieldExpression> </textField> </band> </groupFooter> </group> <title> <band height = "70"> <line> <reportElement x = "0" y = "0" width = "515" height = "1"/> </line> <textField isBlankWhenNull = "true" bookmarkLevel = "1"> <reportElement x = "0" y = "10" width = "515" height = "30"/> <textElement textAlignment = "Center"> <font size = "22"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
            
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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>

Los códigos de Java para el llenado de informes no se modifican. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son los que se indican a continuación:

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();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los siguientes:

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;
   }
}

El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los que se indican a continuación:

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;
   }
}

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es el siguiente.

El archivo de importación, baseBuild.xml, se obtiene 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview 
      the report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino predeterminado) como -

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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

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

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig
   for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.

viewFillReport:
   [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: 18 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como en la siguiente pantalla:

Aquí, vemos que cada país está agrupado y el recuento de ocurrencia de cada país se muestra al pie de cada grupo.

Un informe contiene elementos de texto y cada uno de ellos puede tener su propia configuración de fuente. Estos ajustes se pueden especificar mediante el <font> etiqueta disponible en la etiqueta <textElement>. Un informe puede definir varias fuentes. Una vez definidas, se pueden utilizar como configuración de fuente predeterminada o base para otras definiciones de fuente en todo el informe.

Fuentes de informe

Una fuente de informe es una colección de configuraciones de fuente, declarada a nivel de informe. Una fuente de informe se puede reutilizar en toda la plantilla de informe al configurar las propiedades de fuente de los elementos de texto.

Las fuentes de informes ahora están en desuso. No utilice elementos <reportFont /> declarados dentro del propio documento. En su lugar, utilice el elemento <style />.

Atributos de fuente

La siguiente tabla resume los principales atributos de <font> elemento -

S.NO Atributo y descripción
1

fontName

El nombre de la fuente, que puede ser el nombre de una fuente física, una lógica o el nombre de una familia de fuentes de las extensiones de fuentes registradas de JasperReports.

2

size

El tamaño de la fuente medido en puntos. Su valor predeterminado es 10.

3

isBold

La bandera que especifica si se requiere una fuente en negrita. Su valor predeterminado es falso.

4

isItalic

La bandera que especifica si se requiere una fuente en cursiva. Su valor predeterminado es falso.

5

isUnderline

La bandera que especifica si se requiere la decoración del texto subrayado. Su valor predeterminado es falso.

6

isStrikeThrough

La bandera que especifica si se requiere la decoración de texto tachado. Su valor predeterminado es falso.

7

pdfFontName

El nombre de una fuente PDF equivalente requerida por la biblioteca iText al exportar documentos a formato PDF.

8

pdfEncoding

La codificación de caracteres PDF equivalente, también requerida por la biblioteca iText.

9

isPdfEmbedded

La bandera que especifica si la fuente debe estar incrustada en el documento. Su valor predeterminado es falso. Si se establece en verdadero, ayuda a ver el documento PDF sin ningún problema.

Tipos de fuentes

En JasperReports, las fuentes se pueden clasificar como:

  • Logical Fonts- Cinco tipos de fuentes, que han sido reconocidos por la plataforma Java desde la versión 1.0, se denominan fuentes lógicas. Estos son ...Serif, SansSerif, Monospaced, Dialog, and DialogInput. Estas fuentes lógicas no son bibliotecas de fuentes reales que estén instaladas en cualquier parte del sistema. Son simplemente nombres de tipos de fuentes reconocidos por el tiempo de ejecución de Java. Estos deben asignarse a alguna fuente física que esté instalada en el sistema.

  • Physical Fonts- Estas fuentes son las bibliotecas de fuentes reales que constan, por ejemplo, de fuentes TrueType o PostScript Type 1. Las fuentes físicas pueden ser Arial, Time, Helvetica, Courier o cualquier otra fuente, incluidas fuentes internacionales.

  • Font Extensions- La biblioteca JasperReports puede hacer uso de fuentes registradas sobre la marcha en tiempo de ejecución, a través de su soporte integrado para extensiones de fuentes. Se puede poner a disposición de JasperReports una lista de familias de fuentes utilizando la extensión de fuente. Estos están hechos de fuentes de aspecto similar y admiten configuraciones regionales específicas.

Como se describe en la tabla anterior, debemos especificar en el atributo fontName el nombre de una fuente física, el nombre de una fuente lógica o el nombre de una familia de fuentes de las extensiones de fuente JasperReports registradas.

Nombre de fuente PDF

La biblioteca JasperReports utiliza la biblioteca iText, al exportar informes a PDF (formato de documento portátil). Los archivos PDF se pueden ver en varias plataformas y siempre tendrán el mismo aspecto. Esto se debe en parte a que en este formato hay una forma especial de tratar las fuentes. El atributo fontName no sirve para exportar a PDF. El atributo pdfFontName existe donde necesitamos especificar la configuración de fuente.

La biblioteca iText sabe cómo tratar con fuentes integradas y archivos TTF y reconoce los siguientes nombres de fuentes integradas:

  • Courier
  • Courier-Bold
  • Courier-BoldOblique
  • Courier-Oblique
  • Helvetica
  • Helvetica-Bold
  • Helvetica-BoldOblique
  • Helvetica-Oblique
  • Symbol
  • Times-Roman
  • Times-Bold
  • Times-BoldItalic
  • Times-Italic
  • ZapfDingbats

Según el requisito previo de la biblioteca iText, para trabajar con fuentes, debemos especificar uno de los siguientes como nombre de fuente:

  • Un nombre de fuente integrado de la lista anterior.

  • El nombre de un archivo TTF (True Type Font), que puede ubicar en el disco.

  • El nombre real de la fuente, siempre que el archivo TTF que contiene la fuente haya sido previamente registrado con iText o que se haya definido un alias cuando se registró la fuente.

Según los requisitos previos anteriores, el atributo pdfFontName puede contener uno de los siguientes valores:

  • El nombre de una fuente PDF incorporada de la lista anterior.

  • El nombre de un archivo TTF que se puede ubicar en el disco en tiempo de ejecución al exportar a PDF.

  • El nombre real de una fuente registrada.

  • El sufijo de la clave (la parte después de net.sf.jasperreports.export.pdf.font ) para una fuente registrada con iText como un archivo de fuente.

Fuentes y herencia predeterminadas

Cada elemento de texto hereda los atributos de fuente y estilo de su elemento principal, que a su vez hereda estos atributos de su elemento principal. Si no se definen estilos y / o fuentes para los elementos, se aplicará el estilo predeterminado (y / o fuente, pero ahora está en desuso) declarado en el elemento raíz <jasperReport />.

No es obligatorio definir estilos o fuentes predeterminados en JasperReports. Si no se define una fuente para un elemento dado, el motor busca los atributos de fuente heredados o, si no se encuentran atributos de esta manera, busca la propiedad net.sf.jasperreports.default.font.name en / src / default.jasperreports.properties archivo. Su valor define el nombre de la familia de fuentes que se utilizará cuando las propiedades de la fuente no se definan explícitamente para un elemento de texto o no se hereden de su padre.

Las principales propiedades de fuente predeterminadas y sus valores definidos en el archivo /src/default.jasperreports.properties se encuentran en la siguiente tabla:

Propiedad Descripción
net.sf.jasperreports.default.font.name = SansSerif El nombre de fuente predeterminado.
net.sf.jasperreports.default.font.size = 10 El tamaño de fuente predeterminado.
net.sf.jasperreports.default.pdf.font.name = Helvetica La fuente de PDF predeterminada.
net.sf.jasperreports.default.pdf.encoding = Cp1252 La codificación de caracteres PDF predeterminada.
net.sf.jasperreports.default.pdf.embedded = false Por defecto, las fuentes PDF no están incrustadas.

Ejemplo

Para demostrar el uso de fuentes y atributos de fuente a fin de obtener una apariencia de texto en particular, escribamos una nueva plantilla de informe (jasper_report_template.jrxml). El contenido del JRXML es el siguiente. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test. Aquí, mostraremos un texto en el título del informe en varios formatos de fuente.

<?xml version = "1.0" encoding = "UTF-8"?>

<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" pageWidth = "595" pageHeight = "842"
   columnWidth = "555" leftMargin = "20" rightMargin = "20" topMargin = "30"
   bottomMargin = "30">

   <title>
      <band height = "682">
      
      <staticText>
         <reportElement x = "0" y = "50" width = "150" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[Welcome to TutorialsPoint!]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "50" width = "390" height = "40"/>
         <textElement/>
         
         <text>
           <![CDATA[<staticText>
           <reportElement x = "0" y = "50" width = "150" height = "40"/>
           <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "100" width = "150" height = "40"/>
         
         <textElement>
            <font size = "12"/>
         </textElement>
         
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "100" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "100" width = "150" height = "40"/>
            
            <textElement>
               <font size = "14"/>
            </textElement>
				
            <text> Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "150" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "150" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "250" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "200" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "200" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "300" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "250" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "Monospaced" size = "12" isItalic = "true" 
               isUnderline = "true" pdfFontName = "Courier-Oblique"/>
         </textElement>
         
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "250" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "350" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "Monospaced" size = "12" isItalic = "true"
                  isUnderline = "true" pdfFontName = "Courier-Oblique"/>
            </textElement>
            
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "300" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "Monospaced" size = "12" isBold = "true"
               isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
         </textElement>
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "300" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "400" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "Monospaced" size = "12" isBold = "true"
                  isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "350" width = "150" height = "40" 
            forecolor = "#FF0000"/>
         
         <textElement>
            <font size = "14"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "350" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "450" width = "150" height = "40"
               forecolor = "red"/>
            
            <textElement><font size = "14"/></textElement>
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "400" width = "150" height = "40" mode = "Opaque"
            forecolor = "#00FF00" backcolor = "#FFFF00"/>
         
         <textElement>
            <font fontName = "Serif" size = "12" isBold = "true" 
               pdfFontName = "Times-Bold"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "400" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "500" width = "150" height = "40"
               forecolor = "green" backcolor = "#FFFF00" mode = "Opaque"/>
            
            <textElement>
               <font fontName = "Serif" size = "12" isBold = "true"
                  pdfFontName = "Times-Bold"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "450" width = "150" height = "40" mode = "Opaque"
            forecolor = "#0000FF" backcolor = "#FFDD99"/>
         
         <textElement textAlignment = "Center" verticalAlignment = "Middle">
            <font fontName = "SansSerif" size = "12" isBold = "false"
            isItalic = "true" pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "450" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "550" width = "150" height = "90"
               forecolor = "blue" backcolor = "#FFDD99" mode = "Opaque"/>
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font fontName = "SansSerif" size = "12" isBold = "false"
                  pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement mode = "Opaque" x = "0" y = "500" width = "150" height = "40"
            forecolor = "#FF0000" backcolor = "#99DDFF"/>
         
         <textElement textAlignment = "Right" verticalAlignment = "Bottom">
            <font fontName = "SansSerif" size = "12" isBold = "true"
               pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "500" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "650" width = "150" height = "90"    forecolor = "red"
               backcolor = "#99DDFF" mode = "Opaque"/>
            
            <textElement textAlignment = "Right" verticalAlignment = "Bottom">
               <font fontName = "SansSerif" size = "12" isBold = "true"
                  pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      
      </staticText>
   
   </band>
</title>

</jasperReport>

El código java para completar y generar el informe es el que se indica a continuación. Guardemos este archivoJasperFontsReportFill.java al directorio C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperFontsReportFill {
   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/" + 
         "jasper_report_template.jasper";

      try {
         JasperFillManager.fillReportToFile(sourceFileName, null,
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

Aquí, usamos una instancia de JREmptyDataSource al completar informes para simular una fuente de datos con un registro, pero con todos los campos nulos .

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the report 
      stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
		
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperFontsReportFill (viewFullReport es el destino predeterminado) como -

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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting to build.
   [javac] Compiling 5 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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

viewFillReport:
   [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: 45 minutes 3 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:

Aquí, podemos ver que el texto "Bienvenido a TutorialsPoint" se muestra en diferentes formatos de fuente.

En JasperReports, trabajar con textos necesita algunas herramientas dedicadas para procesar tanto las representaciones de caracteres como las propiedades de formato del texto. Cualquier texto puede considerarse como una secuencia de caracteres con una estructura de representación particular. La apariencia del texto consiste en la configuración de diseño (y párrafo) y fuente. Pero aunque en la mayoría de los casos, el diseño del texto permanece invariable, la configuración de la fuente puede cambiar al ejecutar el informe en diferentes configuraciones regionales.

Sabemos que los diferentes idiomas necesitan diferentes conjuntos de caracteres con respecto a la representación de caracteres específicos. Por tanto, trabajar con textos significa trabajar con fuentes. Sin embargo, en el capítulo Fuentes de informes se encuentra disponible una discusión detallada sobre cómo usar fuentes en JasperReports .

Una de las principales características del contenido del texto de un informe es la posibilidad de internacionalizarlo. Significa que podemos ejecutar el informe en diferentes entornos localizados, utilizando diferentes idiomas y otras configuraciones de localización sin ninguna modificación codificada. La codificación de caracteres es una característica importante cuando se pretende internacionalizar un informe.

Codificación de caracteres

Un carácter es la unidad más pequeña de escritura que transmite una información significativa. Es un concepto abstracto, un personaje no tiene apariencia visual. La "A latina mayúscula" es un carácter diferente de la "A latina minúscula" y de la "A cirílica mayúscula" y la "Alfa griega mayúscula".

Una representación visual de un personaje se conoce como glyph. Cierto conjunto de glifos se llamafont. La "A latina mayúscula", la "A cirílica mayúscula" y la "Alfa griega mayúscula" pueden tener glifos idénticos, pero son caracteres diferentes. Al mismo tiempo, los glifos de la "A latina mayúscula" pueden verse muy diferentes en Times New Roman, Gill Sans y Poetica chancery en cursiva, pero siguen representando el mismo carácter.

El conjunto de caracteres disponibles se denomina repertorio de caracteres . La ubicación (índice) de un carácter dado dentro de un repertorio se conoce como su posición de código o punto de código. El método de representar numéricamente un punto de código dentro de un repertorio dado se llamacharacter encoding.

Las codificaciones se expresan normalmente en términos de octetos. Un octeto es un grupo de ocho dígitos binarios, es decir, ocho unos y ceros. Un octeto puede expresar un rango numérico entre 0 y 255, o entre 0x00 y 0xFF, para usar notación hexadecimal.

Unicode

Un Unicode es un repertorio de caracteres que contiene la mayoría de los caracteres utilizados en los idiomas del mundo. Puede acomodar millones de caracteres y ya contiene cientos de miles. Unicode se divide en "planos" de 64K caracteres. El único que se utiliza en la mayoría de las circunstancias es el primer plano, conocido como plano multilingüe básico o BMP.

UTF-8 es la codificación recomendada. Utiliza un número variable de octetos para representar diferentes caracteres.

En un archivo JRXML, el atributo de codificación se especifica en el encabezado. Se utiliza en el momento de la compilación del informe para decodificar el contenido XML. Por ejemplo, si el informe contiene solo palabras en francés y caracteres como ç, é, â, entonces la codificación ISO-8859-1 (también conocida como Latin-1) es suficiente:

<?xml version = "1.0" encoding = "ISO-8859-1"?>

Como se vio arriba, idealmente podemos elegir el ajuste de codificación al juego de caracteres mínimo, que puede representar correctamente todos los caracteres en el documento. Pero en el caso de documentos en varios idiomas (es decir, documentos que contienen palabras escritas en varios idiomas), se debe elegir la codificación adaptada al juego mínimo de caracteres, capaz de representar correctamente todos los caracteres del documento, incluso si pertenecen a diferentes idiomas. Una de las codificaciones de caracteres capaces de manejar documentos multilingües es laUTF-8, utilizado como valor de codificación predeterminado por JasperReports.

Los textos generalmente se guardan en archivos de paquetes de recursos en lugar de dentro del documento durante la internacionalización. Por lo tanto, hay casos en los que el propio JRXML parece completamente compatible con ASCII, pero los informes generados en tiempo de ejecución contienen textos ilegibles con ASCII. Como resultado, para un cierto tipo de formatos de exportación de documentos (como CSV, HTML, XHTML, XML y texto), también se debe conocer la codificación del documento generado. Los diferentes idiomas son compatibles con diferentes codificaciones de caracteres. Entonces, cada vez, necesitamos ejecutar un informe en un entorno localizado. Además, tenemos que saber cuál es la codificación de caracteres más adecuada para el idioma del documento generado. En este caso, la propiedad de codificación definida en el archivo JRXML en sí podría no ser más útil.

Para resolver este tipo de problemas, podemos utilizar una propiedad de cliente de exportación conocida como net.sf.jasperreports.export.character.encoding . Esta propiedad personalizada de exportación es predeterminada en UTF-8 y está presente en JasperReports.

Este valor predeterminado se establece en el archivo default.jasperreports.properties . Para opciones más específicas en el momento de la exportación, el parámetro de exportación CHARACTER_ENCODING también está disponible.

Ejemplo

Para demostrar el uso de la compatibilidad con Unicode en Jasperreports, escriba una nueva plantilla de informe (jasper_report_template.jrxml). Save it to C:\tools\jasperreports-5.0.1\testdirectorio. Aquí, mostraremos un texto en diferentes idiomas usando los caracteres Unicode (\ uXXXX). Cualquier carácter codificado con UTF-8 se puede representar utilizando solo su código hexadecimal de 4 dígitos. Por ejemplo, la letra griega Γ se puede escribir como \ u0393. Cuando se encuentra una notación de este tipo, el motor solicita la representación de caracteres adecuada en el conjunto de caracteres y solo se imprimirá ese carácter en particular. El contenido del JRXML es el siguiente:

<?xml version = "1.0" encoding = "UTF-8"?>

<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">

   <parameter name = "GreekText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0394\u03B5\u03BD "+
         "\u03BA\u03B1\u03C4\u03B1\u03BB\u03B1\u03B2\u03B1\u03AF"+
         "\u03BD\u03C9 \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "CyrillicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u042F \u043D\u0435 "+
         "\u043C\u043E\u0433\u0443 \u043F\u043E\u043D\u044F\u0442\u044C "+
         "\u0433\u0440\u0435\u0447\u0435\u0441\u043A\u0438\u0439"]]>
      </defaultValueExpression>
   </parameter>

   <parameter name = "ArabicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0627\u0646\u0646\u0649 \u0644\u0627 "+
         "\u0627\u0641\u0647\u0645 \u0627\u0644\u0644\u063A\u0629 "+
         "\u0627\u0644\u0639\u0631\u0628\u064A\u0629"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "HebrewText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u05D0\u05E0\u05D9 \u05DC\u05D0 "+
         "\u05DE\u05D1\u05D9\u05DF \u05E2\u05D1\u05E8\u05D9\u05EA"]]>
      </defaultValueExpression>
   </parameter>
   
   <title>
      <band height = "782">
         
         <textField>
            <reportElement x = "0" y = "50" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "50" width = "340" height = "60"/> <textElement/> <text> <![CDATA["GreekText and CyrillicText"]]> </text> </staticText> <textField> <reportElement x = "0" y = "120" width = "200" height = "60"/> <textElement> <font fontName = "DejaVu Sans" size = "14" isBold = "true"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "120" width = "340" height = "60"/> <textElement/> <text><![CDATA["GreekText and CyrillicText"]]></text> </staticText> <textField> <reportElement x = "0" y = "190" width = "200" height = "60"/> <textElement> <font fontName = "DejaVu Sans" size = "14" isItalic = "true" isUnderline = "true"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "190" width = "340" height = "60"/> <textElement/> <text><![CDATA["GreekText and CyrillicText"]]></text> </staticText> <textField> <reportElement x = "0" y = "260" width = "200" height = "60"/> <textElement> <font fontName = "DejaVu Sans" size = "14" isBold = "true" isItalic = "true" isUnderline = "true"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "260" width = "340" height = "60"/> <textElement/> <text><![CDATA["GreekText and CyrillicText"]]></text> </staticText> <textField> <reportElement x = "0" y = "330" width = "200" height = "60"/> <textElement textAlignment = "Right"> <font fontName="DejaVu Sans" size = "22"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{ArabicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <textField>
            <reportElement x = "210" y = "330" width = "340" height = "60"/>
            
            <textElement textAlignment = "Right">
               <font fontName = "DejaVu Sans" size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{HebrewText}]]>
            </textFieldExpression>
				
         </textField>
      
      </band>
   </title>
	
</jasperReport>

En el archivo anterior, podemos ver la presencia de la codificación UTF-8. Además, los fragmentos de texto Unicode localizados se almacenan en los parámetros del documento.

El código java para completar y generar el informe es el siguiente. Guardemos este archivoJasperUnicodeReportFill.java al directorio C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperUnicodeReportFill {
   public static void main(String[] args) {
      String sourceFileName ="C://tools/jasperreports-5.0.1/test/" + 
         "jasper_report_template.jasper";

      try {
         JasperFillManager.fillReportToFile(sourceFileName, null, 
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

Aquí usamos una instancia de JREmptyDataSource al llenar informes para simular una fuente de datos con un registro, pero con todos los campos en este único registro siendo nulos .

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the report 
      stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
		
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperUnicodeReportFill (viewFullReport es el destino predeterminado) de la siguiente manera:

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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting t
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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

viewFillReport:
   [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: 4 minutes 1 second

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:

Aquí, podemos ver que el texto que se muestra está en diferentes idiomas. También vemos que los idiomas están agrupados en la misma página y también mezclados en el mismo elemento de texto.

JasperReports tiene una función <style> que ayuda a controlar las propiedades del texto en una plantilla de informe. Este elemento es una colección de configuraciones de estilo declaradas a nivel de informe. Propiedades como el color de primer plano, el color de fondo, si la fuente es negrita, cursiva o normal, el tamaño de la fuente, un borde para la fuente y muchos otros atributos están controlados por el elemento <style>. Los estilos pueden ampliar otros estilos y agregar o anular propiedades del estilo principal también.

Propiedades de estilo

Un elemento <style> tiene muchos atributos. Algunos de los más utilizados se enumeran en la siguiente tabla:

S.NO Atributo y descripción
1

name

Es obligatorio. Debe ser único porque hace referencia al estilo de informe correspondiente en todo el informe.

2

isDefault

Indica si este estilo es el estilo predeterminado del documento.

3

style

Es una referencia al estilo padre.

4

mode

Especifica la transparencia del elemento. Los valores posibles son Opaco y Transparente .

5

forecolor

Es el color de primer plano del objeto.

6

backcolor

Es el color de fondo del objeto.

7

fill

Determina el patrón de relleno utilizado para rellenar el objeto. Por el momento, el valor único permitido es Sólido .

6

radius

Especifica el radio del arco de la esquina del rectángulo.

7

scaleImage

Especifica la escala solo para las imágenes. Valores posibles: Clip, FillFrame, RetainShape, RealHeight y RealSize .

8

hAlign

Especifica la alineación horizontal. Valores posibles: Izquierda, Centro, Derecha y Justificado .

9

vAlign

Especifica la alineación vertical. Valores posibles: Superior, Medio e Inferior .

10

rotation

Especifica la rotación del elemento. Valores posibles: Ninguno, Izquierda, Derecha y UpsideDown .

11

lineSpacing

Especifica el espaciado entre líneas de texto. Valores posibles: Single, 1_1_2, Double .

12

markup

Especifica el estilo de marcado para textos con estilo.

13

fontName

Especifica el nombre de la fuente.

14

fontSize

Especifica el tamaño de la fuente.

15

isBold

Indica si el estilo de fuente está en negrita.

dieciséis

isItalic

Indica si el estilo de fuente es cursiva.

17

isUnderline

Indica si el estilo de fuente está subrayado.

18

isStrikeThrough

Indica si el estilo de fuente está tachado.

19

pdfFontName

Especifica el nombre de la fuente PDF relacionada.

20

pdfEncoding

Especifica la codificación de caracteres para el formato de salida PDF.

22

isPdfEmbedded

Indica si la fuente PDF está incrustada.

23

pattern

Especifica el patrón de formato para textos formateados.

24

isBlankWhenNull

Indica si se debe mostrar una cadena vacía (espacios en blanco) si la expresión se evalúa como nula.

Estilos condicionales

En algunas situaciones, un estilo debe aplicarse solo cuando se cumpla cierta condición (por ejemplo, para alternar colores de filas adyacentes en una sección de detalles de informe). Esto se puede lograr utilizando estilos condicionales.

Un estilo condicional tiene dos elementos:

  • una expresión de condición booleana
  • un estilo

El estilo se usa solo si la condición se evalúa como verdadera .

Aplicar estilos a elementos de informe

Cualquier tipo de elemento de informe puede hacer referencia a una definición de estilo de informe mediante el atributo de estilo. Por lo tanto, se heredarán todas las propiedades de estilo declaradas por la definición de estilo que sean aplicables al elemento actual. Para anular los valores heredados, se pueden utilizar las propiedades de estilo especificadas en el nivel del elemento del informe.

Plantillas de estilo

Podemos hacer un conjunto de informes con un aspecto común definiendo el estilo en un lugar común. Las plantillas de informes pueden hacer referencia a esta plantilla de estilo común. Una plantilla de estilo es un archivo XML que contiene una o más definiciones de estilo. Archivos de plantilla de estilo utilizados por convención*.jrtx extensión, pero esto no es obligatorio.

Una plantilla de estilo contiene los siguientes elementos:

  • <jasperTemplate> : este es el elemento raíz de un archivo de plantilla de estilo.

  • <template> : este elemento se utiliza para incluir referencias a otros archivos de plantilla. El contenido de este elemento se interpreta como la ubicación del archivo de plantilla referido.

  • <style> : este elemento es idéntico al elemento con el mismo nombre de las plantillas de diseño de informes (archivos JRXML), con la excepción de que un estilo en una plantilla de estilo no puede contener estilos condicionales. Esta limitación se debe al hecho de que los estilos condicionales implican expresiones de informe y las expresiones solo se pueden interpretar en el contexto de una única definición de informe.

Las referencias a las plantillas de estilo se incluyen en los informes JRXML como elementos <template>. Las plantillas de estilo se cargan en el momento de completar el informe y las referencias a los nombres de estilo se resuelven una vez que se han cargado todas las plantillas. Cuando se cargan las plantillas de estilo y se resuelven los nombres de los estilos en estilos, se crea un árbol / gráfico de plantillas de estilo, siendo la parte superior del árbol el conjunto de estilos definidos en el informe. En este árbol, las referencias al nombre de estilo se resuelven hasta el último estilo que coincide con el nombre en un recorrido en profundidad.

Ejemplo

Probemos los estilos condicionales y las plantillas de estilo. Agreguemos el <style> elemento alternateStylea nuestra plantilla de informe existente ( Diseños de informe de capítulo ). Según la condición, el color de la fuente cambia a azul para un recuento uniforme. También hemos incluido una plantilla de estilo."styles.jrtx". La plantilla de informe revisada (jasper_report_template.jrxml) es la siguiente. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <template>"styles.jrtx"</template>
   
   <style name = "alternateStyle" fontName = "Arial" forecolor = "red">
      <conditionalStyle>
         <conditionExpression>
            <![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]> </conditionExpression> <style forecolor = "blue" isBold = "true"/> </conditionalStyle> </style> <parameter name = "ReportTitle" class = "java.lang.String"/> <parameter name = "Author" class = "java.lang.String"/> <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> <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count"> <variableExpression><![CDATA[Boolean.TRUE]]></variableExpression> </variable> <title> <band height = "70"> <line> <reportElement x = "0" y = "0" width = "515" height = "1"/> </line> <textField isBlankWhenNull = "true" bookmarkLevel = "1"> <reportElement x = "0" y = "10" width = "515" height = "30"/> <textElement textAlignment = "Center"> <font size = "22"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression><![CDATA["Title"]]></anchorNameExpression>
         </textField>

         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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 style = "alternateStyle" 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" 
               style = "Strong"/>
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

El contenido de la plantilla de estilo styles.jrtxson como sigue. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test.

<?xml version = "1.0"?>

<!DOCTYPE jasperTemplate PUBLIC "-//JasperReports//DTD Template//EN"
  "http://jasperreports.sourceforge.net/dtds/jaspertemplate.dtd">

<jasperTemplate>
   <style name = "Strong" isBold = "true" pdfFontName = "Helvetica-Bold" 
      backcolor = "lightGray forecolor = "green"/>
</jasperTemplate>

Los códigos java para el llenado de informes no se modifican. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son los que se indican a continuación:

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();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los siguientes:

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;
   }
}

El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los siguientes:

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;
   }
}

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

El archivo de importación, baseBuild.xml, se obtiene 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the 
      report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
		
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino predeterminado) como -

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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

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

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See
   http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:

Aquí, podemos ver que el color de la fuente cambia a azul para un recuento par (en el país de la columna). En el nombre de la columna, el color de la fuente cambia a verde (se hace referencia a este estilo desde la plantilla de estilo).

Como hemos visto en los capítulos anteriores, los datos que se muestran en el informe generalmente se obtienen de los parámetros del informe y los campos del informe. Estos datos se pueden procesar utilizando las variables del informe y sus expresiones. Hay situaciones en las que no se puede lograr fácilmente una funcionalidad compleja utilizando expresiones o variables de informe. Ejemplos de esto pueden ser manipulaciones complejas de cadenas, creación de mapas o listas de objetos en la memoria o manipulaciones de fechas utilizando API de Java de terceros. Para tales situaciones, JasperReports nos proporciona un medio simple y poderoso de hacer esto conScriptlets.

Los scriptlets son secuencias de código Java que se ejecutan cada vez que ocurre un evento de informe. Los valores de las variables del informe pueden verse afectados mediante scriptlets.

Declaración de Scriptlet

Podemos declarar un scriptlet de dos formas:

  • Usando <scriptlet> elemento. Este elemento tiene atributo de nombre y atributo de clase . El atributo de clase debe especificar el nombre de la clase, que amplía la clase JRAbstractScriptlet . La clase debe estar disponible en la ruta de clases en el momento de completar el informe y debe tener un constructor vacío, de modo que el motor pueda instanciarlo sobre la marcha.

  • Usando el atributo scriptletClass del elemento <jasperReport>, en la plantilla de informe (JRXML). Al establecer este atributo con el nombre completo de scriptlet (incluido el nombre completo del paquete), indicamos que queremos usar un scriptlet. La instancia de scriptlet, creada con este atributo, actúa como el primer scriptlet en la lista de scriptlets y tiene el nombre predefinido REPORT.

Clase scriptlet

Un scriptlet es una clase java, que debe extender cualquiera de las siguientes clases:

  • net.sf.jasperreports.engine.JRAbstractScriptlet- Esta clase contiene una serie de métodos abstractos que deben anularse en cada implementación. Estos métodos son llamados automáticamente por JasperReports en el momento apropiado. El desarrollador debe implementar todos los métodos abstractos.

  • net.sf.jasperreports.engine.JRDefaultScriptlet- Esta clase contiene implementaciones vacías predeterminadas de cada método en JRAbstractScriptlet. Un desarrollador solo está obligado a implementar los métodos que necesita para su proyecto.

La siguiente tabla enumera los métodos de la clase anterior. El motor de informes llamará a estos métodos en el momento adecuado, durante la fase de llenado del informe.

S.NO Método y descripción
1

public void beforeReportInit()

Llamado antes de la inicialización del informe.

2

public void afterReportInit()

Llamado después de la inicialización del informe.

3

public void beforePageInit()

Se llama antes de que se inicialice cada página.

4

public void afterPageInit()

Se llama después de que se inicializa cada página.

5

public void beforeColumnInit()

Se llama antes de que se inicialice cada columna.

6

public void afterColumnInit()

Se llama después de que se inicializa cada columna.

7

public void beforeGroupInit(String groupName)

Se llama antes de que se inicialice el grupo especificado en el parámetro.

8

public void afterGroupInit(String groupName)

Se llama después de que se inicializa el grupo especificado en el parámetro.

9

public void beforeDetailEval()

Se llama antes de que se evalúe cada registro en la sección de detalles del informe.

10

public void afterDetailEval()

Se llama después de evaluar cada registro en la sección de detalles del informe.

Se puede especificar cualquier número de scriptlets por informe. Si no se especifica ningún scriptlet para un informe, el motor aún crea una única instancia de JRDefaultScriptlet y la registra con el parámetro incorporado REPORT_SCRIPTLET.

Podemos agregar cualquier método adicional que necesitemos a nuestros scriptlets. Los informes pueden llamar a estos métodos mediante el parámetro integrado REPORT_SCRIPTLET.

Scriptlets globales

Podemos asociar scriptlets de otra manera a los informes, que es declarando los scriptlets globalmente. Esto hace que los scriptlets se apliquen a todos los informes que se completan en la implementación de JasperReports determinada. Esto se facilita por el hecho de que los scriptlets se pueden agregar a JasperReports como extensiones. El punto de extensión de scriptlet está representado por la interfaz net.sf.jasperreports.engine.scriptlets.ScriptletFactory . JasperReports cargará todas las fábricas de scriptlet disponibles a través de extensiones en tiempo de ejecución. Luego, le pedirá a cada uno de ellos la lista de instancias de scriptlets que desean aplicar al informe actual que se está ejecutando. Al solicitar la lista de instancias de scriptlet, el motor proporciona información de contexto que la fábrica podría utilizar para decidir qué scriptlets se aplican realmente al informe actual.

Gobernadores de informes

Los gobernadores son solo una extensión de los scriptlets globales que nos permiten abordar el problema del motor de informes que entra en un bucle infinito en tiempo de ejecución, mientras se generan informes. Las plantillas de informes no válidas no se pueden detectar en el momento del diseño, porque la mayoría de las veces, las condiciones para ingresar a los bucles infinitos dependen de los datos reales que se introducen en el motor en tiempo de ejecución. Los gobernadores de informes ayudan a decidir si un determinado informe ha entrado en un ciclo infinito y pueden detenerlo. Esto evita el agotamiento de los recursos de la máquina que ejecuta el informe.

JasperReports tiene dos reguladores de informes simples que detendrían la ejecución de un informe en función de un número máximo especificado de páginas o un intervalo de tiempo de espera especificado. Ellos son -

  • net.sf.jasperreports.governors.MaxPagesGovernor- Este es un scriptlet global que busca dos propiedades de configuración para decidir si se aplica o no al informe que se está ejecutando actualmente. Las propiedades de configuración son:

    • net.sf.jasperreports.governor.max.pages.enabled=[true|false]

    • net.sf.jasperreports.governor.max.pages=[integer]

  • net.sf.jasperreports.governors.TimeoutGovernor- Este es también un scriptlet global que busca las siguientes dos propiedades de configuración para decidir si se aplica o no.

    Las propiedades de configuración son:

    • net.sf.jasperreports.governor.timeout.enabled=[true|false]

    • net.sf.jasperreports.governor.timeout=[milliseconds]

Las propiedades de ambos reguladores se pueden establecer globalmente, en el archivo jasperreports.properties, o en el nivel de informe, como propiedades de informe personalizadas. Esto es útil porque diferentes informes pueden tener diferentes tamaños estimados o límites de tiempo de espera y también porque es posible que desee activar los reguladores para todos los informes, mientras que los desactiva para algunos, o viceversa.

Ejemplo

Escribamos una clase de scriptlet (MyScriptlet). El contenido del archivo C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ MyScriptlet.java es el siguiente:

package com.tutorialspoint;

import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;


public class MyScriptlet extends JRDefaultScriptlet {

   public void afterReportInit() throws JRScriptletException{
      System.out.println("call afterReportInit()");
      // this.setVariableValue("AllCountries", sbuffer.toString());
      this.setVariableValue("someVar", new String("This variable value 
         was modified by the scriptlet."));
   }

   public String hello() throws JRScriptletException {
      return "Hello! I'm the report's scriptlet object.";
   }

}

Los detalles de la clase scriptlet anterior son los siguientes:

  • En el método afterReportInit , establecemos un valor para la variable"someVar" this.setVariableValue ("someVar", new String ("El valor de esta variable fue modificado por el scriptlet.")).

  • Al final de la clase, un método adicional llamado 'hello'ha sido definido. Este es un ejemplo de un método que se puede agregar al Scriptlet que realmente devuelve un valor, en lugar de establecer una variable.

A continuación, agregaremos la referencia de clase scriptlet en nuestra plantilla de informe existente ( Diseños de informe de capítulo ). La plantilla de informe revisada (jasper_report_template.jrxml) es la siguiente. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50"
   scriptletClass = "com.tutorialspoint.MyScriptlet">
	
   <style name = "alternateStyle" fontName = "Arial" forecolor = "red">
      
      <conditionalStyle>
         <conditionExpression>
            <![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]> </conditionExpression> <style forecolor = "blue" isBold = "true"/> </conditionalStyle> </style> <parameter name = "ReportTitle" class = "java.lang.String"/> <parameter name = "Author" class = "java.lang.String"/> <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> <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count"> <variableExpression>< ![CDATA[Boolean.TRUE]]> </variableExpression> </variable> <variable name = "someVar" class = "java.lang.String"> <initialValueExpression> <![CDATA["This is the initial variable value."]]> </initialValueExpression> </variable> <title> <band height = "100"> <line> <reportElement x = "0" y = "0" width = "515" height = "1"/> </line> <textField isBlankWhenNull = "true" bookmarkLevel = "1"> <reportElement x = "0" y = "10" width = "515" height = "30"/> <textElement textAlignment = "Center"> <font size = "22"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
				
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
        
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> <textField isBlankWhenNull = "true"> <reportElement x = "0" y = "50" width = "515" height = "30" forecolor = "#993300"/> <textElement textAlignment = "Center"> <font size = "10"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$V{someVar}]]>
            </textFieldExpression>
				
         </textField>

      </band>
   </title>

   <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 style = "alternateStyle" 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>
   
   <summary>
      <band height = "45">
            
         <textField isStretchWithOverflow = "true">
            <reportElement x = "0" y = "10" width = "515" height = "15" />
            <textElement textAlignment = "Center"/>
               
            <textFieldExpression class = "java.lang.String">
               <![CDATA["There are " + String.valueOf($V{REPORT_COUNT}) + " records on this report."]]> </textFieldExpression> </textField> <textField isStretchWithOverflow = "true"> <reportElement positionType = "Float" x = "0" y = "30" width = "515" height = "15" forecolor = "# 993300" /> <textElement textAlignment = "Center"> <font size = "10"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{REPORT_SCRIPTLET}.hello()]]>
            </textFieldExpression>
            
         </textField>
         
      </band>
   </summary>
	
</jasperReport>

Los detalles de la plantilla de informe revisada se dan a continuación:

  • Hemos hecho referencia a la clase MyScriptlet en el atributo scriptletClass del elemento <jasperReport>.

  • Los scriptlets solo pueden acceder, pero no modificar, los campos y parámetros del informe. Sin embargo, los scriptlets pueden modificar los valores de las variables del informe. Esto se puede lograr llamando al método setVariableValue (). Este método se define en la clase JRAbstractScriptlet, que siempre es la clase principal de cualquier scriptlet. Aquí, hemos definido una variable someVar , que será modificada por MyScriptlet para tener el valor Este valor fue modificado por el scriptlet .

  • La plantilla de informe anterior tiene una llamada de método en la banda Resumen que ilustra cómo escribir nuevos métodos (en scriptlets) y usarlos en la plantilla de informe. ($P{REPORT_SCRIPTLET}.hello())

Los códigos java para el llenado de informes no se modifican. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son los que se indican a continuación:

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();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los que se indican a continuación:

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;
   }
}

El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los que se indican a continuación:

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;
   }
}

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

El archivo de importación, baseBuild.xml, se obtiene 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview 
      the report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino predeterminado) como -

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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting to bu
   [javac] Compiling 4 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.
   [java] call afterReportInit()
   [java] call afterReportInit()

viewFillReport:
   [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: 18 minutes 49 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:

Aquí vemos que se muestran dos mensajes de la clase MyScriptlet:

  • En la sección de título: el valor de esta variable fue modificado por scriptlet
  • En la parte inferior - ¡Hola! Soy el objeto scriptlet del informe.

Los subinformes son una de las características interesantes de JasperReports. Esta característica permite incorporar un informe dentro de otro informe, es decir, un informe puede ser un subinforme de otro. Los subinformes nos ayudan a mantener los diseños de informes simples, ya que podemos crear muchos informes simples y encapsularlos en un informe maestro. Los subinformes se compilan y completan como los informes normales. Cualquier plantilla de informe se puede utilizar como subinforme cuando se incorpora a otra plantilla de informe, sin que se modifique nada dentro (de la plantilla de informe).

Los subinformes son como plantillas de informes normales. De hecho , son objetos net.sf.jasperreports.engine.JasperReport , que se obtienen después de compilar un objeto net.sf.jasperreports.engine.design.JasperDesign .

Elemento <subreport>

Se utiliza un elemento <subreport> al introducir subinformes en informes maestros. Aquí está la lista de subelementos en el elemento JRXML <subreport>.

  • <reportElement>

  • <parametersMapExpression>: se utiliza para pasar un mapa que contiene parámetros de informe al subinforme. El mapa generalmente se obtiene a partir de un parámetro en el informe maestro o mediante el parámetro incorporado REPORTS_PARAMETERS_MAP para pasar los parámetros del informe principal al subinforme. Esta expresión siempre debe devolver un objeto java.util.Map en el que las claves son los nombres de los parámetros.

  • <subreportParameter>: este elemento se utiliza para pasar parámetros al subinforme. Tiene un nombre de atributo , que es obligatorio.

  • <connectionExpression>: se utiliza para pasar un java.sql.Connection al subinforme. Se utiliza solo cuando la plantilla de subinforme necesita una conexión a la base de datos durante la fase de llenado del informe.

  • <dataSourceExpression>: se utiliza para pasar una fuente de datos al subinforme. Esta fuente de datos generalmente se obtiene de un parámetro en el informe maestro o mediante el parámetro REPORT_DATA_SOURCE incorporado para pasar la fuente de datos del informe principal al subinforme.

  • Los elementos ( connectionExpression y dataSourceExpression ) no pueden estar presentes al mismo tiempo en una declaración de elemento <subreport>. Esto se debe a que no podemos proporcionar una fuente de datos y una conexión al subinforme. Debemos decidirnos por uno de ellos y ceñirnos a él.

  • <returnValue>: se utiliza para asignar el valor de una de las variables del subinforme a una de las variables del informe maestro. Este subelemento tiene los siguientes atributos:

    • subreportVariable : este atributo especifica el nombre de la variable del subinforme cuyo valor se devolverá.

    • toVariable : este atributo especifica el nombre de la variable del informe principal cuyo valor se va a copiar / incrementar con el valor del subinforme.

    • cálculo - Este atributo puede tomar valores: Nada, Recuento, DistinctCount, Suma, Promedio, Mínimo, Máximo, Desviación estándar, Varianza. El valor predeterminado para el cálculo de atributos es "Nada".

    • incrementerFactoryClass : este atributo especifica la clase de fábrica para crear la instancia de incrementer.

  • <subreportExpression>: indica dónde encontrar la plantilla de informe compilado para el subinforme. Este elemento tiene unclassatributo. El atributo de clase puede tomar cualquiera de estos valores: java.lang.String, java.io.File, java.net.URL, java.io.InputStream, net.sf.jasperreports.engine.JasperReport. El valor predeterminado es java.lang.String .

  • isUsingCache: este es un atributo del elemento <subreport>. Este es un booleano, cuando se establece en verdadero , el motor de informes intentará reconocer los objetos de plantilla de subinforme cargados previamente, utilizando su fuente especificada. Esta funcionalidad de almacenamiento en caché solo está disponible para elementos de subinforme que tienen expresiones que devuelven objetos java.lang.String como fuente de plantilla de subinforme, que representan nombres de archivo, URL o recursos de ruta de clases.

Ejemplo

Tomemos un ejemplo simple para demostrar la creación de subinformes utilizando JRDataSource. Primero escribamos dos nuevas plantillas de informes, una que sea un subinforme y la otra un informe maestro. El contenido de la plantilla del subinforme (address_report_template.jrxml) es como se indica a continuación. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test.

<?xml version = "1.0" encoding = "UTF-8"?>
<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 = "address_report_template" pageWidth = "175" pageHeight = "842" 
   columnWidth = "175" leftMargin = "0" rightMargin = "0" 
   topMargin = "0" bottomMargin = "0">

   <field name = "city" class = "java.lang.String"/>
   <field name = "street" class = "java.lang.String"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "20" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "14" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Addresses]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "12" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "12" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "27" splitType = "Stretch">
         
         <textField>
            <reportElement x = "0" y = "0" width = "120" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{city}+" Address:"]]> </textFieldExpression> </textField> <textField isStretchWithOverflow = "true"> <reportElement x = "120" y = "0" width = "435" height = "20"/> <textElement> <font size = "12"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$F{street}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "8" splitType = "Stretch"/>
   </columnFooter>
  
   <pageFooter>
      <band height = "11" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "9" splitType = "Stretch"/>
   </summary>

</jasperReport>

Como usamos una fuente de datos, necesitamos escribir un archivo POJO correspondiente SubReportBean.java Como se muestra abajo. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint -

package com.tutorialspoint;

public class SubReportBean {
   private String city;
   private String street;

   public String getCity() {
      return city;
   }

   public void setCity(String city) {
      this.city = city;
   }

   public String getStreet() {
      return street;
   }

   public void setStreet(String street) {
      this.street = street;
   }
}

Aquí, hemos declarado dos campos 'ciudad' y 'calle' y se definen los métodos getter y setter respectivos.

Ahora, actualice nuestro DataBeanarchivo. Agregaremos un nuevo campo subReportBeanList , que es un java.util.List. Este campo contendrá la lista de objetos SubReportBean. El contenido del archivo DataBean es el siguiente. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import java.util.List;

public class DataBean {
   private String name;
   private String country;
   private List<SubReportBean> subReportBeanList;

   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;
   }

   public List<SubReportBean> getSubReportBeanList() {
      return subReportBeanList;
   }

   public void setSubReportBeanList(List<SubReportBean> subReportBeanList) {
      this.subReportBeanList = subReportBeanList;
   }
}

Actualicemos ahora el archivo C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \DataBeanList.java. El contenido de este archivo es como:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {

      // Create sub report data
      SubReportBean subBean1 = new SubReportBean();
      subBean1.setCity("Mumbai");
      subBean1.setStreet("M.G.Road");
      SubReportBean subBean2 = new SubReportBean();
      subBean2.setCity("New York");
      subBean2.setStreet("Park Street");
      SubReportBean subBean3 = new SubReportBean();
      subBean3.setCity("San Fransisco");
      subBean3.setStreet("King Street");

      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      // Create master report data
      dataBeanList.add(produce("Manisha", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Dennis Ritchie", "USA",
         Arrays.asList(subBean2)));
      dataBeanList.add(produce("V.Anand", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Shrinath", "California",
         Arrays.asList(subBean3)));

      return dataBeanList;
   }

   /*
    * This method returns a DataBean object,
    * with name, country and sub report
    * bean data set in it.
    */
   private DataBean produce(String name, String country,
      List<SubReportBean> subBean) {
      DataBean dataBean = new DataBean();

      dataBean.setName(name);
      dataBean.setCountry(country);
      dataBean.setSubReportBeanList(subBean);

      return dataBean;
   }
}

En el método produce () en el archivo anterior, estamos configurando la lista de SubReportBean.

Ahora, escriba una nueva plantilla de informe maestro (jasper_report_template.jrxml). Guarde este archivo en el directorioC:\tools\jasperreports-5.0.1\test. El contenido de este archivo es el siguiente:

<?xml version = "1.0" encoding = "UTF-8"?>
<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">

   <parameter name = "SUBREPORT_DIR" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression>
         <![CDATA["C:\\tools\\jasperreports-5.0.1\\test\\"]]>
      </defaultValueExpression>
   </parameter>
   
   <field name = "country" class = "java.lang.String"/>
   <field name = "name" class = "java.lang.String"/>
   <field name = "subReportBeanList" class = "java.util.List"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "35" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "204" height = "34"/>
            
            <textElement>
               <font size = "26" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Contact Report]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "17" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "21" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "112" splitType = "Stretch">
            
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Name:]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "20" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Country:]]></text>
         </staticText>
         
         <textField>
            <reportElement x = "104" y = "0" width = "277" height = "20"/>
            
            <textElement>
               <font size = "12"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]> </textFieldExpression> </textField> <textField> <reportElement x = "104" y = "20" width = "277" height = "20"/> <textElement> <font size = "12"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <subreport>
            <reportElement positionType = "Float" x = "335" y = "25" width = "175"
               height = "20" isRemoveLineWhenBlank = "true" backcolor = "#99ccff"/>

            <dataSourceExpression>
               new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
                  ($F{subReportBeanList}) </dataSourceExpression> <subreportExpression class = "java.lang.String"> <![CDATA[$P{SUBREPORT_DIR} + "address_report_template.jasper"]]>
            </subreportExpression>
         </subreport>
         
         <line>
            <reportElement x = "0" y = "50" width = "550" height = "1"/>
         </line>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "19" splitType = "Stretch"/>
   </columnFooter>
   
   <pageFooter>
      <band height = "18" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "14" splitType = "Stretch"/>
   </summary>

</jasperReport>

En la plantilla anterior, hemos definido un nuevo parámetro "SUBREPORT_DIR", que define la ruta del subinforme. Hemos definido un campo subReportBeanList de tipo java.util.List, que corresponde a la propiedad en el archivo DataBean. El elemento <subreport> tiene un subelemento <dataSourceExpression>. Hemos puesto la lista subReportBeanList en una instancia de JRBeanCollectionDataSource. En el subelemento <subreportExpression />, le hemos dado el nombre del subinforme (AddressReport.jasper).

Ahora, escribamos una nueva clase. CreateReportpara compilar y ejecutar nuestra plantilla de informe. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\CreateReport.java son los que se indican a continuación:

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.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class CreateReport {

   public static void main(String[] args) {
      String masterReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.jrxml";
      String subReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/AddressReport.jrxml";
      String destFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.JRprint";
			
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      try {
         /* Compile the master and sub report */
         JasperReport jasperMasterReport = JasperCompileManager
            .compileReport(masterReportFileName);
         JasperReport jasperSubReport = JasperCompileManager
            .compileReport(subReportFileName);

         Map<String, Object> parameters = new HashMap<String, Object>();
         parameters.put("subreportParameter", jasperSubReport);
         JasperFillManager.fillReportToFile(jasperMasterReport, 
            destFileName, parameters, beanColDataSource);

      } catch (JRException e) {

         e.printStackTrace();
      }
      System.out.println("Done filling!!! ...");
   }
}

Aquí, vemos que estamos compilando las plantillas de informe maestro y secundario y pasando el archivo de informe maestro (.jasper) para el llenado del informe.

La generación del informe

Ahora, todos nuestros archivos están listos, compilémoslos y ejecutémoslos usando nuestro proceso de compilación ANT regular. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

El archivo de importación, baseBuild.xml, se obtiene 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the 
      report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class=com.tutorialspoint.CreateReport (viewFullReport es el destino predeterminado) de la siguiente manera:

Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28: 
      warning: 'includeantruntime' was not set, defaulting to
   [javac] Compiling 7 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\
      jasper_report_template.jrxml ... OK.

run:
   [echo] Runnin class : com.tutorialspoint.CreateReport
   [java] Compiling Report Design ...
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] Done filling!!! ...

viewFillReport:
   [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: 72 minutes 13 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:

Aquí, podemos ver que se muestran los atributos Nombre, País y Dirección.

Las personas anteriores tenían que confiar en scriptlets para recopilar los datos del gráfico y representar el gráfico utilizando un elemento de imagen en la plantilla de informe. JasperReports lo simplifica ahora, ya que tiene un soporte integrado para gráficos que utilizan el nuevo componente de gráfico.

Al usar un nuevo componente de gráfico, el usuario debe aplicar solo la configuración visual y definir expresiones que ayudarán a construir el conjunto de datos del gráfico. JasperReports usa JFreeChart como la biblioteca de gráficos subyacente. Al configurar un nuevo componente de gráfico, están involucrados los siguientes tres componentes:

  • El componente de gráfico general.

  • El conjunto de datos del gráfico (que agrupa la configuración relacionada con los datos del gráfico).

  • El gráfico del gráfico (que agrupa la configuración visual relacionada con la forma en que se representan los elementos del gráfico).

JasperReports actualmente admite los siguientes tipos de gráficos: circular, circular 3D, barra, barra 3D, barra XY, barra apilada, barra apilada 3D, línea, línea XY, área, área XY, área apilada, dispersión, burbuja, serie temporal, alta -Low-Open-Close, Candlestick, Multiple Axis, Meter, Termómetro y Gantt.

Propiedades del gráfico

Los gráficos son elementos normales del informe, por lo que comparten algunas de sus propiedades con todos los demás elementos del informe. Hay un elemento JRXML llamado <chart>, utilizado para crear todo tipo de gráficos. Este elemento agrupa configuraciones especiales específicas de gráficos que se aplican a todos los tipos de gráficos.

Subelementos del gráfico

Los subelementos del elemento <chart> son:

  • <reportElement> - Estos son objetos visualizables como textos estáticos, campos de texto, imágenes, líneas y rectángulos que coloca en las secciones de su plantilla de informe.

  • <Box> - Este elemento se usa para rodear gráficos con un borde que se puede personalizar en cada lado.

  • <chartTitle>- Este elemento se utiliza para colocar el título del gráfico. El atributo de posición decide la posición del título del gráfico en el informe. Este elemento tiene atributos:Position(Los valores pueden ser Superior , Inferior , Izquierda , Derecha . El valor predeterminado es Superior ),color. <chartTitle> tiene font y titleExpression como subelementos.

  • <chartSubtitle>- Este elemento se utiliza para colocar el subtítulo del gráfico. Este elemento tiene atributo -color. <chartSubtitle> tiene fuente y subtitleExpression como subelementos.

  • <chartLegend>- El elemento puede controlar las propiedades relacionadas con la fuente, así como el color del texto y el color de fondo de la leyenda del gráfico utilizando este elemento. Este elemento tiene atributos:textColor y backgroundColor.

  • <anchorNameExpression> - Este elemento crea el objetivo para el ancla.

  • <hyperlinkReferenceExpression> - Este elemento contiene una expresión de informe que indica el nombre del recurso externo (generalmente una URL).

  • <hyperlinkAnchorExpression> - El hipervínculo apunta a un ancla en un recurso externo.

  • <hyperlinkPageExpression> - El hipervínculo apunta a una página del informe actual.

  • <hyperlinkTooltipExpression>- Este elemento controla la información sobre herramientas del hipervínculo. El tipo de expresión debe ser java.lang.String .

  • <hyperlinkParameter> - Este elemento cuando está presente genera un hipervínculo final en función de los valores de los parámetros.

Atributos del gráfico

Los atributos en el elemento <chart> disponibles para todos los tipos de gráficos son:

  • isShowLegend- Este atributo se utiliza para determinar si se mostrará una leyenda de gráfico en el informe. Los valores pueden ser verdaderos o falsos . El valor predeterminado es verdadero .

  • evaluationTime- Determina cuándo se evaluará la expresión del gráfico. Los valores pueden ser Ahora , Informe , Página , Columna , Grupo , Banda . El valor predeterminado es Ahora .

  • evaluationGroup- Este atributo determina el nombre del grupo que se utilizará para evaluar las expresiones del gráfico. El valor de este atributo debe coincidir con el nombre del grupo que nos gustaría usar como grupo de evaluación del gráfico.

  • hyperlinkType- Este atributo puede contener cualquier valor de texto. El valor predeterminado es Ninguno . Esto significa que ni los campos de texto ni las imágenes representan hipervínculos, incluso si las expresiones especiales de hipervínculo están presentes.

  • hyperlinkTarget- Este atributo ayuda a personalizar el comportamiento del enlace especificado cuando se hace clic en él en el visor. Los valores pueden ser Self o Blank . El valor predeterminado es Self .

  • bookmarkLevel- Este atributo cuando se establece en un número entero positivo, genera marcadores en los informes exportados a PDF. El valor predeterminado es 0 .

  • customizerClass- Este es el nombre de una clase (opcional) que se puede usar para personalizar el gráfico. El valor de este elemento debe ser una cadena que contenga el nombre de una clase de personalizador.

Personalización de gráficos

Como se mencionó anteriormente, JasperReports usa JFreeChart como la biblioteca de gráficos subyacente. JFreeChart contiene funciones que JasperReports no admite directamente. Podemos aprovechar estas características proporcionando una clase de personalizador a través del atributo customizerClass en el elemento <chart>. Una clase de personalizador no es más que una implementación de la interfaz net.sf.jasperreports.engine.JRChartCustomizer . La forma más sencilla de implementar esta interfaz es extendiendo la clase net.sf.jasperreports.engine.JRAbstractChartCustomizer y así tener acceso a parámetros, campos y variables para una personalización de gráficos más flexible basada en datos de informes.

Conjuntos de datos de gráficos

Una de las propiedades comunes en todos los tipos de gráficos es <dataset> elemento. Los conjuntos de datos de gráficos ayudan a mapear datos de informes y recuperar datos de gráficos en tiempo de ejecución. Cada tipo de gráfico contiene diferentes subelementos para definir las expresiones del gráfico. Estas expresiones definen los datos utilizados para generar el gráfico. Todos estos subelementos contienen un elemento <dataset> que define cuándo se evalúan y restablecen las expresiones del gráfico.

Hay varios tipos de conjuntos de datos de gráficos disponibles en JasperReports porque cada tipo de gráfico funciona con ciertos conjuntos de datos: circular, categoría, XY, serie temporal, período de tiempo, XYZ y alto-bajo. Cada uno de estos tipos de conjuntos de datos implementa la interfaz net.sf.jasperreports.engine.JRChartDataset que define conjuntos de datos de gráficos. Todos los conjuntos de datos de gráficos se inicializan e incrementan de la misma manera; sin embargo, solo difieren en el tipo de datos o series de datos que mapean.

Propiedades del conjunto de datos

La tabla que se muestra a continuación resume los atributos del elemento <dataset> -

Atributo Descripción Valores
resetType Este atributo determina cuándo se restablecerá el valor de la expresión del gráfico. Ninguno, Informe, Página, Columna, Grupo. El valor predeterminado esReport.
resetGroup Este atributo determina el nombre del grupo en el que se restablece el valor de la expresión del gráfico. El valor de este atributo debe coincidir con el nombre de cualquier grupo declarado en la plantilla de informe JRXML.
incrementType Este atributo determina cuándo volver a calcular el valor de la expresión del gráfico. Ninguno, Informe, Página, Columna, Grupo. El valor predeterminado es"None".
incrementGroup Este atributo determina el nombre del grupo en el que se recalcula la expresión del gráfico. El valor de este atributo debe coincidir con el nombre de un grupo declarado en la plantilla de informe JRXML.

La siguiente tabla resume los subelementos del elemento <dataset> -

Elemento secundario Descripción
<incrementWhenExpression> La forma en que se incrementa el conjunto de datos de un gráfico se puede personalizar filtrando los datos no deseados mediante el uso de este subelemento.
<datasetRun> Contiene la información necesaria para crear una instancia de un subconjunto de informes.

Tipos de conjuntos de datos

Los tipos de conjuntos de datos específicos se explican a continuación:

Conjunto de datos circular

Un conjunto de datos circular se caracteriza por las siguientes expresiones:

  • <keyExpression>: representa las categorías que formarán los sectores en el gráfico circular. Esta expresión puede devolver cualquier objeto java.lang.Comparable.

  • <valueExpression>: produce los valores que corresponden a cada categoría / clave en el conjunto de datos. Los valores son siempre objetos java.lang.Number.

  • <labelExpression>: si falta esta expresión, el gráfico mostrará etiquetas predeterminadas para cada sector del gráfico circular. Utilice esta expresión, que devuelve valores java.lang.String, para personalizar las etiquetas de los elementos del gráfico circular.

  • <sectionHyperlink>: establece hipervínculos asociados con las secciones circulares.

Conjunto de datos de categoría

Un conjunto de datos de categoría se caracteriza por el elemento <categorySeries>, que contiene:

  • <seriesExpression>: indica el nombre de la serie. Esta expresión puede devolver cualquier objeto java.lang.Comparable.

  • <categoryExpression>: devuelve el nombre de la categoría para cada valor dentro de la serie especificada por la expresión de la serie. Las categorías son objetos java.lang.Comparable.

  • <valueExpression>: genera los valores que corresponden a cada categoría en el conjunto de datos. Los valores son siempre objetos java.lang.Number.

  • <labelExpression>: si falta esta expresión, el gráfico mostrará etiquetas predeterminadas para cada elemento del gráfico. Utilice esta expresión, que devuelve valores java.lang.String, para personalizar las etiquetas de los elementos del gráfico.

  • <itemHyperlink>: establece hipervínculos asociados con elementos del gráfico.

Conjunto de datos XY

Un conjunto de datos XY se caracteriza por el elemento <xySeries>, que contiene:

  • <seriesExpression>: indica el nombre de la serie. Esta expresión puede devolver cualquier objeto java.lang.Comparable.

  • <xValueExpression>: devuelve el valor java.lang.Number que representa el valor X del par (x, y) que se agregará a la serie de datos actual.

  • <yValueExpression>: devuelve el valor java.lang.Number que representa el valor Y del par (x, y) que se agregará a la serie de datos actual.

  • <labelExpression>: si falta esta expresión, el gráfico mostrará etiquetas predeterminadas para cada elemento del gráfico. Utilice esta expresión, que devuelve valores java.lang.String, para personalizar las etiquetas de los elementos del gráfico.

  • <itemHyperlink>: establece hipervínculos asociados con los elementos del gráfico.

Conjunto de datos XYZ

Un conjunto de datos XYZ se caracteriza por el elemento <xyzSeries>, que contiene:

  • <seriesExpression>: indica el nombre de la serie. Esta expresión puede devolver cualquier objeto java.lang.Comparable.

  • <xValueExpression>: devuelve el valor java.lang.Number que representa el valor X del elemento (x, y, z) que se agregará a la serie de datos actual.

  • <yValueExpression>: devuelve el valor java.lang.Number que representa el valor Y del elemento (x, y, z) que se agregará a la serie de datos actual.

  • <zValueExpression>: devuelve el valor java.lang.Number que representa el valor Z del elemento (x, y, z) que se agregará a la serie de datos actual.

  • <labelExpression>: si falta esta expresión, el gráfico mostrará etiquetas predeterminadas para cada elemento del gráfico. Utilice esta expresión, que devuelve valores java.lang.String, para personalizar las etiquetas de los elementos del gráfico.

  • <itemHyperlink>: establece hipervínculos asociados con los elementos del gráfico.

Conjunto de datos de series temporales

Un conjunto de datos de series de tiempo se caracteriza por el atributo timePeriod y el elemento <timeSeries>. El atributo timePeriod especifica el tipo de serie de datos dentro del conjunto de datos. Las series de tiempo pueden contener valores numéricos asociados con días, meses, años u otros períodos de tiempo predefinidos. Los valores posibles son: año, trimestre, mes, semana, día: este es el valor predeterminado, hora, minuto, segundo, milisegundo.

El elemento <timeSeries> contiene:

  • <seriesExpression>: indica el nombre de la serie. Esta expresión puede devolver cualquier objeto java.lang.Comparable.

  • <timePeriodExpression>: devuelve un valor java.util.Date del cual el motor extraerá el período de tiempo correspondiente según el valor establecido para el atributo timePeriod mencionado anteriormente.

  • <valueExpression>: devuelve el valor java.lang.Number para asociarlo con el valor del período de tiempo correspondiente al incrementar la serie actual del conjunto de datos.

  • <labelExpression>: si falta esta expresión, el gráfico mostrará etiquetas predeterminadas para cada elemento del gráfico. Utilice esta expresión, que devuelve valores java.lang.String, para personalizar las etiquetas de los elementos del gráfico.

  • <itemHyperlink>: establece hipervínculos asociados con los elementos del gráfico.

Conjunto de datos de período de tiempo

Un conjunto de datos de período de tiempo se caracteriza por el elemento <timePeriodSeries>, que contiene:

  • <seriesExpression>: indica el nombre de la serie. Esta expresión puede devolver cualquier objeto java.lang.Comparable.

  • <startDateExpression>: especifica el comienzo del intervalo de fechas con el que se asociará el valor numérico cuando se agregue a la serie del período de tiempo.

  • <endDateExpression>: especifica el final del intervalo de fechas con el que se asociará el valor numérico cuando se agregue a la serie del período de tiempo.

  • <valueExpression>: devuelve el valor java.lang.Number para asociarlo con el intervalo de fecha actual especificado por las expresiones de fecha de inicio y fecha de finalización.

  • <labelExpression>: si falta esta expresión, el gráfico mostrará etiquetas predeterminadas para cada elemento del gráfico. Utilice esta expresión, que devuelve valores java.lang.String, para personalizar las etiquetas de los elementos del gráfico.

  • <itemHyperlink>: establece hipervínculos asociados con los elementos del gráfico.

Conjunto de datos alto bajo

Un conjunto de datos alto bajo se caracteriza por las siguientes expresiones:

  • <seriesExpression>: actualmente, solo se admite una serie dentro de un gráfico High-Low o Candlestick. Sin embargo, esta serie única debe identificarse mediante un valor java.lang.Comparable devuelto por esta expresión, y también debe usarse como el nombre de la serie en la leyenda del gráfico.

  • <dateExpression>: devuelve la fecha a la que se refiere el elemento actual (alto, bajo, abierto, cerrado, volumen).

  • <highExpression>: devuelve un valor java.lang.Number, que será parte del elemento de datos agregado a la serie cuando se incremente el conjunto de datos.

  • <lowExpression>: devuelve un valor java.lang.Number, que será parte del elemento de datos agregado a la serie cuando se incremente el conjunto de datos.

  • <openExpression>: devuelve un valor java.lang.Number, que será parte del elemento de datos agregado a la serie cuando se incremente el conjunto de datos.

  • <closeExpression>: devuelve un valor java.lang.Number, que será parte del elemento de datos agregado a la serie cuando se incremente el conjunto de datos.

  • <volumeExpression>: una expresión numérica que devuelve el valor de volumen que se utilizará para el elemento de datos actual. Se utiliza solo para gráficos de velas japonesas.

  • <itemHyperlink>: establece hipervínculos asociados con los elementos del gráfico.

Conjunto de datos de valor

Esta es una implementación de conjunto de datos de gráfico especial que contiene un valor único y se utiliza para representar gráficos de medidor y termómetro. El valor se recopila mediante la expresión <valueExpression>.

Gráficos gráficos

Otro elemento común de JRXML en todos los tipos de gráficos es <plot> elemento. Esto nos permite definir varias de las características del gráfico, como la orientación y el color de fondo. Los gráficos difieren según el tipo de gráfico.

Atributo de la trama

La tabla que se muestra a continuación resume los atributos del elemento <plot> -

Atributo Descripción Valores
color de fondo Este atributo define el color de fondo del gráfico. Cualquier valor hexadecimal de seis dígitos es un valor válido para este atributo. El valor hexadecimal debe ir precedido de un #.
orientación Este atributo define la orientación del gráfico. Horizontal, vertical El valor predeterminado es "Vertical"
fondo alfa Este atributo define la transparencia del color de fondo del gráfico. Los valores válidos para este atributo incluyen cualquier número decimal entre 0 y 1, inclusive. Cuanto mayor sea el número, menos transparente será el fondo. El valor predeterminado es "1".
primer plano alfa Este atributo define la transparencia de los colores de primer plano del gráfico. Los valores válidos para este atributo incluyen cualquier número decimal entre 0 y 1, inclusive. Cuanto mayor sea el número, menos transparente será el fondo. El valor predeterminado es "1".
labelRotation Este atributo permite la rotación de etiquetas de texto en el eje x para girar en sentido horario o antihorario. Este atributo se aplica solo a gráficos para los que el eje x no es numérico o no muestra fechas. El valor predeterminado es "0.0".

El elemento <plot> tiene un subelemento <seriesColor> cuyos atributos son: seriesOrder y color . Este elemento personaliza los colores de las series y su posición dentro de la secuencia de colores.

Configuración específica para gráficos de gráficos

  • piePlot - No tiene configuraciones específicas

  • pie3DPlot- Contiene el atributo depthFactor , un valor numérico que va de 0 a 1 que representa la profundidad del gráfico como porcentaje de la altura del área de la parcela.

  • barPlot - Se pueden mostrar u ocultar etiquetas de graduación, marcas de graduación o etiquetas de elementos, y proporciona configuraciones para ambos ejes.

  • bar3DPlot - Proporciona la misma configuración que barPlot y genera un efecto 3D utilizando los atributos xOffset y yOffset.

  • linePlot - Uno puede mostrar u ocultar líneas que conectan puntos de elementos, puede mostrar u ocultar formas asociadas con puntos de elementos y proporciona configuraciones para ambos ejes.

  • scatterPlot - Similar a linePlot, puede mostrar u ocultar líneas que conectan puntos de elementos, puede mostrar u ocultar formas asociadas con puntos de elementos y proporciona configuraciones para ambos ejes.

  • areaPlot - Proporciona ajustes para ambos ejes.

  • bubblePlot - Se pueden establecer las dimensiones de la burbuja configurando el atributo scaleType y proporciona configuraciones para ambos ejes.

  • timeSeriesPlot - Uno puede mostrar u ocultar líneas que conectan puntos de elementos, puede mostrar u ocultar formas asociadas con puntos de elementos y proporciona configuraciones para ambos ejes.

  • highLowPlot - Uno puede mostrar u ocultar tics abiertos, puede mostrar u ocultar ticks cercanos y proporciona configuraciones para ambos ejes.

  • candlestickPlot - Uno puede mostrar u ocultar el volumen y proporciona configuraciones para ambos ejes.

  • meterPlot - Contiene configuraciones específicas para la forma del cuadrante, el ángulo de escala, las unidades de medida, el intervalo de marcación, el color del cuadrante, el color de la aguja, el color de la marca, la fuente de visualización del valor, el patrón de color y formato, el rango de datos y los intervalos de medición.

  • thermometerPlot - Contiene configuraciones específicas para la ubicación del valor, color de mercurio, mostrar / ocultar líneas de valor, fuente de visualización de valor, patrón de color y formato, rango de datos, rango bajo, rango medio y rango alto.

  • multiAxisChart - Contiene configuraciones específicas para el eje incluido en el gráfico.

Tipos de gráficos

JasperReports ofrece soporte integrado para varios tipos de gráficos. Se enumeran a continuación:

  • pieChart - Una combinación de un conjunto de datos circular y un gráfico circular.

  • pie3DChart - Agrupa un conjunto de datos circular y un gráfico circular 3D.

  • barChart - Una combinación básica de un conjunto de datos de categoría y un diagrama de barras.

  • bar3DChart - Envuelve un conjunto de datos de categoría y un gráfico de barras en 3D.

  • xyBarChart - Admite conjuntos de datos de período de tiempo, conjuntos de datos de series temporales y conjuntos de datos XY, y utiliza un gráfico de barras para representar el eje y los elementos.

  • stackedBarChart - Utiliza datos de un conjunto de datos de categoría y representa su contenido mediante un gráfico de barras.

  • stackedBar3DChart - Utiliza datos de un conjunto de datos de categoría y representa su contenido mediante un gráfico de barras 3D.

  • lineChart - Agrupa un conjunto de datos de categoría y un gráfico de línea.

  • xyLineChart - Agrupa un conjunto de datos XY y un gráfico de línea.

  • areaChart - Los elementos de un conjunto de datos de categoría se representan mediante un gráfico de área.

  • stackedAreaChart - Los elementos de un conjunto de datos de categoría se representan mediante un gráfico de área.

  • xyAreaChart - Utiliza datos de un conjunto de datos XY y los representa a través de un gráfico de área.

  • scatterChart - Envuelve un conjunto de datos XY con un diagrama de dispersión.

  • bubbleChart - Combina un conjunto de datos XYZ con un gráfico de burbujas.

  • timeSeriesChart - Agrupa un conjunto de datos de series temporales y una gráfica de series temporales.

  • highLowChart - Una combinación de un conjunto de datos High-Low y un gráfico High-Low.

  • candlestickChart - Utiliza datos de un conjunto de datos alto-bajo pero con un gráfico de velas especiales.

  • meterChart - Muestra un solo valor de un conjunto de datos de valor en un dial, usando opciones de representación de un gráfico de medidor.

  • thermometerChart - Muestra el valor único en un conjunto de datos de valor utilizando las opciones de representación de un gráfico de termómetro.

  • multiAxisChart - Contiene múltiples ejes de rango, todos compartiendo un eje de dominio común.

Ejemplo

Para demostrar los gráficos, escribamos una nueva plantilla de informe (jasper_report_template.jrxml). Aquí, agregaremos el <barChart> elemento a la sección <pageHeader> y <pieChart> a la sección <summary>. Estaríamos mostrando en gráficos las notas obtenidas para cada asignatura. Guárdelo en el directorioC:\tools\jasperreports-5.0.1\test. El contenido del archivo es el que se indica a continuación:

<?xml version = "1.0" encoding = "UTF-8"?>

<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" pageWidth = "595" pageHeight = "860"
   columnWidth = "515" leftMargin = "40" rightMargin = "40"
   topMargin = "50" bottomMargin = "50">

   <field name = "subjectName" class = "java.lang.String"/>
   <field name = "marks" class = "java.lang.Integer"/>
   
   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression>
         <![CDATA[Boolean.TRUE]]>
      </variableExpression>
   </variable>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "79" splitType = "Stretch"/>
   </title>
   
   <pageHeader>
      <band height = "200">
    
         <barChart>
            <chart evaluationTime = "Report">
               <reportElement x = "0" y = "0" width = "555" height = "200"/>
            
               <chartTitle>
                  <titleExpression>
                     <![CDATA["My First JR Bar Chart"]]>
                  </titleExpression>
               </chartTitle>
            </chart>
      
            <categoryDataset>
               <dataset incrementType = "None"/>
            
               <categorySeries>
                  <seriesExpression>
                     <![CDATA[$F{subjectName}]]>
                  </seriesExpression>
            
                  <categoryExpression>
                     <![CDATA[$F{subjectName}]]> </categoryExpression> <valueExpression> <![CDATA[$F{marks}]]>
                  </valueExpression>

               </categorySeries>
            </categoryDataset>
      
            <barPlot isShowTickMarks = "false">
               <plot/>
            </barPlot>
         </barChart>
      
      </band>
   </pageHeader>
   
   <columnHeader>
      <band height = "20" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "20" splitType = "Stretch"/>
   </detail>
   
   <columnFooter>
      <band height = "20" splitType = "Stretch"/>
   </columnFooter>
   
   <pageFooter>
      <band height = "20" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "400" splitType = "Stretch">
      
         <pieChart>
            <chart evaluationTime = "Report">
               <reportElement x = "135" y = "0" width = "270" height = "300"/>
            
               <chartTitle>
                  <titleExpression>
                     <![CDATA["My First JR Pie Chart"]]>
                  </titleExpression>
               </chartTitle>
            </chart>
         
            <pieDataset>
               <dataset incrementType = "None"/>
               
               <keyExpression>
                  <![CDATA[$F{subjectName}]]> </keyExpression> <valueExpression> <![CDATA[$F{marks}]]>
               </valueExpression>
            </pieDataset>
            
            <piePlot>
               <plot/>
               <itemLabel/>
            </piePlot>
         </pieChart>
      
      </band>
   </summary>
	
</jasperReport>

Los detalles del archivo anterior son los que se indican a continuación:

  • El elemento JRXML utilizado para crear un gráfico de barras es </barChart> en <pageHeader>. Contiene un subelemento </chart>, que contiene un subelemento <reportElement> que define las dimensiones y la posición del gráfico.

  • El elemento <dataset> en un gráfico de barras debe incluirse entre los elementos <categoryDataset> y </categoryDataset> JRXML.

  • <categoryDataset> debe contener un elemento <categorySeries>. Este elemento define qué elemento de datos representarán las barras (nombres de sujetos, en este ejemplo).

  • <categoryDataset> también debe contener un elemento, que define cómo se separarán los datos en categorías para la comparación. Aquí, los datos están separados por nombres de sujetos.

  • El elemento <valueExpression> define qué expresión se usa para determinar el valor de cada barra en el gráfico. Aquí, estamos usando "marcas".

  • Para el gráfico circular, hemos utilizado el elemento <pieChart> en la sección <summary>. Contiene un subelemento </chart>.

  • El subelemento contiene una expresión de informe que indica qué utilizar como clave en el gráfico. Aquí, hemos utilizado subjectName.

  • El subelemento contiene una expresión que se utiliza para calcular el valor de la clave. Aquí, hemos utilizado marcas.

Los códigos de Java para el llenado de informes no se modifican. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son los que se indican a continuación:

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();
      }
   }
}

Como estaríamos mostrando las calificaciones obtenidas para cada asignatura, es necesario cambiar POJO. El archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java los contenidos son los que se indican a continuación:

package com.tutorialspoint;

public class DataBean {
   private String subjectName;
   private Integer marks;

   public String getSubjectName() {
      return subjectName;
   }

   public void setSubjectName(String subjectName) {
      this.subjectName = subjectName;
   }

   public Integer getMarks() {
      return marks;
   }

   public void setMarks(Integer marks) {
      this.marks = marks;
   }

}

Incluso el contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java debe actualizarse como se indica a continuación:

package com.tutorialspoint;

import java.util.ArrayList;

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

      dataBeanList.add(produce("English", 58));
      dataBeanList.add(produce("SocialStudies", 68));
      dataBeanList.add(produce("Maths", 38));
      dataBeanList.add(produce("Hindi", 88));
      dataBeanList.add(produce("Scince", 78));
      
      return dataBeanList;
   }

   /*
    * This method returns a DataBean object, with subjectName ,
    * and marks set in it.
    */
   private DataBean produce(String subjectName, Integer marks) {
      DataBean dataBean = new DataBean();

      dataBean.setSubjectName(subjectName);
      dataBean.setMarks(marks);

      return dataBean;
   }
}

La generación del informe

A continuación, compilemos y ejecutemos los archivos anteriores utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

El archivo de importación, baseBuild.xml, se obtiene 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the 
      report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino 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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting to bu
   [javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.

viewFillReport:
   [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: 19 minutes 45 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como en la siguiente pantalla:

Aquí, vemos que el gráfico de barras se crea en el encabezado de página y el gráfico circular se crea en las secciones de resumen.

Los informes de tabla cruzada (tabulación cruzada) son los informes que contienen tablas que organizan los datos en filas y columnas en forma tabular. El objeto de tabla de referencias cruzadas se utiliza para insertar un informe de tabla de referencias cruzadas dentro del informe principal. Las tablas de referencias cruzadas se pueden utilizar con cualquier nivel de datos (nominal, ordinal, intervalo o relación) y, por lo general, muestran los datos resumidos, contenidos en las variables del informe, en forma de tabla dinámica. Las variables se utilizan para mostrar datos agregados como sumas, recuentos, valores promedio.

Propiedades de la tabla de referencias cruzadas

Elemento JRXML <crosstab> se utiliza para insertar una tabla de referencias cruzadas en un informe.

Atributo

A continuación se muestra una lista de atributos de un <crosstab> elemento -

  • isRepeatColumnHeaders: Indica si los encabezados de las columnas deben volver a imprimirse después de un salto de página. El valor predeterminado es verdadero .

  • isRepeatRowHeaders- Indica si los encabezados de fila deben volver a imprimirse después de un salto de columna de tabla cruzada. El valor predeterminado es verdadero .

  • columnBreakOffset- Cuando se produce un salto de columna, indica la cantidad de espacio vertical, medido en píxeles, antes de la siguiente pieza de la tabla de referencias cruzadas que se colocará debajo de la anterior en la misma página. El valor predeterminado es 10.

  • runDirection- Indica si los datos de la tabla de referencias cruzadas se deben completar de izquierda a derecha (LTR) o de derecha a izquierda (RTL). El valor predeterminado es LTR.

  • ignoreWidth- Indica si la tabla de referencias cruzadas se extenderá más allá del límite de ancho de la tabla de referencias cruzadas inicial y no generará saltos de columna. De lo contrario, dejará de renderizar columnas dentro del límite de ancho de la tabla de referencias cruzadas y continuará con las columnas restantes solo después de que todas las filas hayan comenzado a renderizarse. El valor predeterminado es falso .

Elementos secundarios

Un elemento <crosstab> tiene los siguientes subelementos:

  • <reportElement>- Este elemento define la posición, el ancho y la altura de la tabla de referencias cruzadas dentro de su recinto. Los atributos de este elemento incluyen todos los atributos estándar <reportElement>.

  • <crosstabParameter>- Este elemento se utiliza para acceder a variables y parámetros del informe desde la tabla de referencias cruzadas. Los atributos de este elemento incluyen:

    • nombre : esto define el nombre del parámetro.

    • clase : indica la clase de parámetro.

  • <parametersMapExpression>- Este elemento se utiliza para pasar una variable de informe o un parámetro que contiene una instancia de java.util.Map , como un conjunto de parámetros para la tabla de referencias cruzadas. Este elemento no contiene atributos.

  • <crosstabDataset>- Este elemento define el conjunto de datos que se utilizará para completar la tabla de referencias cruzadas (consulte la siguiente sección para obtener una explicación detallada). Los atributos de este elemento incluyen:

    • isDataPreSorted : esto indica si los datos en el conjunto de datos están preordenados. El valor predeterminado es falso .

  • <crosstabHeaderCell>- Este elemento define el contenido de la región que se encuentra en la esquina superior izquierda de la tabla de referencias cruzadas donde se encuentran los encabezados de columna y de fila. El tamaño de esta celda se calcula automáticamente en función de los anchos y alturas de filas y columnas definidas.

  • <rowGroup>- Este elemento define un grupo utilizado para dividir los datos en filas. Los atributos de este elemento incluyen:

    • nombre : esto define el nombre del grupo de filas.

    • ancho : esto define el ancho del grupo de filas.

    • headerPosition : define la posición del contenido del encabezado (Superior, Medio, Inferior, Estirado).

    • totalPosition : define la posición de toda la columna (Inicio, Fin, Ninguno).

    Este elemento contiene los siguientes subelementos:

    • <bucket>

    • <crosstabRowHeader>

    • <crosstabTotalRowHeader>

  • <columnGroup>- Este elemento define un grupo utilizado para dividir los datos en columnas. Los atributos de este elemento incluyen:

    • nombre : define el nombre del grupo de columnas.

    • altura : define la altura del encabezado del grupo de columnas.

    • headerPosition : define la posición del contenido del encabezado ( derecha, izquierda, centro, estirar ).

    • totalPosition : define la posición de toda la columna ( Inicio, Fin, Ninguno ).

    Este elemento contiene los siguientes subelementos:

    • <bucket>

    • <crosstabColumnHeader>

    • <crosstabTotalColumnHeader>

  • <measure>- Este elemento define el cálculo que se realizará en filas y columnas. Los atributos de este elemento incluyen:

    • name : esto define el nombre de la medida.

    • clase : indica la clase de medida.

    • cálculo : indica el cálculo que se realizará entre los valores de celda de la tabla de referencias cruzadas. Sus valores pueden ser cualquiera de estos: Nothing, Count, DistinctCount, Sum, Average, Lowest, Highest, StandardDeviation, Variance y First . El valor predeterminado esNothing.

  • <crosstabCell>- Este elemento define cómo se distribuirán los datos en las celdas sin encabezado. Los atributos de este elemento incluyen:

    • columnTotalGroup : indica el grupo que se utilizará para calcular el total de la columna.

    • altura : esto define la altura de la celda.

    • rowTotalGroup : indica el grupo que se utilizará para calcular el total de la fila.

    • ancho : esto define el ancho de la celda.

  • <whenNoDataCell>- Este elemento define qué mostrar en una celda de tabla cruzada vacía. Este elemento no contiene atributos.

Agrupación de datos en tabla cruzada

El motor de cálculo de tabla de referencias cruzadas agrega datos iterando a través de los registros del conjunto de datos asociados. Para agregar datos, es necesario agruparlos primero. En una tabla de referencias cruzadas, las filas y columnas se basan en elementos de grupo específicos, denominadosbuckets. Una definición de depósito debe contener:

  • bucketExpression : la expresión que se evaluará para obtener elementos del grupo de datos.

  • comparatorExpression : necesario en el caso de que el orden natural de los valores no sea la mejor opción.

  • orderByExpression : indica el valor utilizado para ordenar los datos.

Los grupos de filas y columnas (definidos anteriormente) en una tabla de referencias cruzadas se basan en buckets.

Variables totales de tabla cruzada incorporadas

A continuación se muestra una lista del valor actual de la medida y se puede acceder a los totales de los diferentes niveles correspondientes a la celda a través de variables nombradas de acuerdo con el siguiente esquema:

  • El valor actual de un cálculo de medida se almacena en una variable que tiene el mismo nombre que la medida.

  • <Medida> _ <Grupo de columnas> _TODOS : esto produce el total de todas las entradas en el grupo de columnas de la misma fila.

  • <Medida> _ <Grupo de filas> _TODOS : esto produce el total de todas las entradas en el grupo de filas de la misma columna.

  • <Medida> _ <Grupo de filas> _ <Grupo de columnas> _TODOS : esto produce el total combinado correspondiente a todas las entradas en los grupos de filas y columnas.

Ejemplo

Para demostrar las tablas de referencias cruzadas, escriba una nueva plantilla de informe (jasper_report_template.jrxml). Aquí, agregaremos la tabla de referencias cruzadas a la sección de resumen. Guárdelo en el directorioC:\tools\jasperreports-5.0.1\test. El contenido del archivo es el que se indica a continuación:

<?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">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <field name = "name" class = "java.lang.String"/>
   <field name = "country" class = "java.lang.String"/>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <summary> <band height = "60"> <crosstab> <reportElement width = "782" y = "0" x = "0" height = "60"/> <rowGroup name = "nameGroup" width = "100"> <bucket> <bucketExpression class = "java.lang.String"> <![CDATA[$F{name}]]>
               </bucketExpression>
            </bucket>
            
            <crosstabRowHeader>
            
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  
                  <textField>
                     <reportElement width = "100" y = "0" x = "0" height = "20"/>
                     <textElement textAlignment = "Right" 
                        verticalAlignment = "Middle"/>
                     
                     <textFieldExpression>
                        <![CDATA[$V{nameGroup}]]> </textFieldExpression> </textField> </cellContents> </crosstabRowHeader> </rowGroup> <columnGroup name = "countryGroup" height = "20"> <bucket> <bucketExpression class = "java.lang.String"> $F{country}
               </bucketExpression>
            </bucket>
            
            <crosstabColumnHeader>
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  <textField isStretchWithOverflow = "true">
                     <reportElement width = "60" y = "0" x = "0" height = "20"/>
                     <textElement verticalAlignment = "Bottom"/>
                     <textFieldExpression>
                        <![CDATA[$V{countryGroup}]]> </textFieldExpression> </textField> </cellContents> </crosstabColumnHeader> </columnGroup> <measure name = "tailNumCount" class = "java.lang.Integer" calculation = "Count"> <measureExpression>$F{country}</measureExpression>
         </measure>
         
         <crosstabCell height = "20" width = "60">
            <cellContents backcolor = "#FFFFFF">
               <box borderColor = "black" border = "Thin"/>
               <textField>
                  <reportElement x = "5" y = "0" width = "55" height = "20"/>
                  <textElement textAlignment = "Left" 
                     verticalAlignment = "Bottom"/>
                  <textFieldExpression class = "java.lang.Integer">
                      $V{tailNumCount}
                  </textFieldExpression>
               </textField>
            </cellContents>
         </crosstabCell>
      
      </crosstab>
      
      </band>
   </summary>
	
</jasperReport>

Los detalles del archivo anterior son los siguientes:

  • La tabla de referencias cruzadas se define mediante el elemento <crosstab>.

  • El elemento <rowGroup> define un grupo para dividir los datos en filas. Aquí, cada fila mostrará datos con un nombre diferente.

  • Los elementos <bucket> y <bucketExpression> definen qué expresión de informe usar como delimitador de grupo para <rowGroup>. Aquí, usamos el campo de nombre como un delimitador para dividir las filas por nombre.

  • El elemento <crosstabRowHeader> define la expresión que se utilizará como encabezado de fila. Contiene un único subelemento, llamado <cellContents>, que actúa como una banda interior dentro de la tabla de referencias cruzadas. En lugar de definir el nombre de la variable para el campo de texto dentro de <crosstabRowHeader>, hemos asignado el nombre a <rowGroup> (a través de su atributo de nombre), por lo tanto, crea una variable implícita. El elemento <crosstabRowHeader> define el contenido de la celda del encabezado para toda la fila. Toma un solo elemento <cellContents> como su único subelemento.

  • El elemento <columnGroup> así como sus subelementos son análogos al elemento <rowGroup>, excepto que influye en las columnas en lugar de en las filas.

  • El elemento <measure> define el cálculo que se realizará en filas y columnas. El atributo de cálculo se establece en Recuento .

  • El elemento <crosstabCell> define cómo se distribuirán los datos en las celdas sin encabezado. Este elemento también contiene un único elemento <crosstabCell> como único subelemento.

Los códigos de Java para el llenado de informes no se modifican. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son los que se indican a continuación:

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();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los siguientes:

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;
   }
}

El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los siguientes:

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;
   }
}

La generación del informe

A continuación, compilemos y ejecutemos los archivos anteriores utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

El archivo de importación, baseBuild.xml, se obtiene 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the 
      report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino 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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting to
   [javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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.

viewFillReport:
   [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: 20 minutes 53 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:

Aquí vemos que cada país y nombre están tabulados.

A veces, necesitamos informes en diferentes idiomas. Escribir el mismo informe para cada idioma diferente implica mucho trabajo redundante. Solo los fragmentos de texto que difieren de un idioma a otro deben escribirse por separado y cargarse en elementos de texto en tiempo de ejecución, según la configuración regional. Este es el propósito de la internacionalización del informe. Los informes internacionalizados, una vez escritos, pueden ejecutarse en todas partes.

En los siguientes pasos, hemos enumerado cómo generar un informe en diferentes idiomas y también algunas otras características de la internacionalización de informes:

  • Asocie un paquete de recursos java.util.ResourceBundle con la plantilla de informe. Hay dos formas de asociar el objeto java.util.ResourceBundle con la plantilla de informe.

    • En tiempo de diseño, estableciendo el atributo resourceBundle del objeto de plantilla de informe en el nombre base del paquete de recursos de destino.

    • Se puede realizar una asociación dinámica / en tiempo de ejecución proporcionando un objeto java.util.ResourceBundle como valor para el parámetro REPORT_RESOURCE_BUNDLE en el momento de completar el informe.

    • Si el informe debe generarse en una configuración regional diferente a la actual, el parámetro incorporado REPORT_LOCALE se puede utilizar para especificar la configuración regional del tiempo de ejecución al completar el informe.

  • Para facilitar la internacionalización de informes, una sintaxis especial $R{}está disponible dentro de las expresiones del informe para hacer referencia a los recursos java.lang.String colocados dentro de un objeto java.util.ResourceBundle asociado con el informe. los$R{} la sintaxis de caracteres extrae el recurso específico de la configuración regional del paquete de recursos en función de la clave que debe colocarse entre corchetes:

<textFieldExpression>
   $R{report.title}
</textFieldExpression>

El campo de texto anterior muestra el título del informe extrayendo el valor String del paquete de recursos asociado con la plantilla de informe según la configuración regional suministrada por el tiempo de ejecución y la clave report.title .

  • Al formatear mensajes en diferentes idiomas según la configuración regional del informe, hay un método integrado dentro de los informes net.sf.jasperreports.engine.fill.JRCalculator . Este método ofrece una funcionalidad similar a la clase java.text.MessageFormat . Este método, msg (), tiene tres firmas convenientes que le permiten usar hasta tres parámetros de mensaje en los mensajes.

  • Un método str () integrado (el equivalente a la sintaxis $ R {} dentro de las expresiones del informe), que da acceso al contenido del paquete de recursos según la configuración regional del informe.

  • Para formatear la fecha y la hora, el parámetro incorporado REPORT_TIME_ZONE se puede utilizar para garantizar las transformaciones de hora adecuadas.

  • En la salida generada, la biblioteca mantiene información sobre la dirección de ejecución del texto para que los documentos generados en idiomas que tienen escritura de derecha a izquierda (como árabe y hebreo) se puedan procesar correctamente.

  • Si una aplicación se basa en el visor Swing integrado para mostrar los informes generados, debe internacionalizarse adaptando la información sobre herramientas del botón u otros textos que se muestran. Esto es muy fácil de hacer, ya que el espectador se basa en un paquete de recursos predefinido para extraer información específica de la configuración regional. El nombre base de este paquete de recursos es net.sf.jasperreports.view.viewer.

Ejemplo

Para demostrar la internacionalización, escribamos una nueva plantilla de informe (jasper_report_template.jrxml). El contenido del JRXML se muestra a continuación. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test.

<?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" resourceBundle = "localizationdemo">
   
   <title>
      <band height = "552">
         
         <textField>
            <reportElement positionType = "Float" x = "150" y = "20" 
               width = "400" height = "50"/>
            
            <textElement>
               <font size = "24"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{REPORT_LOCALE}.getDisplayName ($P{REPORT_LOCALE})]]>
            </textFieldExpression>
         </textField>

         <textField isStretchWithOverflow = "true" isBlankWhenNull = "true">
            <reportElement positionType = "Float" x = "20" y = "125" 
               width = "530" height = "20"/>
            
            <textElement textAlignment = "Justified">
               <font size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$R{localization.text1}]]>
            </textFieldExpression>
         
         </textField>
      
      </band>
   </title>

</jasperReport>

En el archivo anterior, el atributo resourceBundle del elemento <jasperReport> le dice a JasperReports dónde obtener las cadenas localizadas para usar en el informe. Necesitamos crear un archivo de propiedades con un nombre raíz que coincida con el valor del atributo. Este archivo debe existir en cualquier lugar de CLASSPATH al completar el informe. En este ejemplo, el archivo de propiedadeslocalizationdemo.properties se guarda en el directorio C:\tools\jasperreports-5.0.1\test. El contenido de este archivo es el siguiente:

localization.text1 = This is English text.

Para utilizar una configuración regional diferente, el nombre del archivo debe ser localizationdemo [locale] .properties. Aquí, escribiremos un archivo para la configuración regional en español. Guarde este archivo como -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. El contenido de este archivo es el siguiente:

localization.text1 = Este texto es en Español.

La sintaxis para obtener el valor de las propiedades resourceBundle es $ R {clave}.

Para que JasperReports sepa qué configuración regional deseamos usar, debemos asignar un valor a un parámetro incorporado. El nombre de este parámetro se define como una constante llamada REPORT_LOCALE, y esta constante se define en la clase net.sf.jasperreports.engine.JRParameter . El valor de la constante debe ser una instancia de java.util.Locale . Esta lógica está incorporada en el código Java para completar y generar el informe. Guardemos este archivoJasperReportFillI18.javaal directorio C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. El contenido del archivo es el siguiente:

package com.tutorialspoint;

import java.util.HashMap;
import java.util.Locale;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperReportFillI18 {

   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/"
         + "jasper_report_template.jasper";
      HashMap parameterMap = new HashMap();
      if (args.length > 0) {
         parameterMap.put(JRParameter.REPORT_LOCALE, new Locale(args[0]));
      }
      try {
         JasperFillManager.fillReportToFile(sourceFileName, null, 
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

El archivo de importación, baseBuild.xml, se obtiene 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 = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the report stored 
      in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </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 comandoant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport es el destino predeterminado) de la siguiente manera:

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

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting to
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes
   [javac] Note: C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\
      JasperReportFillI18.java
   uses unchecked or u
   [javac] Note: Recompile with -Xlint:unchecked for details.

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

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

viewFillReport:
   [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: 3 minutes 28 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación: