Expresión de informe

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, suponiendo que se hayan 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 del informe son expresiones 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 de 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".