Expression de rapport

Les expressions de rapport sont les fonctionnalités puissantes de JasperReports, qui nous permettent d'afficher des données calculées sur un rapport. Les données calculées sont les données qui ne sont pas des données statiques et qui ne sont pas spécifiquement transmises en tant que paramètre de rapport ou champ de source de données. Les expressions de rapport sont construites à partir de la combinaison de paramètres de rapport, de champs et de données statiques. Le langage Java est utilisé par défaut pour écrire des expressions de rapport. D'autres langages de script pour les expressions de rapport comme le langage de script Groovy, JavaScript ou le script BeanShell sont pris en charge par les compilateurs JasperReports.

Ce chapitre vous expliquera comment fonctionnent les expressions de rapport, en supposant qu'elles ont été écrites en langage Java uniquement. Dans un modèle de rapport JRXML, il existe plusieurs éléments qui définissent les expressions comme -

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

Déclaration d'expression

Fondamentalement, toutes les expressions de rapport sont des expressions Java, qui peuvent référencer les champs de rapport, les variables de rapport et les paramètres de rapport.

Référence de champ dans l'expression

Pour utiliser une référence de champ de rapport dans une expression, le nom du champ doit être placé entre $F{et} séquences de caractères, comme indiqué ci-dessous -

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

Voici un morceau de code de notre fichier JRXML existant (chapitre Modèles de rapports) -

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

Référence de variable dans l'expression

Pour référencer une variable dans une expression, il faut mettre le nom de la variable entre $V{et} comme le montre l'exemple ci-dessous -

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

Référence de paramètre dans l'expression

Pour référencer un paramètre dans une expression, le nom du paramètre doit être placé entre $P{et} comme le montre l'exemple ci-dessous -

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

Voici un morceau de code de notre fichier JRXML existant, qui montre le référencement de paramètre dans une expression. (JRXML du chapitre Report Designs ) -

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

Comme vous l'avez vu ci-dessus, les références de paramètre, de champ et de variable sont en fait de vrais objets Java. Connaissant leur classe à partir du paramètre, du champ ou de la déclaration de variable effectuée dans le modèle de rapport, nous pouvons même appeler des méthodes sur ces références d'objet dans les expressions.

L'exemple suivant montre - comment extraire et afficher la première lettre du champ de rapport java.lang.String "Nom" -

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

Référence de l'ensemble de ressources dans l'expression

Pour référencer une ressource dans une expression, la clé doit être placée entre$R{et} comme le montre l'exemple ci-dessous -

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

En fonction des paramètres régionaux fournis par l'exécution et de la clé report.title , l'ensemble de ressources associé au modèle de rapport est chargé. Par conséquent, le titre du rapport est affiché en extrayant la valeur String de l'ensemble de ressources. Pour en savoir plus sur l'internationalisation, consultez le chapitre Internationalisation .

Calculatrice

Calculator est une entité de JasperReports, qui évalue les expressions et incrémente les variables ou les ensembles de données au moment du remplissage du rapport. Pendant le processus de compilation, les informations sont produites et stockées dans le rapport de compilation par le compilateur. Ces informations sont utilisées pendant le temps de remplissage du rapport pour créer une instance de la classe net.sf.jasperreports.engine.fill.JRCalculator.

Le fichier source Java est généré et compilé par des compilateurs de rapports basés sur Java à la volée. Cette classe générée est une sous-classe de JRCalculator, et le bytecode produit en la compilant est stocké dans l'objet JasperReport. Ce bytcode est chargé au moment du remplissage du rapport et la classe résultante est instanciée pour obtenir l'objet calculateur nécessaire à l'évaluation de l'expression.

Expressions conditionnelles

JasperReports ne prend pas en charge les instructions if-else lors de la définition d'expressions variables. Au lieu de cela, vous pouvez utiliser les opérateurs ternaires{cond} ? {statement 1} : {statement 2}. Cet opérateur peut être imbriqué dans une expression Java pour obtenir la sortie souhaitée en fonction de plusieurs conditions.

Exemple d'expression conditionnelle dans le rapport

Modifions le modèle de rapport existant (Chapter Report Designs ) et ajoutons une expression conditionnelle pour le champ country. Le modèle de rapport révisé (jasper_report_template.jrxml) est le suivant. Enregistrez-le dans le répertoire 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>

Les codes java pour le remplissage des rapports sont les suivants. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sont comme -

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

Le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme -

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

Nous ajouterons un nouvel enregistrement avec le champ country vide dans notre liste de bean Java. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme -

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

Génération de rapports

Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est donné ci-dessous.

Le fichier d'importation - baseBuild.xml est choisi dans le chapitre Configuration de l' environnement et doit être placé dans le même répertoire 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>

Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class = com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme -

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>

À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -

Ici, nous pouvons voir que pour le dernier enregistrement, nous n'avions transmis aucune donnée pour le champ pays, "NO COUNTRY" est en cours d'impression.