Ausdruck melden

Berichtsausdrücke sind die leistungsstarken Funktionen von JasperReports, mit denen wir berechnete Daten in einem Bericht anzeigen können. Berechnete Daten sind Daten, die keine statischen Daten sind und nicht speziell als Berichtsparameter oder Datenquellenfeld übergeben werden. Berichtsausdrücke werden aus der Kombination von Berichtsparametern, Feldern und statischen Daten erstellt. Die Java-Sprache wird standardmäßig zum Schreiben von Berichtsausdrücken verwendet. Andere Skriptsprachen für Berichtsausdrücke wie Groovy-Skriptsprache, JavaScript oder BeanShell-Skript werden von JasperReports-Compilern unterstützt.

In diesem Kapitel wird erläutert, wie Berichtsausdrücke funktionieren, sofern sie nur in der Java-Sprache geschrieben wurden. In einer JRXML-Berichtsvorlage gibt es mehrere Elemente, die Ausdrücke definieren als -

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

Ausdruckserklärung

Grundsätzlich sind alle Berichtsausdrücke Java-Ausdrücke, die auf die Berichtsfelder, Berichtsvariablen und Berichtsparameter verweisen können.

Feldreferenz im Ausdruck

Um eine Berichtsfeldreferenz in einem Ausdruck zu verwenden, muss der Name des Feldes dazwischen stehen $F{und} Zeichenfolgen, wie unten gezeigt -

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

Es folgt ein Stück Code aus unserer bestehenden JRXML - Datei (Kapitel Bericht Designs) -

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

Variablenreferenz im Ausdruck

Um auf eine Variable in einem Ausdruck zu verweisen, müssen wir den Namen der Variablen dazwischen setzen $V{und} wie im folgenden Beispiel gezeigt -

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

Parameterreferenz im Ausdruck

Um auf einen Parameter in einem Ausdruck zu verweisen, sollte der Name des Parameters dazwischen stehen $P{und} wie im folgenden Beispiel gezeigt -

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

Im Folgenden finden Sie einen Code aus unserer vorhandenen JRXML-Datei, der die Referenzierung von Parametern in einem Ausdruck demonstriert. (JRXML aus Kapitel Berichtsentwürfe ) -

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

Wie Sie oben gesehen haben, sind die Parameter-, Feld- und Variablenreferenzen tatsächlich echte Java-Objekte. Wenn wir ihre Klasse anhand der in der Berichtsvorlage angegebenen Parameter-, Feld- oder Variablendeklaration kennen, können wir sogar Methoden für diese Objektreferenzen in den Ausdrücken aufrufen.

Das folgende Beispiel zeigt, wie der erste Buchstabe aus dem java.lang.String-Berichtsfeld "Name" extrahiert und angezeigt wird.

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

Ressourcenpaketreferenz im Ausdruck

Um auf eine Ressource in einem Ausdruck zu verweisen, sollte der Schlüssel dazwischen stehen$R{und} wie im folgenden Beispiel gezeigt -

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

Basierend auf dem zur Laufzeit bereitgestellten Gebietsschema und dem Schlüssel report.title wird das der Berichtsvorlage zugeordnete Ressourcenpaket geladen. Daher wird der Titel des Berichts angezeigt, indem der String-Wert aus dem Ressourcenpaket extrahiert wird. Mehr zur Internationalisierung finden Sie im Kapitel Internationalisierung .

Taschenrechner

Calculator ist eine Entität in JasperReports, die Ausdrücke auswertet und Variablen oder Datensätze zum Zeitpunkt des Ausfüllens von Berichten inkrementiert. Während des Kompilierungsprozesses werden die Informationen vom Compiler erstellt und im Kompilierungsbericht gespeichert. Diese Informationen werden während der Berichtsfüllzeit verwendet, um eine Instanz der Klasse net.sf.jasperreports.engine.fill.JRCalculator zu erstellen.

Die Java-Quelldatei wird von Java-basierten Berichts-Compilern im laufenden Betrieb generiert und kompiliert. Diese generierte Klasse ist eine Unterklasse des JRCalculators, und der durch das Kompilieren erzeugte Bytecode wird im JasperReport-Objekt gespeichert. Dieser Bytcode wird zum Zeitpunkt des Ausfüllens des Berichts geladen und die resultierende Klasse wird instanziiert, um das für die Ausdrucksauswertung erforderliche Taschenrechnerobjekt zu erhalten.

Bedingte Ausdrücke

JasperReports unterstützt keine if-else-Anweisungen beim Definieren von Variablenausdrücken. Stattdessen können Sie die ternären Operatoren verwenden{cond} ? {statement 1} : {statement 2}. Dieser Operator kann in einem Java-Ausdruck verschachtelt werden, um die gewünschte Ausgabe basierend auf mehreren Bedingungen zu erhalten.

Beispiel für einen bedingten Ausdruck im Bericht

Ändern Sie die vorhandene Berichtsvorlage (Kapitel Berichtsentwürfe ) und fügen Sie einen bedingten Ausdruck für das Feldland hinzu. Die überarbeitete Berichtsvorlage (jasper_report_template.jrxml) lautet wie folgt. Speichern Sie es im Verzeichnis 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>

Die Java-Codes für das Ausfüllen von Berichten lauten wie folgt. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sind wie -

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

Der Inhalt der POJO-Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sind wie -

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

Wir werden einen neuen Datensatz mit einem leeren Länderfeld in unsere Java-Bean-Liste aufnehmen. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sind wie -

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

Berichterstellung

Wir werden die obige Datei mit unserem regulären ANT-Erstellungsprozess kompilieren und ausführen. Der Inhalt der Datei build.xml (gespeichert im Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test) ist unten angegeben.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup ausgewählt und sollte im selben Verzeichnis wie die build.xml abgelegt werden.

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

Öffnen Sie als Nächstes das Befehlszeilenfenster und wechseln Sie in das Verzeichnis, in dem build.xml abgelegt ist. Führen Sie abschließend den Befehl ausant -Dmain-class = com.tutorialspoint.JasperReportFill (viewFullReport ist das Standardziel) als -

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>

Als Ergebnis der obigen Kompilierung wird ein JasperViewer-Fenster geöffnet, wie im folgenden Bildschirm gezeigt -

Hier können wir sehen, dass wir für den letzten Datensatz keine Daten für das Feldland übergeben haben, "NO COUNTRY" wird gedruckt.