JasperReports - Kurzanleitung

Was ist ein Bericht?

Ein Bericht ist eine aussagekräftige, klar definierte und zusammengefasste Darstellung von Informationen. In der Regel werden die Routinetätigkeiten automatisiert und die Daten zu entscheidungsunterstützenden "Berichten" zusammengefasst. Berichte repräsentieren übliche unordentliche Daten in Diagrammen, Grafiken und anderen Formen grafischer Darstellungen.

Berichtsvorlage

Im Allgemeinen wird das folgende Layout verwendet, um Berichte von den meisten kommerziellen Tools zur Berichterstellung zu generieren.

TITEL
KOPFZEILE
SPALTENÜBERSCHRIFT
DETAIL
COLUMNFOOTER
FUSSZEILE
ZUSAMMENFASSUNG

Es folgen die Beschreibungen der einzelnen im Diagramm genannten Elemente -

S.NO. Element und Beschreibung
1

title

Titel enthält den 'Titel' des Berichts. Es wird nur einmal ganz am Anfang des Berichts angezeigt, z. B. "Tutorials Point Report".

2

pageHeader

PageHeader kann Datums- und Uhrzeitinformationen und / oder den Namen der Organisation enthalten. Dies wird oben auf jeder Seite angezeigt.

3

columnHeader

ColumnHeader listet die Namen der spezifischen Felder auf, die Sie im Bericht anzeigen möchten, z. B. "Autorenname", "Startstunde", "Endstunde", "Arbeitsstunden", "Datum" usw.

4

detail

Detail ist der Teil, in dem Einträge der spezifischen Felder (in columnHeader aufgeführt) angezeigt werden, z. B. "Manisha", "9:00", "18:00", "9", "10.02.2013".

5

columnFooter

ColumnFooter kann die Summe aller Felder anzeigen, z. B. "Gesamtarbeitszeit:" 180 ".

6

pageFooter

PageFooter kann Informationen zur Seitenzahl enthalten. Es wird am Ende jeder Seite angezeigt, z. B. "1/23".

7

summary

Die Zusammenfassung enthält Informationen, die aus dem Teil "Detail" abgeleitet wurden. Beispielsweise kann nach Auflistung der Anzahl der von jedem Autor geleisteten Arbeitsstunden die von jedem Autor geleistete Gesamtarbeitszeit zum besseren Vergleich in ein visuelles Diagramm wie Kreisdiagramm, Diagramm usw. eingefügt werden.

JasperReports

Im Folgenden sind die häufigsten Probleme aufgeführt, mit denen die Berichterstellung konfrontiert ist:

  • Core changes - Berücksichtigen Sie normalerweise die geschäftlichen Änderungen oder Verbesserungen, die erforderlich sind, um die Kernlogik des Berichts zu ändern.

  • Results exporting - Es gibt eine Vielzahl von Formaten, in die Ihr Bericht exportiert werden kann, z. B. HTML, Text, PDF, MS Excel, RTF, ODT, durch Kommas getrennte Werte, XML oder Bild.

  • Complicated reports - Unterberichte und Kreuztabellenberichte sind ein gutes Beispiel.

  • Charts reports - Visuelle Diagramme, z. B. Grafik, Kreis, XY-Linie, Balken, Meter und Zeitreihen.

Um den Overhead der oben genannten Punkte zu beseitigen und den Berichtsprozess zu vereinfachen, wurden viele Frameworks, Tools, Bibliotheken und Anwendungen von Drittanbietern eingeführt. JasperReports Ist einer von ihnen.

JasperReportsist eine Open Source Java Reporting Engine. Es basiert auf Java und hat keine eigene Ausdruckssyntax. JasperReports bietet die Möglichkeit, umfangreiche Inhalte auf dem Bildschirm, auf dem Drucker oder in PDF-, HTML-, XLS-, RTF-, ODT-, CSV-, TXT- und XML-Dateien bereitzustellen. Da es sich nicht um ein eigenständiges Tool handelt, kann es nicht einzeln installiert werden. Stattdessen wird es in Java-Anwendungen eingebettet, indem seine Bibliothek in CLASSPATH der Anwendung aufgenommen wird.

JasperReports ist eine Java-Klassenbibliothek und nicht für Endbenutzer gedacht, sondern richtet sich an Java-Entwickler, die ihren Anwendungen Berichtsfunktionen hinzufügen müssen.

Funktionen von JasperReports

Einige der wichtigsten Funktionen von JasperReports sind:

  • Es verfügt über ein flexibles Berichtslayout.

  • Es kann Daten entweder textuell oder grafisch darstellen.

  • Entwickler können Daten auf verschiedene Arten bereitstellen.

  • Es kann Daten aus mehreren Datenquellen akzeptieren.

  • Es kann Wasserzeichen erzeugen (Ein Wasserzeichen ist wie ein Sekundärbild, das über das Primärbild gelegt wird).

  • Es können Unterberichte generiert werden.

  • Es kann Berichte in verschiedenen Formaten exportieren.

JasperReports ist eine reine Java-Bibliothek und keine eigenständige Anwendung. Es kann nicht alleine ausgeführt werden und muss daher in eine andere clientseitige oder serverseitige Java-Anwendung eingebettet werden. Da es Java-basiert ist, kann es auf jeder Plattform ausgeführt werden, die Java unterstützt (JDK 1.3 und höher). Alle Funktionen von JasperReport sind in einer einzigen JAR-Datei, jasperreports-xxxjar, zusammengefasst. Diese JAR kann zusammen mit den erforderlichen und optionalen Bibliotheken (.ZIP-Datei) von der folgenden Website heruntergeladen werden: JasperReport Library Link . Laden Sie die neueste Version von diesem Link herunter.

Die ZIP-Datei enthält die JasperReports-JAR-Datei sowie den JasperReports-Quellcode, abhängige JARs und viele Beispiele, die die Funktionen von JasperReport demonstrieren.

JasperReport-Umgebung

Um mit der Erstellung der Berichte zu beginnen, müssen wir die Umgebung einrichten. Extrahieren Sie die heruntergeladene JasperReport.ZIP-Datei an einen beliebigen Speicherort (in unserem Fall haben wir sie nach C: \ tools \ jasperreports-5.0.1 extrahiert). Die Verzeichnisstruktur der extrahierten Datei ist dieselbe wie unten gezeigt -

Hier ist das Detail aller Verzeichnisse -

  • build - Enthält die kompilierten JasperReport-Klassendateien.

  • Demo - Enthält verschiedene Beispiele, die verschiedene Aspekte der JasperReports-Funktionalität demonstrieren.

  • dist - Enthält die Datei jasperreports-xxxjar. Wir werden diese JAR-Datei zu unserem CLASSPATH hinzufügen, um JasperReports zu nutzen.

  • docs - Enthält eine lokale Kopie der JasperReports-Dokumentation.

  • lib - Enthält alle JARs, die zum Erstellen von JasperReports und zur Verwendung in unseren Anwendungen benötigt werden.

  • src - Enthält den JasperReports-Quellcode.

  • build.xml - Eine ANT- Builddatei zum Erstellen des JasperReports-Quellcodes. Wenn wir JasperReports nicht ändern möchten, müssen wir diese Datei nicht verwenden, da JasperReports in der kompilierten Form verteilt wird.

  • change.txt - Ein Textdokument, in dem die Unterschiede zwischen der aktuellen und der vorherigen Version der JasperReports-Klassenbibliothek erläutert werden.

  • license.txt - Ein Textdokument, das den vollständigen Text der LGPL-Lizenz (Lesser General Public License) enthält.

  • readme.txt - Ein Textdokument mit Anweisungen zum Erstellen und Ausführen der bereitgestellten Beispiele.

Grundsätzlich verwenden wir nur jasperreports-xxxjar unter dist und JARs unter lib als Verzeichnis zum Generieren von Berichten. Da JasperReports ein Open-Source-Tool ist, können wir Fehler und Fehler bei der Ausführung in jasperreports-xxxjar beheben und die JAR mithilfe der Datei build.xml erneut erstellen.

Stellen Sie den KLASSENPFAD ein

Um JasperReport verwenden zu können, müssen wir die folgenden Dateien auf unseren CLASSPATH setzen -

  • jasperreports-xxxjar, wobei xxx die JasperReports-Version ist. Dies befindet sich im Verzeichnis C: \ tools \ jasperreports-xxx \ dist).

  • Alle JAR-Dateien im Unterverzeichnis lib (C: \ tools \ jasperreports-xxx \ lib).

Zum Zeitpunkt der Installation haben wir JasperReport Version 5.0.1 verwendet. Klicken Sie mit der rechten Maustaste auf "Arbeitsplatz" und wählen Sie "Eigenschaften". Klicken Sie auf der Registerkarte "Erweitert" auf die Schaltfläche "Umgebungsvariablen". Aktualisieren Sie nun die Variable 'Path' damitC:\tools\jasperreports-5.0.1\dist\jasperreports-5.0.1.jar:C:\tools\jasperreports-5.0.1\lib. Jetzt können Sie Ihre Berichte erstellen.

In allen Beispielen in diesem Lernprogramm haben wir ANT-Aufgaben zum Generieren von Berichten verwendet. Dasbuildfile kümmert sich um den Import aller erforderlichen JARs zum Generieren von Berichten. Daher hilft das Festlegen von CLASSPATH wie oben erwähnt nur denjenigen, die Berichte ohne Verwendung von ANT erstellen möchten.

Build Setup

Alle Beispiele in diesem Tutorial -

  • wurden mit einem einfachen Texteditor geschrieben.

  • wurden im Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint gespeichert.

  • wurden an der Eingabeaufforderung mit Apache ANT kompiliert und ausgeführt. Wir werden eine verwendenbaseBuild.xml Datei, die wir in ANT importieren werden build.xmlDatei in den folgenden Kapiteln. Speichern Sie diese Datei unter C: \ tools \ jasperreports-5.0.1 \ test. Es folgt der Inhalt der Datei 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>

Diese Datei enthält alle erforderlichen Ziele, z. B. das Bereinigen der Verzeichnisse, das Kompilieren der Java-Dateien und das Ausführen der Klassendateien.

Im Folgenden sind die Details aufgeführt, die von verschiedenen Verzeichnissen in baseBuild.xml erwähnt werden. Angenommen, das aktuelle Verzeichnis lautet C: \ tools \ jasperreports-5.0.1 \ test) -

  • jasper.dir - ist das Verzeichnis C: \ tools \ jasperreports-5.0.1

  • lib.dir - ist das Verzeichnis C: \ tools \ jasperreports-5.0.1 \ lib

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

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

  • Hauptklasse - com.tutorialspoint.HelpMe. Diese Klasse ist eine einfache Klasse, die ausgeführt wird, wenn kein Klassendateiname über die Befehlszeile übergeben wird. Speichern Sie diese Datei unter 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 ");
   }
}

Jasper Manager Klassen

Es gibt eine Reihe von Klassen, die zum Kompilieren eines JRXML-Berichtsdesigns, zum Füllen eines Berichts, zum Drucken eines Berichts, zum Exportieren in PDF-, HTML- und XML-Dateien, zum Anzeigen der generierten Berichte und zum Berichtsdesign verwendet werden.

Die Liste dieser Klassen ist -

  • net.sf.jasperreports.engine.JasperCompileManager - Wird zum Kompilieren einer JRXML-Berichtsvorlage verwendet.

  • net.sf.jasperreports.engine.JasperFillManager - Wird verwendet, um einen Bericht mit Daten aus der Datenquelle zu füllen.

  • net.sf.jasperreports.engine.JasperPrintManager - Wird zum Drucken der von der JasperReports-Bibliothek generierten Dokumente verwendet.

  • net.sf.jasperreports.engine.JasperExportManager - Wird verwendet, um PDF-, HTML- oder XML-Inhalte für die Dokumente abzurufen, die beim Ausfüllen von Berichten erstellt wurden.

  • net.sf.jasperreports.view.JasperViewer - Es handelt sich um eine einfache Java Swing-Anwendung, mit der Berichte geladen und angezeigt werden können.

  • net.sf.jasperreports.view.JasperDesignViewer - Wird zur Entwurfszeit verwendet, um eine Vorschau der Berichtsvorlagen anzuzeigen.

Apache ANT einrichten

Wir werden alle Beispiele mit Apache ANT erstellen. Lesen Sie daher bitte das Kapitel ANT - Environment Setup, um Apache ANT auf Ihrem System einzurichten.

Der Hauptzweck von JasperReports besteht darin, seitenorientierte, druckfertige Dokumente auf einfache und flexible Weise zu erstellen. Das folgende Flussdiagramm zeigt einen typischen Arbeitsablauf beim Erstellen von Berichten.

Wie im Bild gezeigt, hat der Lebenszyklus folgende unterschiedliche Phasen:

  • Entwerfen des Berichts - In diesem Schritt erstellen wir die JRXML-Datei, ein XML-Dokument, das die Definition des Berichtslayouts enthält. Wir können jeden Texteditor oder iReportDesigner verwenden , um ihn manuell zu erstellen. Wenn iReportDesigner verwendet wird, wird das Layout visuell gestaltet, sodass die reale Struktur der JRXML ignoriert werden kann.

  • Bericht kompilieren - In diesem Schritt wird JRXML in einem Binärobjekt kompiliert, das als Jasper-Datei (* .jasper) bezeichnet wird. Diese Kompilierung erfolgt aus Leistungsgründen. Jasper-Dateien sind das, was Sie mit Ihrer Anwendung versenden müssen, um die Berichte auszuführen.

  • Ausführen des Berichts (Daten in den Bericht einfügen) - In diesem Schritt werden Daten aus der Anwendung in den kompilierten Bericht eingefügt. Die Klasse net.sf.jasperreports.engine.JasperFillManager bietet die erforderlichen Funktionen, um die Daten in den Berichten zu füllen. Es wird eine Jasper-Druckdatei (* .jrprint) erstellt, mit der der Bericht entweder gedruckt oder exportiert werden kann.

  • Exportieren des Berichts in das gewünschte Format - In diesem Schritt können wir die im vorherigen Schritt erstellte Jasper-Druckdatei mit JasperExportManager in ein beliebiges Format exportieren. Da Jasper verschiedene Formen des Exports bereitstellt, können wir mit derselben Eingabe mehrere Darstellungen der Daten erstellen.

Eine detaillierte Übersicht über jeden der oben genannten Schritte wird in den folgenden Kapiteln gegeben.

Die JRXML-Vorlagen (oder JRXML-Dateien) in JasperReport sind Standard-XML-Dateien mit der Erweiterung .jrxml. Alle JRXML-Dateien enthalten das Tag <jasperReport> als Stammelement. Dies wiederum enthält viele Unterelemente (alle sind optional). Das JasperReport-Framework kann verschiedene Arten von Datenquellen verarbeiten. In diesem Tutorial zeigen wir, wie Sie einen Basisbericht erstellen, indem Sie einfach eine Sammlung von Java-Datenobjekten (mithilfe von Java-Beans) an die JasperReport Engine übergeben. Der Abschlussbericht enthält eine Liste der Personen mit den Kategorien einschließlich ihrer Namen und Länder.

In den folgenden Schritten wird beschrieben, wie Sie einen JasperReport entwerfen.

  • Erstellen einer JRXML-Berichtsvorlage und.
  • Vorschau der XML-Berichtsvorlage.

Erstellen einer JRXML-Berichtsvorlage

Erstellen Sie die JRXML-Datei jasper_report_template.jrxmlVerwenden Sie einen Texteditor und speichern Sie diese Datei in C: \ tools \ jasperreports-5.0.1 \ test gemäß unserer Umgebungskonfiguration.

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

Hier sind die Details der Hauptfelder in der obigen Berichtsvorlage -

  • <queryString> - Dies ist leer (da wir Daten über Java Beans übergeben). Enthält normalerweise die SQL-Anweisung, die das Berichtsergebnis abruft.

  • <Feldname> - Mit diesem Element werden Daten aus Datenquellen oder Abfragen in Berichtsvorlagen abgebildet. name wird im Berichtskörper wiederverwendet und unterscheidet zwischen Groß- und Kleinschreibung.

  • <fieldDescription> - Dieses Element ordnet den Feldnamen dem entsprechenden Element in der XML-Datei zu.

  • <staticText> - Definiert den statischen Text, der nicht von Datenquellen, Variablen, Parametern oder Berichtsausdrücken abhängt.

  • <textFieldExpression> - Definiert das Erscheinungsbild des Ergebnisfelds.

  • $ F {country} - Dies ist eine Variable, die den Wert des vordefinierten Ergebnisfelds im Tag <Feldname> enthält.

  • <Band> - Bänder enthalten die Daten, die im Bericht angezeigt werden.

Sobald das Berichtsdesign fertig ist, speichern Sie es im Verzeichnis C: \.

Vorschau der XML-Berichtsvorlage

In der JasperReports-JAR-Datei ist ein Dienstprogramm net.sf.jasperreports.view.JasperDesignViewer verfügbar, mit dem Sie eine Vorschau des Berichtsdesigns anzeigen können , ohne es kompilieren oder füllen zu müssen. Dieses Dienstprogramm ist eine eigenständige Java-Anwendung und kann daher mit ANT ausgeführt werden.

Schreiben wir ein ANT-Ziel viewDesignXMLum die JRXML anzuzeigen. Lassen Sie uns also erstellen und speichernbuild.xmlunter dem Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test (sollte sich in demselben Verzeichnis befinden, in dem sich JRXML befindet). Hier ist die Datei 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>

Öffnen Sie als Nächstes eine Eingabeaufforderung und wechseln Sie in das Verzeichnis, in dem build.xml abgelegt ist. Führen Sie den Befehl ausant(Da viewDesignXML das Standardziel ist). Ausgabe ist wie folgt -

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.

Die Log4j-Warnung kann ignoriert werden. Als Ergebnis der obigen Ausführung wird ein Fenster mit der Bezeichnung "JasperDesignViewer" geöffnet, in dem unsere Vorschau der Berichtsvorlage angezeigt wird.

Wie wir sehen, werden nur Berichtsausdrücke zum Abrufen der Daten angezeigt, da JasperDesignViewer keinen Zugriff auf die tatsächlichen Datenquellen- oder Berichtsparameter hat. Beenden Sie den JasperDesignViewer, indem Sie das Fenster schließen oder Strg-C im Befehlszeilenfenster drücken.

Wir haben die JasperReport-Vorlage (JRXML-Datei) im vorherigen Kapitel generiert. Diese Datei kann nicht direkt zum Generieren von Berichten verwendet werden. Es muss in das native Binärformat von JasperReport kompiliert werdenJasperDatei. Beim Kompilieren transformieren wir das JasperDesign-Objekt in das JasperReport-Objekt -

Die Schnittstelle net.sf.jasperreports.engine.design.JRCompiler spielt beim Kompilieren eine zentrale Rolle. Diese Schnittstelle verfügt über mehrere Implementierungen, abhängig von der Sprache, die für Berichtsausdrücke verwendet wird. Diese können in Java, Groovy, JavaScript oder einer anderen Skriptsprache geschrieben werden, sofern die Compiler-Implementierung sie zur Laufzeit auswerten kann.

Wir können die JRXML-Datei auf zwei Arten kompilieren:

  • Programmatische Zusammenstellung.
  • Kompilierung durch ANT-Aufgabe.

Programmatische Zusammenstellung von JRXML

Die JasperReports-API bietet eine Fassadenklasse net.sf.jasperreports.engine.JasperCompileManager zum Kompilieren eines JasperReport. Diese Klasse besteht aus mehreren öffentlichen statischen Methoden zum Kompilieren von Berichtsvorlagen. Die Quelle für Vorlagen können Dateien, Eingabestreams und / oder Speicherobjekte sein.

Der Inhalt der JRXML-Datei (jasper_report_template.jrxml) lautet wie folgt. Es wird im Verzeichnis gespeichertC:\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>

Der folgende Code demonstriert die Kompilierung der obigen Datei jasper_report_template.jrxml .

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!!! ...");
   }
}

Vorlagenzusammenstellung

Als nächsten Schritt speichern wir den obigen Inhalt in der Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.javaund importieren Sie die Datei baseBuild.xml in die Datei build.xml wie folgt. Die baseBuild.xml hat bereits diecompile und run Ziele -

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

   <import file = "baseBuild.xml"/>

</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.JasperReportCompile als -

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

Als Ergebnis der obigen Kompilierung sehen Sie, dass die Vorlagendatei jasper_report_template.jasper im Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test generiert wurde.

Vorschau der kompilierten Berichtsvorlage

Mit net.sf.jasperreports.view.JasperDesignViewer können Sie eine Vorschau kompilierter Berichtsvorlagen und JRXML-Vorlagen anzeigen .

Um weiter zu gehen, fügen wir ein neues Ziel hinzu viewDesignin die obige Datei build.xml, mit der wir eine Vorschau des kompilierten Berichts anzeigen können. Unten ist die überarbeitete build.xml -

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

Lassen Sie uns den Befehl ausführen - ant(viewDesign ist das Standardziel) an der Eingabeaufforderung. Das JasperDesignViewer-Fenster wird geöffnet und zeigt die Jasper-Datei wie folgt an:

Kompilierung durch ANT Task

Da die Kompilierung von Berichtsvorlagen eher einem Entwurfszeitjob als einem Laufzeitjob ähnelt, verfügt die JasperReport-Bibliothek über eine benutzerdefinierte ANT-Aufgabe. In bestimmten Situationen können wir diese ANT-Task nicht verwenden, wenn zur Laufzeit eine JRXML-Datei erstellt wird. Die benutzerdefinierte ANT-Task heißt JRC und wird von der Klasse net.sf.jasperreports.ant.JRAntCompileTask implementiert . Seine Syntax und sein Verhalten sind dem eingebauten sehr ähnlich<javac> ANT Aufgabe.

Vorlagenzusammenstellung

Fügen wir ein neues Ziel hinzu compilereportdesingzu unserer bestehenden build.xml. Hier wird der Quellordner mithilfe eines verschachtelten <src> -Tags mit den Dateigruppen angegeben. Das verschachtelte Quell-Tag ermöglicht das Kompilieren von Berichtsvorlagen, die über viele verschiedene Speicherorte verteilt sind und nicht in einem einzigen Stammordner-Quellordner zusammengefasst sind. Unten ist die überarbeitete build.xml -

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

Öffnen Sie als Nächstes die Eingabeaufforderung und wechseln Sie in das Verzeichnis, in dem build.xml abgelegt ist. Führen Sie den Befehl ausant(Compilereportdesing ist das Standardziel); Die Ausgabe ist wie folgt -

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

Die Datei jasper_report_template.jasper wird im Dateisystem generiert (in unserem Fall C: \ tools \ jasperreports-5.0.1 \ test directory). Diese Datei ist identisch mit der Datei, die programmgesteuert durch Aufrufen von net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile () generiert wird. Wir können eine Vorschau dieser Jasper-Datei anzeigen und ausführenant viewDesign.

Der Hauptzweck eines Berichtstools besteht darin, qualitativ hochwertige Dokumente zu erstellen. Der Berichterfüllungsprozess hilft dem Berichterstellungstool, dies zu erreichen, indem Datensätze bearbeitet werden.

Die wichtigsten Eingaben, die für das Ausfüllen von Berichten erforderlich sind, sind:

  • Report Template - Dies ist die aktuelle JasperReport-Datei.

  • Report Parameters- Dies sind im Grunde benannte Werte, die zum Zeitpunkt des Berichtsfüllens an die Engine übergeben werden. Wir werden sie im Kapitel Berichtsparameter diskutieren .

  • Data Source- Wir können eine Jasper-Datei aus einer Reihe von Datenquellen wie einer SQL-Abfrage, einer XML-Datei, einer CSV-Datei, einer HQL-Abfrage (Hibernate Query Language), einer Sammlung von Java Beans usw. füllen. Dies wird im Bericht ausführlich erläutert Kapitel Datenquellen .

Die durch diesen Prozess erzeugte Ausgabe ist a .jrprint Dokument, das zum Anzeigen, Drucken oder Exportieren in andere Formate bereit ist. Die Fassadenklasse net.sf.jasperreports.engine.JasperFillManager wird normalerweise zum Füllen einer Berichtsvorlage mit Daten verwendet. Diese Klasse verfügt über verschiedene fillReportXXX () -Methoden, mit denen Berichtsvorlagen gefüllt werden (Vorlagen können sich auf der Festplatte befinden, aus Eingabestreams ausgewählt werden oder direkt als In-Memory-Vorlagen bereitgestellt werden).

In dieser Fassadenklasse gibt es zwei Kategorien von fillReportXXX () -Methoden:

  • Der erste Typ empfängt ein java.sql.Connection-Objekt als dritten Parameter. In den meisten Fällen werden Berichte mit Daten aus einer relationalen Datenbank gefüllt. Dies wird erreicht durch -

    • Stellen Sie über JDBC eine Verbindung zur Datenbank her.

    • Fügen Sie eine SQL-Abfrage in die Berichtsvorlage ein.

    • Die JasperReports-Engine verwendet die übergebene Verbindung und führt die SQL-Abfrage aus.

    • Auf diese Weise wird eine Berichtsdatenquelle zum Ausfüllen des Berichts erstellt.

  • Der zweite Typ empfängt ein net.sf.jasperreports.engine.JRDataSource-Objekt, wenn die zu füllenden Daten in anderen Formularen verfügbar sind.

Berichtsvorlagen füllen

Lassen Sie uns eine Berichtsvorlage schreiben. Der Inhalt der JRXML-Datei (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) lautet wie folgt:

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

Als Nächstes übergeben wir eine Sammlung von Java-Datenobjekten (Java-Beans) an die JasperReport Engine, um diesen kompilierten Bericht zu füllen.

Schreiben Sie eine POJO DataBean.java, die das Datenobjekt (Java Bean) darstellt. Diese Klasse definiert zwei String-Objekte, nämlich 'Name' und 'Land'. Speichern Sie es im VerzeichnisC:\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;
   }
}

Schreiben Sie eine Klasse DataBeanList.java, die über eine Geschäftslogik verfügt, um eine Sammlung von Java-Bean-Objekten zu generieren. Dies wird weiter an die JasperReports-Engine übergeben, um den Bericht zu generieren. Hier fügen wir der Liste 4 DataBean-Objekte hinzu. Speichern Sie es im VerzeichnisC:\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;
   }
}

Schreiben Sie eine Hauptklassendatei JasperReportFill.java, die die Java-Bean-Sammlung aus der Klasse (DataBeanList) abruft und an die JasperReports-Engine übergibt, um die Berichtsvorlage zu füllen. Speichern Sie es im VerzeichnisC:\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();
      }
   }
}

Berichte erstellen

Wir werden diese Dateien nun mit unserem regulären ANT-Erstellungsprozess kompilieren und ausführen. Die Datei build.xml lautet wie folgt:

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

Ö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 aus ant -Dmain-class = com.tutorialspoint.JasperReportFill (executereport ist das Standardziel) wie folgt -

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

Als Ergebnis der obigen Ausführung wird eine Datei jasper_report_template.jrprint im selben Verzeichnis wie die .jasper- Datei generiert (in diesem Fall wird sie unter C: \ tools \ jasperreports-5.0.1 \ test generiert).

Die Ausgabe des Berichtsfüllprozesses JasperPrint-Objekte können mithilfe einer integrierten Viewer-Komponente angezeigt oder gedruckt oder in gängigere Dokumentformate wie PDF, HTML, RTF, XLS, ODT, CSV oder XML exportiert werden. Das Anzeigen und Drucken der Jasper-Dokumente wird in diesem Kapitel erläutert, und das Exportieren wird im nächsten Kapitel, dh "Exportberichte" , erläutert .

Anzeigen von Berichten

JasperReport bietet einen integrierten Viewer zum Anzeigen der generierten Berichte im Originalformat. Es ist eine Swing-basierte Komponente, und andere Java-Anwendungen können diese Komponente integrieren, ohne die Dokumente in andere Formate exportieren zu müssen, um angezeigt oder gedruckt zu werden. Die Klasse net.sf.jasperreports.view.JRViewer repräsentiert diese visuelle Komponente. Diese Klasse kann auch durch Unterklassifizieren an die Anwendungsanforderungen angepasst werden.

JasperReports verfügt auch über eine Swing-Anwendung, die die visuelle Komponente zum Anzeigen der Berichte verwendet. Diese Anwendung hilft beim Anzeigen von Berichten im selben Format wie * .jrprint erstellt wird. Diese Swing-Anwendung ist in der Klasse net.sf.jasperreports.view.JasperViewer implementiert . Um Berichte mit dieser Klasse anzuzeigen, müssen wir sie in ein ANT-Ziel einschließen.

Anzeigen des generierten Berichts

Das folgende Beispiel zeigt, wie ein Bericht mit der JasperViewer-Klasse angezeigt wird.

Lassen Sie uns eine Berichtsvorlage schreiben. Der Inhalt der JRXML-Datei (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) ist wie folgt:

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

Als Nächstes übergeben wir eine Sammlung von Java-Datenobjekten (Java-Beans) an die JasperReports Engine, um diesen kompilierten Bericht zu füllen.

Schreiben Sie eine POJO DataBean.java, die das Datenobjekt (Java Bean) darstellt. Diese Klasse definiert zwei String-Objekte, nämlich 'Name' und 'Land'. Speichern Sie es im VerzeichnisC:\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;
   }
}

Schreiben Sie eine Klasse DataBeanList.java, die über eine Geschäftslogik verfügt, um eine Sammlung von Java-Bean-Objekten zu generieren. Dies wird weiter an die JasperReports-Engine übergeben, um den Bericht zu generieren. Hier fügen wir der Liste 4 DataBean-Objekte hinzu. Speichern Sie es im VerzeichnisC:\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;
   }
}

Schreiben Sie eine Hauptklassendatei JasperReportFill.java, die die Java-Bean-Sammlung aus der Klasse (DataBeanList) abruft und an die JasperReports-Engine übergibt, um die Berichtsvorlage zu füllen. Speichern Sie es im VerzeichnisC:\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();
      }
   }
}

Schreiben wir ein Ziel viewFillReportin die Datei build.xml. Die Datei build.xml lautet wie folgt:

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 aus ant -Dmain-class=com.tutorialspoint.JasperReportFill(viewFillReport ist das Standardziel). Als Ergebnis sehen wir ein JasperViewer-Fenster, wie im folgenden Bildschirm gezeigt -

Berichte drucken

Wir können die von der JasperReports-Bibliothek generierten Dokumente (in ihrem proprietären Format, dh JasperPrint- Objekten) mit der Klasse net.sf.jasperreports.engine.JasperPrintManager drucken . Dies ist eine Fassadenklasse, die auf der Java 2 Printing API basiert. Wir können die Dokumente auch drucken, sobald die JasperReport-Dokumente in andere Formate wie HTML oder PDF exportiert wurden.

Drucken des generierten Berichts

Der folgende Code veranschaulicht das Drucken eines Berichts. Lassen Sie uns unsere vorhandene Klasse JasperReportFill aktualisieren. Wir werden die JasperPrintManager.printReport () -Methode verwenden. Diese Methode verwendet den Namen der Quelldatei (hier übergeben wir die .jrprint- Datei, die wir im vorherigen Schritt mit der Methode JasperFillManager.fillReportToFile () generiert haben) als ersten Parameter. Der zweite Parameter ist der Boolesche Wert für die Anzeige des Standarddruckdialogs (wir haben ihn festgelegt)true Hier).

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

Speichern wir diese Datei nun im Verzeichnis C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint. Wir werden diese Datei mit ANT kompilieren und ausführen. Der Inhalt von build.xml ist wie folgt:

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

Öffnen Sie als Nächstes die Eingabeaufforderung und wechseln Sie in das Verzeichnis, in dem build.xml abgelegt ist. Führen Sie abschließend den Befehl ausant -Dmain-class=com.tutorialspoint.JasperReportPrint. Als Ergebnis wird ein Druckdialogfeld angezeigt. Klicken Sie auf OK, um das Dokument zu drucken.

Wir haben im vorherigen Kapitel gesehen, wie ein von JasperReport generiertes Dokument gedruckt und angezeigt wird. Hier erfahren Sie, wie Sie diese Berichte in andere Formate wie PDF, HTML und XLS umwandeln oder exportieren. Um diese Funktionalität zu erreichen, wird die Fassadenklasse net.sf.jasperreports.engine.JasperExportManager bereitgestellt. Exportieren bedeutet, das JasperPrint- Objekt (.jrprint-Datei) in ein anderes Format umzuwandeln.

Der folgende Code (JasperReportExport.java) veranschaulicht den Exportvorgang des JasperReport-Dokuments. Der JasperExportManager bietet Methoden zum Exportieren eines Berichts nur in PDF, HTML und XML. Für den Export in das XLS-Format haben wir die Klasse net.sf.jasperreports.engine.export.JRXlsExporter verwendet . Dieser Code generiert die folgenden drei Dateien:

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

Export in andere Formate

Lassen Sie uns eine Berichtsvorlage schreiben. Der Inhalt der JRXML-Datei (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) lautet wie folgt:

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

Als nächstes Inhalt der POJO-Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sind wie unten angegeben -

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

Der Inhalt der Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sind wie unten angegeben -

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

Schreiben Sie eine Hauptklassendatei JasperReportFill.java, die die Java-Bean-Sammlung aus der Klasse (DataBeanList) abruft und an die JasperReports-Engine übergibt, um die Berichtsvorlage zu füllen. Speichern Sie es im VerzeichnisC:\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();
      }
   }
}

Hier haben wir die Logik zum Exportieren der Jaspis-Druckdatei in das PDF-, HTML- und XLS-Format aufgenommen.

Berichte erstellen

Lassen Sie uns die obigen Dateien mit unserem regulären ANT-Erstellungsprozess kompilieren und ausführen. Die Datei build.xml lautet wie folgt:

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

Wechseln Sie zur Eingabeaufforderung und dann zum Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test, in dem build.xml abgelegt ist. Führen Sie abschließend den Befehl ausant -Dmain-class=com.tutorialspoint.JasperReportFill. Die Ausgabe ist wie folgt -

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

Als Ergebnis der obigen Ausführung finden Sie drei Dateien sample_report.pdf, sample_report.html, sample_report.xls, die im Verzeichnis C: \ generiert wurden.

Die wichtigsten Eingaben zum Ausfüllen eines Berichts sind: Berichtsvorlage, Parameter und Datenquellen. In diesem Kapitel werden die Parameter beschrieben und im nächsten Kapitel werden die Datenquellen erläutert.

Parameter sind die Objektreferenzen, die während der Berichtsfüllvorgänge an die Berichtsengine übergeben werden. Die Daten, die nicht durch die Datenquelle übertragen werden können, können mithilfe von Parametern übergeben werden. Daten wie Autorenname, Titel des Berichts usw. können über Parameter übergeben werden. Eine JasperReports-Vorlage oder eine JRXML-Vorlage kann null oder mehr Parameterelemente enthalten.

Parameterdeklaration

Parameterdeklaration wie folgt -

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

Das Namensattribut

Das name- Attribut des <parameter> -Elements ist obligatorisch. Es verweist auf den Parameter in Berichtsausdrücken nach Namen. Der Parametername sollte ein einzelnes Wort sein. Es sollte keine Sonderzeichen wie Punkt oder Komma enthalten.

Das Klassenattribut

Das Klassenattribut ist ebenfalls obligatorisch und gibt den Klassennamen für die Parameterwerte an. Der Standardwert ist java.lang.String . Dies kann in jede zur Laufzeit verfügbare Klasse geändert werden. Unabhängig vom Typ eines Berichtsparameters sorgt die Engine dafür, dass die Berichtsausdrücke, in denen das Token $ P {} verwendet wird, umgewandelt werden. Daher ist das manuelle Umsetzen nicht erforderlich.

Die Berichtsparameterwerte werden immer in ein java.util.Map-Objekt gepackt, dessen Schlüssel der Parametername ist. Berichtsparameter können in der Abfragezeichenfolge des Berichts verwendet werden, um den aus der Datenbank abgerufenen Datensatz weiter anzupassen. Diese wirken wie dynamische Filter in der Abfrage, die Daten für den Bericht liefert.

Eingebaute Parameter

Im Folgenden sind die vordefinierten Berichtsparameter aufgeführt, die in den Ausdrücken verwendet werden können.

S.NO. Parametername und Beschreibung
1

REPORT_PARAMETERS_MAP

Enthält eine Karte mit allen benutzerdefinierten und integrierten Parametern.

2

REPORT_CONNECTION

Dies verweist auf die vom Benutzer angegebene Klasse java.sql.Connection, die für JDBC-Datenquellen verwendet wird.

3

REPORT_DATA_SOURCE

Dies ist eine vom Benutzer bereitgestellte Instanz von JRDataSource, die entweder einen der integrierten oder einen benutzerdefinierten Datenquellentyp darstellt.

4

REPORT_MAX_COUNT

Dies ist ein java.lang.Integer- Wert, mit dem die Benutzer die Datensätze aus der Datenquelle einschränken können.

5

REPORT_SCRIPTLET

Dies zeigt auf net.sf.jasperreports.engine.JRAbstractScriptlet und enthält eine Instanz des vom Benutzer bereitgestellten Berichtsskriptlets.

6

REPORT_LOCALE

Dies ist eine java.util.Locale- Instanz, die das gewünschte Gebietsschema des Ressourcenpakets enthält.

7

REPORT_RESOURCE_BUNDLE

Dies zeigt auf das Objekt java.util.ResourceBundle und enthält lokalisierte Nachrichten.

8

REPORT_TIME_ZONE

Dies ist eine java.util.TimeZone- Instanz, die für die Datumsformatierung verwendet wird.

9

REPORT_VIRTUALIZER

Dies ist eine Instanz des Objekts net.sf.jasperreports.engine.JRVirtualizer , die für die Seitenvirtualisierung verwendet wird (Speicherverbrauch optimieren).

10

REPORT_CLASS_LOADER

Dies ist eine java.lang.ClassLoader- Instanz, die während des Berichtsfüllprozesses zum Laden von Ressourcen wie Bildern, Schriftarten und Unterberichtsvorlagen verwendet wird

11

IS_IGNORE_PAGINATION

Bei der Einstellung java.lang.Boolean.TRUE wird der Bericht auf einer langen Seite generiert und es kommt nicht zu einem Seitenumbruch.

Beispiel

Übergeben wir ReportTitle und Author an den Bericht (generiert von JasperReportFill.java). Überarbeitete DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java ist wie folgt -

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

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

Der Inhalt der Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sind wie unten angegeben -

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

Fügen wir die Parameter <hinzuReportTitle> und <Author> zu unserer vorhandenen Berichtsvorlage (Kapitel Berichtsentwürfe ). Der Berichtstitel und der Autor werden am Anfang des Berichts angezeigt. 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>

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

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 wie folgt.

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) wie folgt:

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

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

Hier sehen wir, dass der ReportTitle "Liste der Kontakte" und der Autor "Prepared By Manisha" am Anfang des Berichts angezeigt werden.

Datenquellen sind strukturierte Datencontainer. Während der Erstellung des Berichts erhält die JasperReports-Engine Daten aus den Datenquellen. Daten können aus den Datenbanken, XML-Dateien, Arrays von Objekten und der Sammlung von Objekten abgerufen werden. Wir haben im Kapitel Füllen von Berichten gesehen , dass die Methode fillReportXXX () erwartet, eine Datenquelle des Berichts zu erhalten, die in Form von ausgefüllt werden mussnet.sf.jasperreports.engine.JRDataSource Objekt oder a java.sql.Connection (wenn die Berichtsdaten in einer relationalen Datenbank gefunden werden).

Die JRDataSource-Schnittstelle verfügt nur über zwei Methoden, die implementiert werden sollten:

  • public boolean next () löst JRException aus;

    • Zum Zeitpunkt des Berichtsfüllens wird diese Methode vom Berichtsmodul beim Durchlaufen der Daten für das Datenquellenobjekt aufgerufen.

  • öffentliches Objekt getFieldValue (JRField jrField) löst JRException aus;

    • Diese Methode liefert den Wert für jedes Berichtsfeld im aktuellen Datenquellendatensatz.

Die einzige Möglichkeit, Daten aus der Datenquelle abzurufen, besteht in der Verwendung der Berichtsfelder. Abhängig von der Art und Weise, wie die Datensätze in der Datenquelle erfasst werden, gibt es mehrere Standardimplementierungen der JRDataSource-Schnittstelle.

Datenquellenimplementierungen

In der folgenden Tabelle sind die Datenquellen und ihre Implementierungsklassen zusammengefasst.

Datenquelle Implementierungsklasse
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Kartenbasiert 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
Leer net.sf.jasperreports.engine.JREmptyDataSource

JDBC-Datenquellen

Klasse JRResultSetDataSourceCraps ein java.sql.ResultSet- Objekt. Dies ist die am häufigsten verwendete Datenquellenimplementierung, wenn Berichtsdaten aus einer relationalen Datenbank extrahiert werden. Wenn stattdessen eine java.sql.Connection an die Engine übergeben wird, führt sie zuerst die zugehörige Abfrage aus und speichert das zurückgegebene java.sql.ResultSet- Objekt in einer JRResultSetDataSource-Instanz.

JavaBean-Datenquellen

Klassen JRBeanArrayDataSource und JRBeanCollectionDataSourcestellen Implementierungen dar, die Arrays und Sammlungen von JavaBean-Objekten umschließen können. Jedes Objekt innerhalb des Arrays oder der Sammlung wird als ein Datensatz in dieser Art von Datenquelle angesehen. Die Zuordnung zwischen einer bestimmten JavaBean-Eigenschaft und dem entsprechenden Berichtsfeld erfolgt durch Namenskonventionen. Der Name des Berichtsfelds muss mit dem Namen der JavaBean-Eigenschaft übereinstimmen, der in den JavaBeans-Spezifikationen angegeben ist.

In allen Beispielen dieses Tutorials haben wir JRBeanCollectionDataSource verwendet.

Kartenbasierte Datenquellen

Die Implementierungsklassen JRMapArrayDataSource und JRMapCollectionDataSourcesind nützlich, wenn die übergeordnete Anwendung die im Speicher verfügbaren Berichtsdaten bereits als java.util.Map-Objekte speichert . Jedes Map-Objekt im umschlossenen Array oder in der umschlossenen Sammlung wird als virtueller Datensatz in der Datenquelle betrachtet, und der Wert jedes Berichtsfelds wird mithilfe des als Schlüssel angegebenen Berichtsfelds aus der Map extrahiert.

TableModel-Datenquellen

In vielen clientseitigen Anwendungen werden Daten in Tabellenform angezeigt. In vielen Anwendungen ist es häufig erforderlich, dass der Benutzer dieses Tabellenformat als Bericht drucken kann. ImplementierungsklasseJRTableModelDataSourcemacht das Generieren von Berichten aus dem Tabellenformat für Swing-Anwendungen trivial. Diese Klasse umschließt ein javax.swing.table.TableModel-Objekt. Auf Spalten im umschlossenen TableModel-Objekt kann entweder über ihre Namen oder über ihre 0-basierten Indizes zugegriffen werden.

XML-Datenquellen

Klasse JRXmlDataSourceist eine auf DOM basierende Datenquellenimplementierung, die XPath-Ausdrücke verwendet, um Daten aus dem XML-Dokument auszuwählen. Datensätze in der XML-Datenquelle werden durch Knotenelemente dargestellt, die über den XPath-Ausdruck ausgewählt wurden. Feldwerte werden aus jedem Datensatz mithilfe des XPath-Ausdrucks abgerufen, der in der Feldbeschreibung (<fieldDescription> -Element in JRXML) angegeben ist.

XPath ist eine Sprache, mit der Sie durch die Attribute und Elemente eines XML-Dokuments navigieren können. Weitere Informationen zu XPath finden Sie unterhttp://www.w3.org/TR/xpath.

CSV-Datenquellen

JRCsvDataSourcestellt eine Implementierung für Datenquellen dar, die ihre Daten aus strukturierten Textdateien abrufen; normalerweise CSVs. Feldwerte werden anhand ihres Spaltenindex abgerufen.

XLS-Datenquellen

JRXlsDataSourcestellt eine Implementierung für Datenquellen dar, die ihre Daten aus Excel-Dokumenten abrufen. Die Berichtsfeldzuordnung für diese Datenquellenimplementierung basiert ebenfalls auf dem Feldspaltenindex.

Leere Datenquellen

Die Klasse JREmptyDataSourcesimuliert eine Datenquelle mit einer bestimmten Anzahl von virtuellen leeren Datensätzen. Es wird von den UI-Tools verwendet, um grundlegende Funktionen für die Berichtsvorschau oder in speziellen Berichtsvorlagen oder zu Test- und Debugging-Zwecken anzubieten.

Rücklauffähige Datenquellen

Das net.sf.jasperreports.engine.JRRewindableDataSourceerweitert die grundlegende JRDataSource- Schnittstelle. Es wird nur eine Methode namens moveFirst () zur Schnittstelle hinzugefügt. Diese Methode soll den Cursor auf das erste Element in der Datenquelle bewegen.

Rückspulbare Datenquellen sind nützlich, wenn Sie mit Unterberichten arbeiten, die in einem Bereich platziert sind, der aufgrund der Einstellung isSplitAllowed = "false" nicht aufgeteilt werden darf, und auf der aktuellen Seite nicht genügend Platz für das Rendern des Unterberichts vorhanden ist.

Alle oben genannten Datenquellenimplementierungen können mit Ausnahme der zurückgespult werden JRResultSetDataSource, da das Zurückbewegen des Datensatzzeigers nicht unterstützt wird. Dies stellt nur dann ein Problem dar, wenn diese Datenquelle manuell zum Umschließen eines java.sql.ResultSet verwendet wird, bevor es an den Unterbericht übergeben wird. Es ist kein Problem, wenn sich die SQL-Abfrage in der Unterberichtsvorlage befindet, da die Engine sie beim Neustart des Unterberichts auf der nächsten Seite erneut ausführt.

Datenquellenanbieter

Die JasperReports-Bibliothek verfügt über eine Schnittstelle net.sf.jasperreports.engine.JRDataSourceProvider. Dies hilft beim Erstellen und Entsorgen von Datenquellenobjekten. Beim Erstellen einer Berichtsvorlage mit GUI-Tools wird ein spezielles Tool zum Anpassen der Datenquelle des Berichts benötigt. JRDataSourceProvider ist die Standardmethode zum Einfügen benutzerdefinierter Datenquellen in ein Designtool. Eine benutzerdefinierte Implementierung dieser Schnittstelle sollte die folgenden Methoden implementieren, mit denen Datenquellenobjekte erstellt und entsorgt werden können, sowie nach Möglichkeit Methoden zum Auflisten der verfügbaren Berichtsfelder in der Datenquelle:

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;

Berichtsfelder sind Elemente, die die Zuordnung von Daten zwischen Datenquelle und Berichtsvorlage darstellen. Felder können in den Berichtsausdrücken kombiniert werden, um die gewünschte Ausgabe zu erhalten. Eine Berichtsvorlage kann null oder mehr <Feld> -Elemente enthalten. Beim Deklarieren von Berichtsfeldern sollte die Datenquelle Daten liefern, die allen in der Berichtsvorlage definierten Feldern entsprechen.

Felddeklaration

Die Felddeklaration erfolgt wie unten gezeigt -

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

Das Namensattribut

Das name- Attribut des <field> -Elements ist obligatorisch. Es verweist auf das Feld in Berichtsausdrücken nach Namen.

Das Klassenattribut

Das Klassenattribut gibt den Klassennamen für die Feldwerte an. Der Standardwert ist java.lang.String . Dies kann in jede zur Laufzeit verfügbare Klasse geändert werden. Unabhängig vom Typ eines Berichtsfelds kümmert sich die Engine um das Umwandeln der Berichtsausdrücke, in denen das Token $ F {} verwendet wird, wodurch manuelle Umwandlungen unnötig werden.

Feld Beschreibung

Das <fieldDesciption> -Element ist ein optionales Element. Dies ist sehr nützlich, wenn Sie eine benutzerdefinierte Datenquelle implementieren. Beispielsweise können wir einen Schlüssel oder einige Informationen speichern, mit denen wir den Wert des Felds zur Laufzeit aus der benutzerdefinierten Datenquelle abrufen können. Durch die Verwendung des <fieldDesciption> -Elements anstelle des Feldnamens können Sie Einschränkungen von Feldnamenkonventionen beim Abrufen der Feldwerte aus der Datenquelle leicht überwinden.

Im Folgenden finden Sie einen Code aus unserer vorhandenen JRXML-Datei (Chapter Report Designs ). Hier können wir die Verwendung von sehenname, class, und fieldDescription Elemente.

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

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

Felder sortieren

In Zeiten, in denen eine Datensortierung erforderlich ist und von der Datenquellenimplementierung nicht unterstützt wird (z. B. CSV-Datenquelle), unterstützt JasperReports die feldinterne feldbasierte Datenquellensortierung. Die Sortierung kann mithilfe eines oder mehrerer <sortField> -Elemente in der Berichtsvorlage erfolgen.

Wenn mindestens ein Sortierfeld angegeben ist, wird die Datenquelle während des Berichtsfüllprozesses an eine JRSortableDataSource- Instanz übergeben. Dies ruft wiederum alle Datensätze aus der Datenquelle ab, führt eine Speichersortierung gemäß den angegebenen Feldern durch und ersetzt die ursprüngliche Datenquelle.

Der Name des Sortierfelds sollte mit dem Namen des Berichtsfelds identisch sein. Felder, die zum Sortieren verwendet werden, sollten Typen haben, die java.util.Comparable implementieren. Die Sortierung nach natürlicher Reihenfolge wird für alle Felder mit Ausnahme der Felder vom Typ java.lang.String durchgeführt (für den String-Typ wird der Collator verwendet, der dem Gebietsschema für die Berichtsfüllung entspricht). Wenn mehrere Sortierfelder angegeben sind, wird die Sortierung unter Verwendung der Felder als Sortierschlüssel in der Reihenfolge durchgeführt, in der sie in der Berichtsvorlage angezeigt werden. Das folgende Beispiel zeigt die Sortierfunktion.

Beispiel für sortierte Berichte

Fügen wir das <hinzusortField> Element zu unserer vorhandenen Berichtsvorlage (Kapitel Berichtsentwürfe ). Lassen Sie uns Sortierfeld Land in absteigender Reihenfolge. 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}]]>
            </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 bleiben unverändert. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sind wie unten angegeben -

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

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

Der Inhalt der Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sind wie unten angegeben -

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

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 wie folgt.

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) wie folgt:

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

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

Hier sehen wir, dass die Ländernamen in absteigender Reihenfolge alphabetisch angeordnet sind.

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 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 auf dem 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.

Berichtsvariablen sind spezielle Objekte, die auf dem Berichtsausdruck basieren.

Berichtsvariablen vereinfachen die folgenden Aufgaben:

  • Berichtsausdrücke, die in der gesamten Berichtsvorlage häufig verwendet werden. Diese Ausdrücke können mithilfe der Berichtsvariablen nur einmal deklariert werden.

  • Berichtsvariablen können verschiedene Berechnungen basierend auf den entsprechenden Ausdruckswerten wie Anzahl, Summe, Durchschnitt, niedrigster, höchster Wert, Varianz usw. durchführen.

Wenn Variablen in einem Berichtsentwurf definiert sind, können diese durch neue Variablen in den Ausdrücken referenziert werden. Daher ist die Reihenfolge wichtig, in der die Variablen in einem Berichtsentwurf deklariert werden.

Variable Aussage

Eine Variablendeklaration lautet wie folgt:

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

Wie oben gezeigt, enthält das <variable> -Element eine Anzahl von Attributen. Diese Attribute sind unten zusammengefasst -

Das Namensattribut

Ähnlich wie bei Parametern und Feldern ist das Attribut name des Elements </ variable> obligatorisch. Es ermöglicht die Referenzierung der Variablen anhand ihres deklarierten Namens in den Berichtsausdrücken.

Das Klassenattribut

Das Klassenattribut ist ebenfalls obligatorisch und gibt den Klassennamen für die Variablenwerte an. Der Standardwert ist java.lang.String . Dies kann in jede Klasse geändert werden, die im Klassenpfad verfügbar ist, sowohl zur Berichtserstellungszeit als auch zur Berichtsfüllzeit. Die Engine kümmert sich um das Typ-Casting in Berichtsausdrücken, für die das Token $ V {} verwendet wird. Daher ist kein manuelles Typ-Casting erforderlich.

Berechnung

Dieses Attribut bestimmt, welche Berechnung für die Variable beim Ausfüllen des Berichts durchgeführt werden soll. In den folgenden Unterabschnitten werden alle möglichen Werte für das Berechnungsattribut des Elements <variable> beschrieben.

  • Durchschnitt - Der Variablenwert ist der Durchschnitt jedes Nicht-Null-Werts des Variablenausdrucks. Gilt nur für numerische Variablen.

  • Count - Der Variablenwert ist die Anzahl der Nicht-Null - Instanzen des variablen Ausdrucks.

  • First - Der Variablenwert ist der Wert der ersten Instanz des Variablenausdrucks. Nachfolgende Werte werden ignoriert.

  • Höchster - Der Variablenwert ist der höchste Wert für den Variablenausdruck.

  • Niedrigster Wert - Der Variablenwert ist der niedrigste Wert für den Variablenausdruck im Bericht.

  • Nichts - Für die Variable werden keine Berechnungen durchgeführt.

  • StandardDeviation - Der Variablenwert ist die Standardabweichung aller Nicht-Null-Werte, die mit dem Berichtsausdruck übereinstimmen. Gilt nur für numerische Variablen.

  • Summe - Der Variablenwert ist die Summe aller vom Berichtsausdruck zurückgegebenen Nicht-Null-Werte.

  • System - Der Variablenwert ist eine benutzerdefinierte Berechnung (Berechnung des Werts für diese Variable selbst mithilfe der Scriptlet-Funktionalität von JasperReports).

  • Varianz - Der Variablenwert ist die Varianz aller Nicht-Null-Werte, die durch Auswertung des Ausdrucks der Berichtsvariablen zurückgegeben werden.

Inkrementierer FactoryClass

Dieses Attribut bestimmt die Klasse, die zum Berechnen des Werts der Variablen beim Füllen des aktuellen Datensatzes im Bericht verwendet wird. Der Standardwert wäre eine Klasse, die implementiert wirdnet.sf.jasperreports.engine.fill.JRIncrementerFactory. Die Factory-Klasse wird von der Engine verwendet, um Inkrementiererobjekte zur Laufzeit abhängig vom für die Variable festgelegten Berechnungsattribut zu instanziieren .

IncrementType

Dies bestimmt, wann der Wert der Variablen neu berechnet werden muss. Dieses Attribut verwendet Werte wie folgt:

  • Spalte - Der Variablenwert wird am Ende jeder Spalte neu berechnet.

  • Gruppe - Der Variablenwert wird neu berechnet, wenn sich die durch incrementGroup angegebene Gruppe ändert.

  • Keine - Der Variablenwert wird bei jedem Datensatz neu berechnet.

  • Seite - Der Variablenwert wird am Ende jeder Seite neu berechnet.

  • Bericht - Der Variablenwert wird am Ende des Berichts einmal neu berechnet.

IncrementGroup

Dies bestimmt den Namen der Gruppe , zu dem der Wert der Variablen neu berechnet wird, wenn incrementType ist Gruppe . Dies ist der Name einer Gruppe, die in der JRXML-Berichtsvorlage deklariert ist.

ResetType

Dies bestimmt, wann der Wert einer Variablen zurückgesetzt wird. Dieses Attribut verwendet Werte wie folgt:

  • Spalte - Der Variablenwert wird am Anfang jeder Spalte zurückgesetzt.

  • Gruppe - Der Variablenwert wird zurückgesetzt, wenn sich die durch incrementGroup angegebene Gruppe ändert.

  • Keine - Der Variablenwert wird niemals zurückgesetzt.

  • Seite - Der Variablenwert wird am Anfang jeder Seite zurückgesetzt.

  • Bericht - Der Variablenwert wird zu Beginn des Berichts nur einmal zurückgesetzt.

ResetGroup

Dies bestimmt den Namen der Gruppe , zu dem der Variablenwert zurückgesetzt wird , wenn resetType ist Gruppe . Die Werte für dieses Attribut sind der Name einer Gruppe, die in der JRXML-Berichtsvorlage deklariert ist.

Integrierte Berichtsvariablen

Es gibt einige integrierte Systemvariablen, die wie folgt in Ausdrücken verwendet werden können:

S.NO. Variablenname und Beschreibung
1

PAGE_NUMBER

Der Wert dieser Variablen ist die aktuelle Seitenzahl. Es kann verwendet werden, um sowohl die aktuelle Seitenzahl als auch die Gesamtzahl der Seiten anzuzeigen, indem eine spezielle Funktion der JasperReports-Textfeldelemente verwendet wird, das Evaluierungsattribut .

2

COLUMN_NUMBER

Diese Variable enthält die aktuelle Spaltennummer.

3

REPORT_COUNT

Diese Berichtsvariable enthält die Gesamtzahl der verarbeiteten Datensätze.

4

PAGE_COUNT

Diese Variable enthält die Anzahl der Datensätze, die beim Generieren der aktuellen Seite verarbeitet wurden.

5

COLUMN_COUNT

Diese Variable enthält die Anzahl der Datensätze, die beim Generieren der aktuellen Spalte verarbeitet wurden.

6

GroupName_COUNT

Der Name dieser Variablen leitet sich vom Namen der Gruppe ab, der sie entspricht, und wird mit der Sequenz _COUNT versehen. Diese Variable enthält die Anzahl der Datensätze in der aktuellen Gruppe.

Beispiel

Fügen wir eine Variable hinzu (countNumber) zu unserer vorhandenen Berichtsvorlage (Kapitel Berichtsentwürfe ). Wir werden die Zählung jedem Datensatz voranstellen. 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>
   
   <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>

Die Java-Codes für das Ausfüllen von Berichten bleiben unverändert. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sind wie unten angegeben -

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

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

Der Inhalt der Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sind wie unten angegeben -

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

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 wie folgt.

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

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

Hier sehen wir, dass der Zählung für jeden Datensatz ein Präfix vorangestellt ist.

Die Struktur einer einfachen Berichtsvorlage haben wir im Kapitel Erste Schritte erläutert . In ähnlicher Weise strukturiert JasperReports die Berichtsvorlage in mehrere Abschnitte. Abschnitte sind Teile des Berichts, die eine bestimmte Höhe haben und Berichtsobjekte wie Linien, Rechtecke, Bilder oder Textfelder enthalten können.

Die Berichts-Engine durchläuft zum Zeitpunkt des Berichtsfüllens die virtuellen Datensätze der bereitgestellten Berichtsdatenquelle. Abhängig vom definierten Verhalten jedes Abschnitts rendert die Engine dann gegebenenfalls jeden Berichtsabschnitt. Beispielsweise wird der Detailabschnitt für jeden Datensatz in der Datenquelle gerendert. Wenn Seitenumbrüche auftreten, werden die Seitenkopf- und Seitenfußabschnitte nach Bedarf gerendert.

In JasperReports werden Terminologie- und Berichtsabschnitte auch als bezeichnet report bands. Abschnitte bestehen aus einer oder mehreren Bands. Diese Abschnitte werden zur Zeit der Berichterstellung wiederholt ausgefüllt und bereiten das endgültige Dokument vor.

Hauptabschnitte

Eine Berichtsvorlage in JasperReports enthält die folgenden Hauptabschnitte:

<title></title>

<pageheader></pageheader>

<columnheader></columnheader>

<groupheader></groupheader>

<detail></detail>

<groupfooter></groupfooter>

<columnfooter></columnfooter>

<pagefooter></pagefooter>

<lastpagefooter></lastpagefooter>

<summary></summary>

<nodata></nodata>

<background></background>

Die folgende Tabelle fasst die einzelnen Abschnitte zusammen -

S.NO. Abschnitt und Beschreibung
1

Title

Dieser Abschnitt wird nur einmal am Anfang des Berichts angezeigt.

2

Page Header

Dieser Abschnitt wird am Anfang jeder Seite des generierten Dokuments angezeigt.

3

Column Header

Dieser Abschnitt wird am Anfang jeder Spalte im generierten Dokument angezeigt. Wenn für den Bericht nur eine Spalte definiert ist, werden die Spaltenüberschriften und Fußzeilen ignoriert.

4

Group Header

Dieser Abschnitt wird von einer Berichtsgruppe (Kapitel Gruppen ) eingeleitet . Jedes Mal, wenn der Gruppierungsausdruck seinen Wert ändert, wird der Gruppenkopfabschnitt über dem Detailabschnitt gedruckt. Wenn mehr als eine Gruppe definiert ist, wird der Gruppenkopf in der Reihenfolge der Gruppendefinition gedruckt.

5

Detail

Dieser Abschnitt wird für jede Datenzeile wiederholt, die von der Datenquelle des Berichts bereitgestellt wird. Der Detailabschnitt kann aus mehreren Bändern bestehen.

6

Group Footer

Dieser Abschnitt wird von einer Berichtsgruppe (Kapitel Gruppen ) eingeleitet . Der Gruppenfußbereich wird unter dem Detailabschnitt gedruckt, bevor sich der Wert des Gruppierungsausdrucks ändert. Die Gruppenfußzeile wird immer für die letzte Datenzeile in der Datenquelle gedruckt. Wenn mehr als eine Gruppe definiert ist, wird die Gruppenfußzeile in umgekehrter Reihenfolge der Gruppendefinition gedruckt.

7

Column Footer

Dieser Abschnitt wird am Ende jeder Spalte angezeigt. Wenn die Spaltenanzahl des Berichts 1 beträgt, werden die Spaltenüberschriften und Fußzeilen ignoriert.

8

Page Footer

Dieser Abschnitt wird am Ende jeder Seite angezeigt.

9

Last Page Footer

Dieser Abschnitt ersetzt die normale Seitenfußzeile auf der letzten Seite des Berichts. Falls auch der Zusammenfassungsabschnitt vorhanden ist, ist dies möglicherweise nicht die allerletzte Seite des Dokuments. Dieser Abschnitt ist manchmal nützlich, wenn zusammenfassende Informationen am Ende der letzten Seite angezeigt werden müssen.

10

Summary

Dieser Abschnitt wird am Ende des Berichts nur einmal angezeigt.

11

No Data

Dieser Abschnitt wird gedruckt, wenn die Eigenschaft " Wenn keine Daten gedruckt werden" auf " Keine Daten" festgelegt ist . Wenn der Abschnitt <noData> in der Berichtsvorlage definiert ist und die Datenquelle leer ist, wird zum Zeitpunkt des Füllens nur der Abschnitt <noData> berücksichtigt, und sein Inhalt erzeugt die Berichtsausgabe.

12

Background

Der Hintergrundabschnitt wird auf jeder Seite angezeigt und kann nicht zur nächsten Seite überlaufen. In diesem Abschnitt platzierte Elemente werden zur Zeit der Seiteninitialisierung ausgewertet und im Hintergrund angezeigt. Alle anderen Seitenobjekte werden über den Hintergrundobjekten angezeigt. Dieser Abschnitt ist nützlich zum Erstellen von Seitenwasserzeichen.

Abschnitt, Elemente und Attributbeziehung

Das folgende Diagramm zeigt die Beziehung zwischen Elementen und Attributen in einem Abschnitt eines Berichts.

Abschnittselemente

Alle oben genannten Berichtsabschnitte sind optional. Jede Berichtsvorlage enthält jedoch mindestens einen solchen Abschnitt. Jeder dieser Abschnitte enthält ein einzelnes <band> Element als einziges Unterelement. A <band> kann null oder mehr folgende Unterelemente enthalten -

<line>, <rechteck>, <ellipse>, <image>, <staticText>, <textField>, <subReport> oder <elementGroup>

Jedes dieser Elemente muss ein einzelnes <enthaltenreportElement> als erstes Element (außer elementGroup). A <reportElement> legt fest, wie Daten für dieses bestimmte Element angeordnet werden. Im Gegensatz zu Variablen und Parametern müssen Berichtselemente keinen Namen haben, da Sie normalerweise kein einzelnes Element in einer Berichtsvorlage abrufen müssen.

Die folgende Tabelle fasst die Attribute von <zusammenreportElement> -

Attribut Beschreibung Gültige Werte
x Gibt die x-Koordinate des Bandelements an. Ein ganzzahliger Wert, der die x-Koordinate des Elements in Pixel angibt. Dieses Attribut ist erforderlich.
y Gibt die y-Koordinate des Bandelements an. Ein ganzzahliger Wert, der die y-Koordinate des Elements in Pixel angibt. Dieses Attribut ist erforderlich.
Breite Gibt die Breite des Bandelements an. Ein ganzzahliger Wert, der die Elementbreite in Pixel angibt. Dieses Attribut ist erforderlich.
Höhe Gibt die Höhe des Bandelements an. Ein ganzzahliger Wert, der die Elementhöhe in Pixel angibt. Dieses Attribut ist erforderlich.
Schlüssel Eindeutige Kennung des Bandelements. Ein eindeutiger Zeichenfolgenwert.
Strecken-Typ Gibt an, wie sich das Element dehnt, wenn sich das enthaltende Band dehnt

NoStretch (default) - Das Element wird nicht gedehnt.

RelativeToTallestObject - Das Element wird gedehnt, um das höchste Objekt in seiner Gruppe aufzunehmen.

RelativeToBand - Das Element wird gedehnt, um der Höhe des Bandes zu entsprechen.

positionType Gibt die Position des Elements an, wenn sich das Band erstreckt.

Float - Das Element bewegt sich abhängig von der Größe der umgebenden Elemente.

FixRelativeToTop (default) - Das Element behält eine feste Position relativ zur Oberseite des Bandes bei.

FixRelativeToBottom - Das Element behält eine feste Position relativ zum Boden des Bandes bei.

isPrintRepeatedValues Gibt an, ob wiederholte Werte gedruckt werden.

true (default) - Wiederholte Werte werden gedruckt.

false - Wiederholte Werte werden nicht gedruckt.

Modus Gibt den Hintergrundmodus des Elements an Undurchsichtig, transparent
isRemoveLineWhenBlank Gibt an, ob das Element entfernt werden soll, wenn es leer ist und sich keine anderen Elemente im selben horizontalen Bereich befinden. wahr falsch
isPrintInFirstWholeBand Gibt an, ob das Element in einem ganzen Band gedruckt werden muss, dh in einem Band, das nicht zwischen Berichtsseiten oder Spalten aufgeteilt ist. wahr falsch
isPrintWhenDetailOverFlows Gibt an, ob das Element gedruckt wird, wenn das Band zu einer neuen Seite oder Spalte überläuft. wahr falsch
printWhenGroupChanges Gibt an, dass das Element gedruckt wird, wenn sich die angegebene Gruppe ändert. Ein Zeichenfolgenwert.
Vordergrundfarbe Gibt die Vordergrundfarbe des Elements an. Entweder ein hexadezimaler RGB-Wert, dem das Zeichen # vorangestellt ist, oder einer der folgenden vordefinierten Werte: Schwarz, Blau, Cyan, Dunkelgrau, Grau, Grün, Hellgrau, Magenta, Orange, Rosa, Rot, Gelb, Weiß.
Hintergrundfarbe Gibt die Hintergrundfarbe des Elements an. Entspricht den gültigen Werten für die Vorfarbe

Abschnittsattribute

Im Folgenden sind die Attribute eines Berichtsabschnitts aufgeführt:

Höhe

Die Höhe des Abschnitts gibt die Höhe in Pixel für diesen bestimmten Abschnitt an und ist für das gesamte Berichtsdesign sehr wichtig.

Beim Ausdruck drucken

Ein boolescher Ausdruck, der bestimmt, ob der Abschnitt gedruckt werden soll oder nicht.

Teilen erlaubt

Ein Flag, das angibt, ob der Abschnitt geteilt werden darf, wenn er nicht auf die aktuelle Seite passt. Wenn true, wird der Abschnitt auf die nächste Seite übertragen. Beachten Sie, dass der Abschnitt unabhängig vom Wert des Flags aufgeteilt wird, falls der Abschnitt nicht auf die nächste Seite passt. splitType kann folgende Werte annehmen:

  • splitType = "Stretch:" Teilt gestreckten Inhalt. Wenn sich der Abschnitt auf der aktuellen Seite erstreckt (wenn der verfügbare Platz kleiner als die angegebene Höhe ist), kann der Bereich, der zur ursprünglichen Höhe hinzugefügt wird, auf die nächste Seite aufgeteilt werden.

  • splitType = "Verhindern:" Verhindern Sie die Aufteilung beim ersten Versuch. Wenn der Abschnitt nicht auf die nächste Seite passt, erfolgt die Aufteilung normal, da die Verhinderung der Bandaufteilung nur beim ersten Aufteilungsversuch wirksam ist.

  • splitType = "Sofort:" Sofort teilen . Die Band darf sich überall teilen, außer oben, ihrem obersten Element.

Beispiel

Um jeden Abschnitt zu demonstrieren, schreiben wir eine Berichtsvorlage (jasper_report_template.jrxml). Speichern Sie diese Datei unterC:\tools\jasperreports-5.0.1\testVerzeichnis. In dieser Datei wird in jedem der Abschnitte ein Text angezeigt (siehe oben). Der Inhalt der Datei ist wie folgt:

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

Der Java-Code zum Ausfüllen und Generieren des Berichts ist unten angegeben. Speichern wir diese DateiJasperReportFill.java in das Verzeichnis 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();
      }

   }
}

Hier verwenden wir eine Instanz von JREmptyDataSource beim Füllen von Berichten, um eine Datenquelle mit einem Datensatz zu simulieren, wobei jedoch alle Felder in diesem einzelnen Datensatz null sind.

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 wie folgt.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup übernommen 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) wie folgt:

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

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

Hier können wir in jedem der Abschnitte sehen, dass ein Text gedruckt wird. Es ist zu beachten, dass JRXML ein <lastPageFooter> -Element enthält, das auf der letzten Seite des Berichts anstelle des angezeigten <pageFooter> -Elements angezeigt wird. Die Elemente <columnHeader> und <columnFooter> werden im Bericht nur angezeigt, wenn er mehr als eine Spalte enthält.

Gruppen in JasperReports helfen dabei, Daten im Bericht auf logische Weise zu organisieren. Eine Berichtsgruppe repräsentiert eine Folge aufeinanderfolgender Datensätze in der Datenquelle, die etwas gemeinsam haben, z. B. den Wert bestimmter Berichtsfelder. Eine Berichtsgruppe wird durch das Element <group> definiert. Ein Bericht kann eine beliebige Anzahl von Gruppen haben. Einmal deklariert, können Gruppen im gesamten Bericht verwiesen werden.

Eine Berichtsgruppe besteht aus drei Elementen:

  • Gruppenausdruck - Dies gibt die Daten an, die geändert werden müssen, um eine neue Datengruppe zu starten.

  • Gruppenkopfbereich - Hilft beim Platzieren der Beschriftung am Anfang der gruppierten Daten.

  • Gruppenfußbereich - Hilft beim Platzieren der Beschriftung am Ende der gruppierten Daten.

Wenn sich der Wert des Gruppenausdrucks während der Iteration durch die Datenquelle zum Zeitpunkt des Ausfüllens des Berichts ändert, tritt ein Gruppenbruch auf und die entsprechenden Abschnitte <groupFooter> und <groupHeader> werden in das resultierende Dokument eingefügt.

Der Berichtsgruppenmechanismus führt keine Sortierung für die von der Datenquelle bereitgestellten Daten durch. Die Datengruppierung funktioniert nur dann wie erwartet, wenn die Datensätze in der Datenquelle bereits gemäß den im Bericht verwendeten Gruppenausdrücken sortiert sind.

Gruppenattribute

Das <group> -Element enthält Attribute, mit denen wir steuern können, wie gruppierte Daten angeordnet sind. Die Attribute sind in der folgenden Tabelle zusammengefasst -

S.NO. Attribut und Beschreibung
1

name

Dies ist obligatorisch. Es verweist auf die Gruppe in Berichtsausdrücken nach Namen. Es folgt denselben Namenskonventionen, die wir für die Berichtsparameter, Felder und Berichtsvariablen erwähnt haben. Es kann in anderen JRXML-Attributen verwendet werden, wenn Sie auf eine bestimmte Berichtsgruppe verweisen möchten.

2

isStartNewColumn

Wenn true festgelegt ist , beginnt jede Datengruppe in einer neuen Spalte. Der Standardwert ist false .

3

isStartNewPage

Wenn true festgelegt ist , beginnt jede Datengruppe auf einer neuen Seite. Der Standardwert ist false .

4

isResetPageNumber

Bei true wird die Seitenzahl des Berichts bei jedem Start einer neuen Gruppe zurückgesetzt. Der Standardwert ist false.

5

isReprintHeaderOnEachPage

Bei true wird der Gruppenkopf auf jeder Seite neu gedruckt. Der Standardwert ist false .
6

minHeightToStartNewPage

Definiert den minimalen vertikalen Platz, der am unteren Rand der Spalte benötigt wird, um den Gruppenkopf in der aktuellen Spalte zu platzieren. Der Betrag wird in Berichtseinheiten angegeben.

7

footerPosition

Rendert die Position der Gruppenfußzeile auf der Seite sowie deren Verhalten in Bezug auf die darauf folgenden Berichtsabschnitte. Der Wert kann sein: Normal , StackAtBottom , ForceAtBottom und CollateAtBottom . Der Standardwert ist Normal .

8

keepTogether

Wenn diese Option auf true gesetzt ist , wird verhindert, dass sich die Gruppe bei ihrem ersten Unterbrechungsversuch aufteilt.

Beispiel

Fügen wir eine Gruppe hinzu (CountryGroup) zu vorhandener Berichtsvorlage (Kapitel Berichtsentwürfe ). Das Auftreten jedes Landes wird gezählt und die Anzahl wird als Gruppenfußzeile angezeigt. Im Gruppenkopf wird der Anzahl jedes Datensatzes vorangestellt. 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"/>
   
   <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>

Die Java-Codes für das Ausfüllen von Berichten bleiben unverändert. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sind wie unten angegeben -

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

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

Der Inhalt der Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sind wie unten angegeben -

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

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 wie folgt.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup übernommen 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 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

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

Hier sehen wir, dass jedes Land gruppiert ist und die Anzahl der Vorkommen jedes Landes in der Fußzeile jeder Gruppe angezeigt wird.

Ein Bericht enthält Textelemente, von denen jedes seine eigenen Schriftarteinstellungen haben kann. Diese Einstellungen können mit <festgelegt werdenfont> Tag im <textElement> -Tag verfügbar. Ein Bericht kann mehrere Schriftarten definieren. Einmal definiert, können sie als Standard- oder Basisschriftarteneinstellungen für andere Schriftdefinitionen im gesamten Bericht verwendet werden.

Schriftarten melden

Eine Berichtsschriftart ist eine Sammlung von Schriftarteneinstellungen, die auf Berichtsebene deklariert werden. Eine Berichtsschriftart kann in der gesamten Berichtsvorlage wiederverwendet werden, wenn die Schrifteigenschaften von Textelementen festgelegt werden.

Berichtsschriftarten sind jetzt veraltet. Verwenden Sie keine <reportFont /> -Elemente, die im Dokument selbst deklariert sind. Verwenden Sie stattdessen das Element <style />.

Schriftattribute

Die folgende Tabelle fasst die Hauptattribute des <zusammenfont> Element -

S.NO. Attribut und Beschreibung
1

fontName

Der Schriftname, der der Name einer physischen, einer logischen oder der Name einer Schriftfamilie aus den registrierten JasperReports-Schrifterweiterungen sein kann.

2

size

Die Größe der Schrift in Punkten. Der Standardwert ist 10.

3

isBold

Das Flag, das angibt, ob eine fette Schrift erforderlich ist. Der Standardwert ist false.

4

isItalic

Das Flag, das angibt, ob eine kursive Schrift erforderlich ist. Der Standardwert ist false.

5

isUnderline

Das Flag, das angibt, ob die unterstrichene Textdekoration erforderlich ist. Der Standardwert ist false.

6

isStrikeThrough

Das Flag, das angibt, ob die durchgestrichene Textdekoration erforderlich ist. Der Standardwert ist false.

7

pdfFontName

Der Name einer entsprechenden PDF-Schriftart, die von der iText-Bibliothek beim Exportieren von Dokumenten in das PDF-Format benötigt wird.

8

pdfEncoding

Die entsprechende PDF-Zeichencodierung, die auch von der iText-Bibliothek benötigt wird.

9

isPdfEmbedded

Das Flag, das angibt, ob die Schriftart in das Dokument selbst eingebettet werden soll. Der Standardwert ist false. Wenn diese Option auf "true" gesetzt ist, können Sie das PDF-Dokument problemlos anzeigen.

Schriftarten

In JasperReports können Schriftarten wie folgt kategorisiert werden:

  • Logical Fonts- Fünf Schriftarten, die seit Version 1.0 von der Java-Plattform erkannt werden, werden als logische Schriftarten bezeichnet. Dies sind -Serif, SansSerif, Monospaced, Dialog, and DialogInput. Diese logischen Schriftarten sind keine tatsächlichen Schriftartenbibliotheken, die irgendwo auf dem System installiert sind. Es handelt sich lediglich um Schrifttypnamen, die von der Java-Laufzeit erkannt werden. Diese müssen einer physischen Schriftart zugeordnet sein, die auf dem System installiert ist.

  • Physical Fonts- Diese Schriftarten sind die eigentlichen Schriftbibliotheken, die beispielsweise aus TrueType- oder PostScript Type 1-Schriftarten bestehen. Die physischen Schriftarten können Arial, Time, Helvetica, Courier oder eine beliebige Anzahl anderer Schriftarten sein, einschließlich internationaler Schriftarten.

  • Font Extensions- Die JasperReports-Bibliothek kann zur Laufzeit direkt registrierte Schriftarten verwenden, da sie integrierte Schriftartenerweiterungen unterstützt. Eine Liste von Schriftfamilien kann den JasperReports mithilfe der Schrifterweiterung zur Verfügung gestellt werden. Diese bestehen aus ähnlich aussehenden Schriftarten und unterstützen bestimmte Gebietsschemas.

Wie in der obigen Tabelle beschrieben, müssen wir im Attribut fontName den Namen einer physischen Schriftart, den Namen einer logischen Schriftart oder den Namen einer Schriftfamilie aus den registrierten JasperReports-Schriftartenerweiterungen angeben .

PDF-Schriftname

Die JasperReports-Bibliothek verwendet die iText-Bibliothek beim Exportieren von Berichten in PDF (Portable Document Format). PDF-Dateien können auf verschiedenen Plattformen angezeigt werden und sehen immer gleich aus. Dies liegt teilweise daran, dass es in diesem Format eine spezielle Art des Umgangs mit Schriftarten gibt. Das Attribut fontName ist beim Exportieren in PDF nicht hilfreich . Das Attribut pdfFontName ist vorhanden, in dem die Schriftarteinstellungen angegeben werden müssen.

Die iText-Bibliothek kann mit integrierten Schriftarten und TTF-Dateien umgehen und erkennt die folgenden integrierten Schriftnamen:

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

Gemäß der Voraussetzung für die iText-Bibliothek müssen wir für die Arbeit mit Schriftarten einen der folgenden Namen als Schriftartnamen angeben:

  • Ein integrierter Schriftname aus der obigen Liste.

  • Der Name einer TTF-Datei (True Type Font), die auf der Festplatte gefunden werden kann.

  • Der tatsächliche Name der Schriftart, vorausgesetzt, die TTF-Datei, die die Schriftart enthält, wurde zuvor bei iText registriert oder es wurde ein Alias ​​definiert, als die Schriftart registriert wurde.

Basierend auf den oben genannten Voraussetzungen kann das Attribut pdfFontName einen der folgenden Werte enthalten:

  • Der Name einer integrierten PDF-Schriftart aus der obigen Liste.

  • Der Name einer TTF-Datei, die sich zur Laufzeit beim Exportieren in PDF auf der Festplatte befinden kann.

  • Der echte Name einer registrierten Schriftart.

  • Das Suffix des Schlüssels (der Teil nach net.sf.jasperreports.export.pdf.font ) für eine bei iText als Schriftartdatei registrierte Schriftart.

Standardschriftarten und Vererbung

Jedes Textelement erbt Schrift- und Stilattribute von seinem übergeordneten Element, das diese Attribute wiederum von seinem übergeordneten Element erbt. Wenn für Elemente keine Stile und / oder Schriftarten definiert sind, wird der im Stammelement <jasperReport /> deklarierte Standardstil (und / oder die Schriftart - dies ist jetzt veraltet) angewendet.

Das Definieren von Standardstilen oder Schriftarten in JasperReports ist nicht obligatorisch. Wenn für ein bestimmtes Element keine Schriftart definiert ist, sucht die Engine entweder nach den geerbten Schriftattributen oder, wenn auf diese Weise keine Attribute gefunden werden, nach der Eigenschaft net.sf.jasperreports.default.font.name in der Datei / Datei src / default.jasperreports.properties . Sein Wert definiert den Namen der Schriftfamilie, die verwendet werden soll, wenn die Schrifteigenschaften nicht explizit für ein Textelement definiert oder von seinem übergeordneten Element geerbt werden.

Die wichtigsten Standardschriftarteneigenschaften und ihre in der Datei /src/default.jasperreports.properties definierten Werte sind in der folgenden Tabelle aufgeführt:

Eigentum Beschreibung
net.sf.jasperreports.default.font.name = SansSerif Der Standardschriftname.
net.sf.jasperreports.default.font.size = 10 Die Standardschriftgröße.
net.sf.jasperreports.default.pdf.font.name = Helvetica Die Standard-PDF-Schriftart.
net.sf.jasperreports.default.pdf.encoding = Cp1252 Die Standardcodierung für PDF-Zeichen.
net.sf.jasperreports.default.pdf.embedded = false Standardmäßig werden PDF-Schriftarten nicht eingebettet.

Beispiel

Um die Verwendung von Schriftarten und Schriftattributen zu demonstrieren, um ein bestimmtes Texterscheinungsbild zu erhalten, schreiben wir eine neue Berichtsvorlage (jasper_report_template.jrxml). Der Inhalt der JRXML ist wie folgt. Speichern Sie es im Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test. Hier zeigen wir einen Text im Titel des Berichts in verschiedenen Schriftformaten an.

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

Der Java-Code zum Ausfüllen und Generieren des Berichts lautet wie folgt. Speichern wir diese DateiJasperFontsReportFill.java in das Verzeichnis 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();
      }

   }
}

Hier verwenden wir eine Instanz von JREmptyDataSource beim Füllen von Berichten, um eine Datenquelle mit einem Datensatz zu simulieren, wobei jedoch alle Felder null sind .

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 wie folgt.

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.JasperFontsReportFill (viewFullReport ist das Standardziel) als -

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

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

Hier sehen wir, dass der Text "Willkommen bei TutorialsPoint" in verschiedenen Schriftformaten angezeigt wird.

In JasperReports sind für die Arbeit mit Texten einige spezielle Tools erforderlich, um sowohl die Zeichendarstellungen als auch die Textformatierungseigenschaften zu verarbeiten. Jeder Text kann als Zeichenfolge mit einer bestimmten Darstellungsstruktur betrachtet werden. Die Texterscheinung besteht sowohl aus Layout- (und Absatz-) als auch aus Schriftarteinstellungen. Während das Textlayout in den meisten Fällen unverändert bleibt, können sich die Schriftarteinstellungen ändern, wenn der Bericht in verschiedenen Gebietsschemas ausgeführt wird.

Wir wissen, dass verschiedene Sprachen unterschiedliche Zeichensätze in Bezug auf die Darstellung bestimmter Zeichen benötigen. Das Arbeiten mit Texten bedeutet daher das Arbeiten mit Schriftarten. Eine ausführliche Beschreibung der Verwendung von Schriftarten in JasperReports finden Sie jedoch im Kapitel Berichtsschriftarten .

Eines der Hauptmerkmale in Bezug auf den Textinhalt in einem bestimmten Bericht ist die Möglichkeit, ihn zu internationalisieren. Dies bedeutet, dass wir den Bericht in verschiedenen lokalisierten Umgebungen ausführen können, wobei verschiedene Sprachen und andere Lokalisierungseinstellungen ohne fest codierte Änderungen verwendet werden. Die Zeichenkodierung ist ein wichtiges Merkmal, wenn ein Bericht internationalisiert werden soll.

Zeichenkodierung

Ein Zeichen ist die kleinste Schreibeinheit, die eine aussagekräftige Information vermittelt. Es ist ein abstraktes Konzept, eine Figur hat kein visuelles Erscheinungsbild. "Großbuchstaben Latein A" ist ein anderes Zeichen als "Kleinbuchstaben Latein A" und "Großbuchstaben Kyrillisch A" und "Großbuchstaben Griechisch Alpha".

Eine visuelle Darstellung eines Charakters ist bekannt als glyph. Ein bestimmter Satz von Glyphen wird als a bezeichnetfont. "Großbuchstaben Latein A", "Großbuchstaben Kyrillisch A" und "Großbuchstaben Griechisch Alpha" haben möglicherweise identische Glyphen, aber sie sind unterschiedliche Zeichen. Gleichzeitig können die Glyphen für "Latin A in Großbuchstaben" in Times New Roman, Gill Sans und Poetica kursiv sehr unterschiedlich aussehen, aber sie repräsentieren immer noch den gleichen Charakter.

Der Satz verfügbarer Zeichen wird als Zeichenrepertoire bezeichnet . Die Position (Index) eines bestimmten Zeichens innerhalb eines Repertoires wird als Codeposition oder Codepunkt bezeichnet. Die Methode zur numerischen Darstellung eines Codepunkts innerhalb eines bestimmten Repertoires wird als bezeichnetcharacter encoding.

Codierungen werden normalerweise in Oktetten ausgedrückt. Ein Oktett ist eine Gruppe von acht Binärziffern, dh acht Einsen und Nullen. Ein Oktett kann einen numerischen Bereich zwischen 0 und 255 oder zwischen 0x00 und 0xFF ausdrücken, um die hexadezimale Notation zu verwenden.

Unicode

Ein Unicode ist ein Zeichenrepertoire, das die meisten in den Sprachen der Welt verwendeten Zeichen enthält. Es kann Millionen von Zeichen aufnehmen und enthält bereits Hunderttausende. Unicode ist in "Ebenen" mit 64 KB Zeichen unterteilt. Die einzige, die in den meisten Fällen verwendet wird, ist die erste Ebene, die als mehrsprachige Grundebene oder BMP bezeichnet wird.

UTF-8 ist die empfohlene Codierung. Es wird eine variable Anzahl von Oktetten verwendet, um verschiedene Zeichen darzustellen.

In einer JRXML-Datei wird das Codierungsattribut im Header angegeben. Es wird zur Berichtserstellungszeit verwendet, um den XML-Inhalt zu dekodieren. Wenn der Bericht beispielsweise nur französische Wörter und Zeichen wie ç, é, â enthält, ist die ISO-8859-1-Codierung (auch bekannt als Latin-1) ausreichend.

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

Wie oben gezeigt, können wir im Idealfall die Codierungsanpassung für den minimalen Zeichensatz auswählen, der alle Zeichen im Dokument korrekt darstellen kann. Bei mehrsprachigen Dokumenten (dh Dokumenten, die Wörter enthalten, die in mehreren Sprachen geschrieben sind) sollte die Codierung ausgewählt werden, die an den minimalen Zeichensatz angepasst ist und alle Zeichen im Dokument korrekt darstellen kann, auch wenn sie zu verschiedenen Sprachen gehören. Eine der Zeichencodierungen, die mehrsprachige Dokumente verarbeiten können, ist dieUTF-8, wird von JasperReports als Standardcodierungswert verwendet.

Die Texte werden normalerweise während der Internationalisierung in Ressourcenpaketdateien und nicht im Dokument gespeichert. Es gibt also Fälle, in denen JRXML selbst vollständig ASCII-kompatibel aussieht, aber zur Laufzeit generierte Berichte Texte enthalten, die mit ASCII nicht lesbar sind. Daher muss für eine bestimmte Art von Dokumentexportformaten (wie CSV, HTML, XHTML, XML und Text) auch die Codierung für das generierte Dokument bekannt sein. Unterschiedliche Sprachen werden durch unterschiedliche Zeichenkodierungen unterstützt. Daher müssen wir jedes Mal einen Bericht in einer lokalisierten Umgebung ausführen. Außerdem müssen wir wissen, welche Zeichenkodierung für die generierte Dokumentensprache am besten geeignet ist. In diesem Fall ist die in der JRXML-Datei selbst definierte Codierungseigenschaft möglicherweise nicht mehr nützlich.

Um diese Art von Problemen zu lösen, können wir eine Export-Kundeneigenschaft verwenden, die als net.sf.jasperreports.export.character.encoding bekannt ist . Diese benutzerdefinierte Export-Eigenschaft ist standardmäßig UTF-8 und in JasperReports vorhanden.

Dieser Standardwert wird in der Datei default.jasperreports.properties festgelegt . Für spezifischere Optionen zum Zeitpunkt des Exports steht auch der Exportparameter CHARACTER_ENCODING zur Verfügung.

Beispiel

Um die Verwendung der Unicode-Unterstützung in Jasperreports zu demonstrieren, schreiben wir eine neue Berichtsvorlage (jasper_report_template.jrxml). Save it to C:\tools\jasperreports-5.0.1\testVerzeichnis. Hier zeigen wir einen Text in verschiedenen Sprachen mit den Unicode-Zeichen (\ uXXXX) an. Jedes mit UTF-8 codierte Zeichen kann nur mit seinem 4-stelligen Hexadezimalcode dargestellt werden. Zum Beispiel kann der griechische Buchstabe Γ als \ u0393 geschrieben werden. Wenn eine solche Notation auftritt, fordert die Engine die entsprechende Zeichendarstellung im Zeichensatz an, und nur dieses bestimmte Zeichen wird ausgedruckt. Der Inhalt der JRXML ist wie folgt:

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

In der obigen Datei können wir das Vorhandensein der UTF-8-Codierung sehen. Auch die lokalisierten Unicode-Textteile werden in Dokumentparametern gespeichert.

Der Java-Code zum Ausfüllen und Generieren des Berichts lautet wie folgt. Speichern wir diese DateiJasperUnicodeReportFill.java in das Verzeichnis 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();
      }

   }
}

Hier verwenden wir eine Instanz von JREmptyDataSource beim Füllen von Berichten, um eine Datenquelle mit einem Datensatz zu simulieren, wobei jedoch alle Felder in diesem einzelnen Datensatz null sind .

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 wie folgt.

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.JasperUnicodeReportFill (viewFullReport ist das Standardziel) wie folgt:

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

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

Hier können wir sehen, dass der angezeigte Text in verschiedenen Sprachen vorliegt. Wir sehen auch, dass die Sprachen auf derselben Seite zusammengefasst und auch in dasselbe Textelement gemischt sind.

JasperReports verfügt über eine Funktion <Stil>, mit der die Texteigenschaften in einer Berichtsvorlage gesteuert werden können. Dieses Element ist eine Sammlung von Stileinstellungen, die auf Berichtsebene deklariert wurden. Eigenschaften wie Vordergrundfarbe, Hintergrundfarbe, ob die Schrift fett, kursiv oder normal ist, die Schriftgröße, ein Rand für die Schrift und viele andere Attribute werden vom <style> -Element gesteuert. Stile können andere Stile erweitern und Eigenschaften des übergeordneten Stils hinzufügen oder auch überschreiben.

Stileigenschaften

Ein <style> -Element hat viele Attribute. Einige der am häufigsten verwendeten sind in der folgenden Tabelle aufgeführt -

S.NO. Attribut und Beschreibung
1

name

Ist obligatorisch. Es muss eindeutig sein, da es im gesamten Bericht auf den entsprechenden Berichtsstil verweist.

2

isDefault

Gibt an, ob dieser Stil der Standardstil des Dokuments ist.

3

style

Ist ein Verweis auf den übergeordneten Stil.

4

mode

Gibt die Transparenz des Elements an. Mögliche Werte sind Opak und Transparent .

5

forecolor

Ist die Vordergrundfarbe des Objekts.

6

backcolor

Ist die Hintergrundfarbe des Objekts.

7

fill

Bestimmt das Füllmuster, mit dem das Objekt gefüllt wird. Im Moment ist der zulässige Einzelwert Solid .

6

radius

Gibt den Radius des Eckbogens des Rechtecks ​​an.

7

scaleImage

Gibt den Maßstab nur für die Bilder an. Mögliche Werte: Clip, FillFrame, RetainShape, RealHeight und RealSize .

8

hAlign

Gibt die horizontale Ausrichtung an. Mögliche Werte: Links, Mitte, Rechts und Ausgerichtet .

9

vAlign

Gibt die vertikale Ausrichtung an. Mögliche Werte: Oben, Mittel und Unten .

10

rotation

Gibt die Drehung des Elements an. Mögliche Werte: Keine, Links, Rechts und UpsideDown .

11

lineSpacing

Gibt den Zeilenabstand zwischen Textzeilen an. Mögliche Werte: Single, 1_1_2, Double .

12

markup

Gibt den Markup-Stil für gestaltete Texte an.

13

fontName

Gibt den Schriftnamen an.

14

fontSize

Gibt die Schriftgröße an.

15

isBold

Gibt an, ob der Schriftstil fett ist.

16

isItalic

Gibt an, ob der Schriftstil kursiv ist.

17

isUnderline

Gibt an, ob der Schriftstil unterstrichen ist.

18

isStrikeThrough

Gibt an, ob der Schriftstil durchgestrichen ist.

19

pdfFontName

Gibt den zugehörigen PDF-Schriftnamen an.

20

pdfEncoding

Gibt die Zeichenkodierung für das PDF-Ausgabeformat an.

22

isPdfEmbedded

Gibt an, ob die PDF-Schriftart eingebettet ist.

23

pattern

Gibt das Formatmuster für formatierte Texte an.

24

isBlankWhenNull

Gibt an, ob eine leere Zeichenfolge (Leerzeichen) angezeigt werden soll, wenn der Ausdruck null ergibt.

Bedingte Stile

In einigen Situationen sollte ein Stil nur angewendet werden, wenn eine bestimmte Bedingung erfüllt ist (z. B. um benachbarte Zeilenfarben in einem Berichtsdetailabschnitt zu wechseln). Dies kann mit bedingten Stilen erreicht werden.

Ein bedingter Stil besteht aus zwei Elementen:

  • ein boolescher Bedingungsausdruck
  • ein Stil

Der Stil wird nur verwendet, wenn die Bedingung als wahr ausgewertet wird .

Anwenden von Stilen auf Berichtselemente

Jeder Typ von Berichtselement kann mithilfe des Stilattributs auf eine Berichtsstildefinition verweisen. Daher werden alle von der Stildefinition deklarierten Stileigenschaften, die für das aktuelle Element gelten, vererbt. Um die geerbten Werte zu überschreiben, können die auf Berichtselementebene angegebenen Stileigenschaften verwendet werden.

Stilvorlagen

Wir können eine Reihe von Berichten mit einem gemeinsamen Erscheinungsbild erstellen, indem wir den Stil an einem gemeinsamen Ort definieren. Auf diese allgemeine Stilvorlage kann dann von den Berichtsvorlagen verwiesen werden. Eine Stilvorlage ist eine XML-Datei, die eine oder mehrere Stildefinitionen enthält. Stilvorlagendateien, die von der Konvention verwendet werden*.jrtx Verlängerung, aber dies ist nicht obligatorisch.

Eine Stilvorlage enthält folgende Elemente:

  • <jasperTemplate> - Dies ist das Stammelement einer Stilvorlagendatei .

  • <Vorlage> - Dieses Element wird verwendet, um Verweise auf andere Vorlagendateien einzuschließen. Der Inhalt dieses Elements wird als Speicherort der referenzierten Vorlagendatei interpretiert.

  • <Stil> - Dieses Element ist identisch mit dem gleichnamigen Element aus Berichtsentwurfsvorlagen (JRXML-Dateien), mit der Ausnahme, dass ein Stil in einer Stilvorlage keine bedingten Stile enthalten kann. Diese Einschränkung wird durch die Tatsache verursacht, dass bedingte Stile Berichtsausdrücke enthalten und Ausdrücke nur im Kontext einer einzelnen Berichtsdefinition interpretiert werden können.

Verweise auf Stilvorlagen sind in JRXML-Berichten als <Template> -Elemente enthalten. Die Stilvorlagen werden zur Berichtsfüllzeit geladen, und Stilnamenreferenzen werden aufgelöst, sobald alle Vorlagen geladen wurden. Beim Laden von Stilvorlagen und Auflösen von Stilnamen in Stile wird ein Baum / Diagramm mit Stilvorlagen erstellt, wobei der obere Rand des Baums die im Bericht definierten Stile darstellt. In diesem Baum werden Stilnamenreferenzen in den letzten Stil aufgelöst, der mit dem Namen in einer Tiefenüberquerung übereinstimmt.

Beispiel

Probieren wir die bedingten Stile und Stilvorlagen aus. Fügen wir das <hinzustyle> Element alternateStylezu unserer vorhandenen Berichtsvorlage (Kapitel Berichtsentwürfe ). Abhängig von der Bedingung ändert sich die Schriftfarbe für eine gleichmäßige Anzahl in Blau. Wir haben auch eine Stilvorlage hinzugefügt"styles.jrtx". 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">
	
   <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>

Der Inhalt der Stilvorlage styles.jrtxsind wie folgt. Speichern Sie es im Verzeichnis 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>

Die Java-Codes für das Ausfüllen von Berichten bleiben unverändert. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sind wie unten angegeben -

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

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

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

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

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 wie folgt.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup übernommen 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.

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

Hier können wir sehen, dass die Farbe der Schriftart für eine gleichmäßige Anzahl (im Spaltenland) in Blau geändert wird. Im Spaltennamen wird die Schriftfarbe in Grün geändert (auf diesen Stil wird in der Stilvorlage verwiesen).

Wir haben in unseren vorherigen Kapiteln gesehen, dass die im Bericht angezeigten Daten normalerweise aus Berichtsparametern und Berichtsfeldern abgerufen werden. Diese Daten können mit den Berichtsvariablen und ihren Ausdrücken verarbeitet werden. Es gibt Situationen, in denen eine komplexe Funktionalität mit Berichtsausdrücken oder -variablen nicht einfach erreicht werden kann. Beispiele hierfür können komplexe String-Manipulationen, das Erstellen von Karten oder Listen von Objekten im Speicher oder Manipulationen von Daten mithilfe von Java-APIs von Drittanbietern sein. In solchen Situationen bietet uns JasperReports eine einfache und leistungsstarke Möglichkeit, dies zu tunScriptlets.

Scriptlets sind Sequenzen von Java-Code, die jedes Mal ausgeführt werden, wenn ein Berichtsereignis auftritt. Die Werte von Berichtsvariablen können durch Scriptlets beeinflusst werden.

Scriptlet-Erklärung

Wir können ein Scriptlet auf zwei Arten deklarieren:

  • Verwenden von <scriptlet> Element. Dieses Element hat Namen Attribut und Klasse - Attribut. Das Klassenattribut sollte den Namen der Klasse angeben, wodurch die JRAbstractScriptlet- Klasse erweitert wird. Die Klasse muss zum Zeitpunkt des Berichtsfüllens im Klassenpfad verfügbar sein und über einen leeren Konstruktor verfügen, damit die Engine sie sofort instanziieren kann.

  • Verwenden des Attributs scriptletClass des Elements <jasperReport> in der Berichtsvorlage (JRXML). Durch Festlegen dieses Attributs mit dem vollständig qualifizierten Namen des Scriptlets (einschließlich des gesamten Paketnamens) geben wir an, dass wir ein Scriptlet verwenden möchten. Die mit diesem Attribut erstellte Scriptlet-Instanz verhält sich wie das erste Scriptlet in der Liste der Scriptlets und hat den vordefinierten Namen REPORT.

Scriptlet-Klasse

Ein Scriptlet ist eine Java-Klasse, die eine der folgenden Klassen erweitern muss:

  • net.sf.jasperreports.engine.JRAbstractScriptlet- Diese Klasse enthält eine Reihe abstrakter Methoden, die in jeder Implementierung überschrieben werden müssen. Diese Methoden werden von JasperReports zum richtigen Zeitpunkt automatisch aufgerufen. Der Entwickler muss alle abstrakten Methoden implementieren.

  • net.sf.jasperreports.engine.JRDefaultScriptlet- Diese Klasse enthält leere Standardimplementierungen aller Methoden in JRAbstractScriptlet. Ein Entwickler muss nur die Methoden implementieren, die er für sein Projekt benötigt.

In der folgenden Tabelle sind die Methoden in der obigen Klasse aufgeführt. Diese Methoden werden von der Berichts-Engine zu gegebener Zeit während der Berichtsfüllphase aufgerufen.

S.NO. Methode und Beschreibung
1

public void beforeReportInit()

Wird vor der Berichtsinitialisierung aufgerufen.

2

public void afterReportInit()

Wird nach der Berichtsinitialisierung aufgerufen.

3

public void beforePageInit()

Wird aufgerufen, bevor jede Seite initialisiert wird.

4

public void afterPageInit()

Wird aufgerufen, nachdem jede Seite initialisiert wurde.

5

public void beforeColumnInit()

Wird aufgerufen, bevor jede Spalte initialisiert wird.

6

public void afterColumnInit()

Wird aufgerufen, nachdem jede Spalte initialisiert wurde.

7

public void beforeGroupInit(String groupName)

Wird aufgerufen, bevor die im Parameter angegebene Gruppe initialisiert wird.

8

public void afterGroupInit(String groupName)

Wird aufgerufen, nachdem die im Parameter angegebene Gruppe initialisiert wurde.

9

public void beforeDetailEval()

Wird aufgerufen, bevor jeder Datensatz im Detailabschnitt des Berichts ausgewertet wird.

10

public void afterDetailEval()

Wird aufgerufen, nachdem jeder Datensatz im Detailabschnitt des Berichts ausgewertet wurde.

Pro Bericht können beliebig viele Scriptlets angegeben werden. Wenn für einen Bericht kein Scriptlet angegeben ist, erstellt die Engine weiterhin eine einzelne JRDefaultScriptlet-Instanz und registriert sie mit dem integrierten Parameter REPORT_SCRIPTLET.

Wir können unseren Scriptlets alle zusätzlichen Methoden hinzufügen, die wir benötigen. Berichte können diese Methoden mithilfe des integrierten Parameters REPORT_SCRIPTLET aufrufen.

Globale Scriptlets

Wir können Scriptlets auf andere Weise mit Berichten verknüpfen, indem wir die Scriptlets global deklarieren. Dadurch gelten die Scriptlets für alle Berichte, die in der angegebenen JasperReports-Bereitstellung ausgefüllt werden. Dies wird durch die Tatsache erleichtert, dass Scriptlets als Erweiterungen zu JasperReports hinzugefügt werden können. Der Scriptlet-Erweiterungspunkt wird durch die Schnittstelle net.sf.jasperreports.engine.scriptlets.ScriptletFactory dargestellt . JasperReports lädt zur Laufzeit alle über Erweiterungen verfügbaren Scriptlet-Fabriken. Anschließend wird jeder von ihnen nach der Liste der Scriptlet-Instanzen gefragt, die er auf den aktuellen Bericht anwenden möchte, der ausgeführt wird. Wenn Sie nach der Liste der Scriptlet-Instanzen fragen, gibt die Engine einige Kontextinformationen an, anhand derer die Factory entscheiden kann, welche Scriptlets tatsächlich für den aktuellen Bericht gelten.

Bericht Gouverneure

Governors sind nur eine Erweiterung globaler Scriptlets, mit denen wir das Problem lösen können, dass die Berichts-Engine zur Laufzeit in die Endlosschleife eintritt, während Berichte erstellt werden. Ungültige Berichtsvorlagen können zur Entwurfszeit nicht erkannt werden, da die Bedingungen für die Eingabe der Endlosschleifen meistens von den tatsächlichen Daten abhängen, die zur Laufzeit in die Engine eingespeist werden. Berichtsgouverneure helfen bei der Entscheidung, ob ein bestimmter Bericht in eine Endlosschleife eingetreten ist, und können ihn stoppen. Dies verhindert die Erschöpfung der Ressourcen für den Computer, auf dem der Bericht ausgeführt wird.

JasperReports verfügt über zwei einfache Berichts-Governors, die eine Berichtsausführung basierend auf einer festgelegten maximalen Seitenanzahl oder einem bestimmten Zeitlimit stoppen. Sie sind -

  • net.sf.jasperreports.governors.MaxPagesGovernor- Dies ist ein globales Scriptlet, das nach zwei Konfigurationseigenschaften sucht, um zu entscheiden, ob es für den aktuell ausgeführten Bericht gilt oder nicht. Die Konfigurationseigenschaften sind -

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

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

  • net.sf.jasperreports.governors.TimeoutGovernor- Dies ist auch ein globales Scriptlet, das nach den folgenden zwei Konfigurationseigenschaften sucht, um zu entscheiden, ob sie zutreffen oder nicht.

    Die Konfigurationseigenschaften sind -

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

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

Die Eigenschaften für beide Regler können global, in der Datei jasperreports.properties oder auf Berichtsebene als benutzerdefinierte Berichtseigenschaften festgelegt werden. Dies ist nützlich, da verschiedene Berichte unterschiedliche geschätzte Größen- oder Zeitlimits haben können und Sie möglicherweise auch die Regler für alle Berichte aktivieren möchten, während Sie sie für einige Berichte deaktivieren möchten, oder umgekehrt.

Beispiel

Schreiben wir eine Scriptlet-Klasse (MyScriptlet). Der Inhalt der Datei C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ MyScriptlet.java lautet wie folgt:

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

}

Details der obigen Scriptlet-Klasse sind wie folgt:

  • In der afterReportInit- Methode setzen wir einen Wert für die Variable"someVar" this.setVariableValue ("someVar", neuer String ("Dieser Variablenwert wurde vom Scriptlet geändert.")).

  • Am Ende der Klasse wird eine zusätzliche Methode aufgerufen 'hello'Wurde definiert. Dies ist ein Beispiel für eine Methode, die dem Scriptlet hinzugefügt werden kann und tatsächlich einen Wert zurückgibt, anstatt eine Variable festzulegen.

Als Nächstes fügen wir die Scriptlet-Klassenreferenz in unsere vorhandene Berichtsvorlage ein (Kapitel Berichtsentwürfe ). 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"
   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>

Die Details der überarbeiteten Berichtsvorlage sind unten angegeben -

  • Wir haben auf die MyScriptlet-Klasse im Attribut scriptletClass des Elements <jasperReport> verwiesen.

  • Scriptlets können nur auf die Berichtsfelder und -parameter zugreifen, diese jedoch nicht ändern. Scriptlets können jedoch Berichtsvariablenwerte ändern. Dies kann durch Aufrufen der setVariableValue () -Methode erreicht werden. Diese Methode ist in der JRAbstractScriptlet-Klasse definiert, die immer die übergeordnete Klasse eines Scriptlets ist. Hier haben wir eine Variable someVar definiert , die vom MyScriptlet so geändert wird, dass sie den Wert hat. Dieser Wert wurde vom Scriptlet geändert .

  • Die obige Berichtsvorlage enthält einen Methodenaufruf im Zusammenfassungsbereich, der veranschaulicht, wie neue Methoden (in Scriptlets) geschrieben und in der Berichtsvorlage verwendet werden. ($P{REPORT_SCRIPTLET}.hello())

Die Java-Codes für das Ausfüllen von Berichten bleiben unverändert. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sind wie unten angegeben -

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

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

Der Inhalt der Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sind wie unten angegeben -

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

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 wie folgt.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup übernommen 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 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

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

Hier sehen wir, dass zwei Nachrichten aus der MyScriptlet-Klasse angezeigt werden -

  • Im Titelabschnitt - Dieser Variablenwert wurde vom Scriptlet geändert
  • Unten - Hallo! Ich bin das Scriptlet-Objekt des Berichts.

Unterberichte sind eine der netten Funktionen der JasperReports. Diese Funktion ermöglicht das Einfügen eines Berichts in einen anderen Bericht, dh ein Bericht kann ein Unterbericht eines anderen sein. Unterberichte helfen uns dabei, Berichtsentwürfe einfach zu halten, da wir viele einfache Berichte erstellen und in einen Masterbericht einkapseln können. Unterberichte werden wie normale Berichte zusammengestellt und gefüllt. Jede Berichtsvorlage kann als Unterbericht verwendet werden, wenn sie in eine andere Berichtsvorlage aufgenommen wird, ohne dass sich darin (der Berichtsvorlage) etwas ändert.

Unterberichte sind wie normale Berichtsvorlagen. Es handelt sich tatsächlich um net.sf.jasperreports.engine.JasperReport- Objekte, die nach dem Kompilieren eines net.sf.jasperreports.engine.design.JasperDesign-Objekts erhalten werden .

<Unterbericht> Element

Ein <subreport> -Element wird verwendet, wenn Unterberichte in Masterberichte eingefügt werden. Hier ist die Liste der Unterelemente im JRXML-Element <subreport>.

  • <reportElement>

  • <parametersMapExpression> - Hiermit wird eine Karte mit Berichtsparametern an den Unterbericht übergeben. Die Zuordnung wird normalerweise aus einem Parameter im Masterbericht oder mithilfe des integrierten Parameters REPORTS_PARAMETERS_MAP abgerufen, um die Parameter des übergeordneten Berichts an den Unterbericht zu übergeben. Dieser Ausdruck sollte immer ein java.util.Map- Objekt zurückgeben, in dem die Schlüssel die Parameternamen sind.

  • <subreportParameter> - Dieses Element wird verwendet, um Parameter an den Unterbericht zu übergeben. Es verfügt über ein Attribut Namen , die obligatorisch ist.

  • <connectionExpression> - Hiermit wird eine java.sql.Connection an den Unterbericht übergeben. Es wird nur verwendet, wenn die Unterberichtsvorlage während der Berichtsfüllphase eine Datenbankverbindung benötigt.

  • <dataSourceExpression> - Hiermit wird eine Datenquelle an den Unterbericht übergeben. Diese Datenquelle wird normalerweise aus einem Parameter im Masterbericht oder mithilfe des integrierten Parameters REPORT_DATA_SOURCE abgerufen, um die Datenquelle des übergeordneten Berichts an den Unterbericht zu übergeben.

  • Die Elemente ( connectionExpression und dataSourceExpression ) können nicht gleichzeitig in einer <subreport> -Elementdeklaration vorhanden sein. Dies liegt daran, dass wir nicht sowohl eine Datenquelle als auch eine Verbindung zum Unterbericht bereitstellen können. Wir müssen uns für einen von ihnen entscheiden und dabei bleiben.

  • <returnValue> - Hiermit wird der Wert einer der Variablen des Unterberichts einer der Variablen des Masterberichts zugewiesen. Dieses Unterelement hat folgende Attribute:

    • subreportVariable - Dieses Attribut gibt den Namen der Unterberichtsvariablen an, deren Wert zurückgegeben werden soll.

    • toVariable - Dieses Attribut gibt den Namen der übergeordneten Berichtsvariablen an, deren Wert mit dem Wert aus dem Unterbericht kopiert / inkrementiert werden soll.

    • Berechnung - Dieses Attribut kann Werte annehmen: Nichts, Anzahl, DistinctCount, Summe, Durchschnitt, Niedrigster, Höchster, Standardabweichung, Varianz. Der Standardwert für das Attribut Berechnung ist „Nothing“.

    • incrementerFactoryClass - Dieses Attribut gibt die Factory-Klasse zum Erstellen der Inkrementer-Instanz an.

  • <subreportExpression> - Gibt an, wo sich die kompilierte Berichtsvorlage für den Unterbericht befindet. Dieses Element hat eineclassAttribut. Das Klassenattribut kann einen der folgenden Werte annehmen: java.lang.String, java.io.File, java.net.URL, java.io.InputStream, net.sf.jasperreports.engine.JasperReport. Der Standardwert ist java.lang.String .

  • isUsingCache - Dies ist ein Attribut des <subreport> -Elements. Dies ist ein Boolescher Wert. Wenn der Wert auf " true" gesetzt ist, versucht die Berichts-Engine, zuvor geladene Unterbericht-Vorlagenobjekte anhand ihrer angegebenen Quelle zu erkennen. Diese Caching-Funktion ist nur für Unterberichtselemente verfügbar, deren Ausdrücke java.lang.String-Objekte als Unterberichtvorlagenquelle zurückgeben, die Dateinamen, URLs oder Klassenpfadressourcen darstellen.

Beispiel

Nehmen Sie ein einfaches Beispiel, um die Erstellung von Unterberichten mit JRDataSource zu demonstrieren. Schreiben wir zunächst zwei neue Berichtsvorlagen, eine als Unterbericht und eine als Masterbericht. Der Inhalt der Vorlage für den Unterbericht (address_report_template.jrxml) ist wie folgt. Speichern Sie es im Verzeichnis 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>

Da wir eine Datenquelle verwenden, müssen wir eine entsprechende POJO-Datei schreiben SubReportBean.java Wie nachfolgend dargestellt. Speichern Sie es im Verzeichnis 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;
   }
}

Hier haben wir zwei Felder 'Stadt' und 'Straße' deklariert und entsprechende Getter- und Setter-Methoden definiert.

Jetzt aktualisieren wir unsere bestehenden DataBeanDatei. Wir werden ein neues Feld subReportBeanList hinzufügen , das eine java.util.List ist. Dieses Feld enthält die Liste der SubReportBean-Objekte. Der Inhalt der Datei DataBean ist wie folgt. Speichern Sie es im Verzeichnis 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;
   }
}

Lassen Sie uns nun die Datei C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ aktualisierenDataBeanList.java. Der Inhalt dieser Datei ist wie folgt:

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

In der Methode generate () in der obigen Datei legen wir die Liste von SubReportBean fest.

Schreiben wir nun eine neue Master-Berichtsvorlage (jasper_report_template.jrxml). Speichern Sie diese Datei im VerzeichnisC:\tools\jasperreports-5.0.1\test. Der Inhalt dieser Datei ist wie folgt:

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

In der obigen Vorlage haben wir einen neuen Parameter "SUBREPORT_DIR" definiert, der den Pfad des Unterberichts definiert. Wir haben ein Feld subReportBeanList vom Typ java.util.List definiert, das der Eigenschaft in der Datei DataBean entspricht. Das Element <Unterbericht> hat das Unterelement <DataSourceExpression>. Wir haben die Liste subReportBeanList in eine Instanz von JRBeanCollectionDataSource eingefügt. Im Unterelement <subreportExpression /> haben wir den Namen des Unterberichts (AddressReport.jasper) angegeben.

Jetzt schreiben wir eine neue Klasse CreateReportum unsere Berichtsvorlage zu kompilieren und auszuführen. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\CreateReport.java sind wie unten angegeben -

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!!! ...");
   }
}

Hier sehen wir, dass wir sowohl die Master- als auch die Unterberichtsvorlagen kompilieren und die Master-Berichtsdatei (.jasper) für die Berichtsfüllung übergeben.

Berichterstellung

Jetzt sind alle unsere Dateien fertig. Kompilieren Sie sie und führen Sie sie mit unserem regulären ANT-Erstellungsprozess aus. Der Inhalt der Datei build.xml (gespeichert im Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test) ist wie folgt.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup übernommen 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.CreateReport (viewFullReport ist das Standardziel) wie folgt:

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

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

Hier sehen wir, dass die Attribute Name, Land und Adresse angezeigt werden.

Frühere Benutzer mussten sich auf Scriptlets verlassen, um die Diagrammdaten zu erfassen und das Diagramm mithilfe eines Bildelements in der Berichtsvorlage zu rendern. JasperReports macht es jetzt einfach, da es eine integrierte Unterstützung für Diagramme mit der neuen Diagrammkomponente bietet.

Bei Verwendung einer neuen Diagrammkomponente muss der Benutzer nur die visuellen Einstellungen anwenden und Ausdrücke definieren, die beim Erstellen des Diagrammdatensatzes helfen. JasperReports verwendet JFreeChart als zugrunde liegende Diagrammbibliothek. Bei der Konfiguration einer neuen Diagrammkomponente sind die folgenden drei Komponenten beteiligt:

  • Die gesamte Diagrammkomponente.

  • Der Diagrammdatensatz (der die gruppendatenbezogenen Einstellungen gruppiert).

  • Das Diagrammdiagramm (das visuelle Einstellungen gruppiert, die sich auf die Art und Weise beziehen, wie die Diagrammelemente gerendert werden).

JasperReports unterstützt derzeit die folgenden Diagrammtypen: Kreis, Kreis 3D, Balken, Balken 3D, XY-Balken, Stapelbalken, Stapelbalken 3D, Linie, XY-Linie, Bereich, XY-Bereich, Stapelbereich, Streuung, Blase, Zeitreihe, Hoch -Niedrig-Öffnen-Schließen, Kerzenhalter, Mehrfachachse, Messgerät, Thermometer und Gantt.

Diagrammeigenschaften

Diagramme sind normale Berichtselemente, daher teilen sie einige ihrer Eigenschaften mit allen anderen Berichtselementen. Es gibt ein JRXML-Element namens <chart>, wird verwendet, um alle Arten von Diagrammen zu erstellen. Dieses Element gruppiert spezielle diagrammspezifische Einstellungen, die für alle Diagrammtypen gelten.

Diagramm-Unterelemente

Die Unterelemente des <chart> -Elements sind -

  • <reportElement> - Dies sind anzeigbare Objekte wie statische Texte, Textfelder, Bilder, Linien und Rechtecke, die Sie in Ihre Berichtsvorlagenabschnitte einfügen.

  • <Box> - Dieses Element wird verwendet, um Diagramme mit einem Rand zu umgeben, der auf jeder Seite anpassbar ist.

  • <chartTitle>- Mit diesem Element wird der Titel des Diagramms platziert. Das Positionsattribut bestimmt die Titelposition des Diagramms im Bericht. Dieses Element hat Attribute -Position(Werte können oben , unten , links , rechts sein . Deafult-Wert ist oben ),color. <chartTitle> hat Schriftart und titleExpression als Unterelemente.

  • <chartSubtitle>- Mit diesem Element wird der Untertitel des Diagramms platziert. Dieses Element hat das Attribut -color. <chartSubtitle> hat Schriftart und Untertitelausdruck als Unterelemente.

  • <chartLegend>- Mit diesem Element kann das Element die schriftartenbezogenen Eigenschaften sowie die Textfarbe und die Hintergrundfarbe der Diagrammlegende steuern. Dieses Element hat Attribute -textColor und backgroundColor.

  • <anchorNameExpression> - Dieses Element erstellt das Ziel für den Anker.

  • <hyperlinkReferenceExpression> - Dieses Element enthält einen Berichtsausdruck, der den Namen der externen Ressource angibt (normalerweise eine URL).

  • <hyperlinkAnchorExpression> - Hyperlink verweist auf einen Anker in einer externen Ressource.

  • <hyperlinkPageExpression> - Der Hyperlink verweist auf eine Seite im aktuellen Bericht.

  • <hyperlinkTooltipExpression>- Dieses Element steuert den ToolTip des Hyperlinks. Der Typ des Ausdrucks sollte java.lang.String sein .

  • <hyperlinkParameter> - Wenn dieses Element vorhanden ist, wird abhängig von den Parameterwerten ein endgültiger Hyperlink generiert.

Diagrammattribute

Attribute im <chart> -Element, die für alle Diagrammtypen verfügbar sind, sind -

  • isShowLegend- Mit diesem Attribut wird festgelegt, ob eine Diagrammlegende im Bericht angezeigt wird. Werte können wahr oder falsch sein . Der Standardwert ist true .

  • evaluationTime- Legt fest, wann der Ausdruck des Diagramms ausgewertet wird. Die Werte können Jetzt , Bericht , Seite , Spalte , Gruppe , Band sein . Der Standardwert ist Jetzt .

  • evaluationGroup- Dieses Attribut bestimmt den Namen der Gruppe, die zur Auswertung der Diagrammausdrücke verwendet werden soll. Der Wert für dieses Attribut muss mit dem Namen der Gruppe übereinstimmen, die wir als Bewertungsgruppe für das Diagramm verwenden möchten.

  • hyperlinkType- Dieses Attribut kann einen beliebigen Textwert enthalten. Der Standardwert ist Keine . Dies bedeutet, dass weder die Textfelder noch die Bilder Hyperlinks darstellen, selbst wenn die speziellen Hyperlinkausdrücke vorhanden sind.

  • hyperlinkTarget- Mit diesem Attribut können Sie das Verhalten des angegebenen Links anpassen, wenn Sie im Viewer darauf klicken. Werte können Selbst oder Leer sein . Der Standardwert ist Self .

  • bookmarkLevel- Wenn dieses Attribut auf eine positive Ganzzahl gesetzt wird, werden Lesezeichen in den in PDF exportierten Berichten generiert. Der Standardwert ist 0 .

  • customizerClass- Dies ist der Name einer Klasse (optional), mit der das Diagramm angepasst werden kann. Der Wert für dieses Element muss eine Zeichenfolge sein, die den Namen einer Customizer-Klasse enthält.

Diagrammanpassung

Wie oben erwähnt, verwendet JasperReports JFreeChart als zugrunde liegende Diagrammbibliothek. JFreeChart enthält Funktionen, die von JasperReports direkt nicht unterstützt werden. Wir können diese Funktionen nutzen, indem wir eine Customizer-Klasse über das customizerClass- Attribut im <chart> -Element bereitstellen. Eine Customizer-Klasse ist nichts anderes als eine Implementierung der Schnittstelle net.sf.jasperreports.engine.JRChartCustomizer . Die einfachste Möglichkeit, diese Schnittstelle zu implementieren, besteht darin, die Klasse net.sf.jasperreports.engine.JRAbstractChartCustomizer zu erweitern und somit auf Parameter, Felder und Variablen zuzugreifen, um die Diagrammanpassung basierend auf Berichtsdaten flexibler anzupassen.

Diagrammdatensätze

Eine der gemeinsamen Eigenschaften aller Diagrammtypen ist <dataset> Element. Diagrammdatensätze helfen beim Zuordnen von Berichtsdaten und beim Abrufen von Diagrammdaten zur Laufzeit. Jeder Diagrammtyp enthält verschiedene Unterelemente, um die Ausdrücke des Diagramms zu definieren. Diese Ausdrücke definieren die Daten, die zum Generieren des Diagramms verwendet werden. Alle diese Unterelemente enthalten ein <dataset> -Element, das definiert, wann die Ausdrücke des Diagramms ausgewertet und zurückgesetzt werden.

In JasperReports stehen verschiedene Arten von Diagrammdatensätzen zur Verfügung, da jeder Diagrammtyp mit bestimmten Datensätzen funktioniert: Kreis, Kategorie, XY, Zeitreihen, Zeitraum, XYZ und Hoch-Niedrig. Jeder dieser Dataset-Typen implementiert die Schnittstelle net.sf.jasperreports.engine.JRChartDataset , die Diagramm-Datasets definiert. Alle Diagrammdatensätze werden auf dieselbe Weise initialisiert und inkrementiert. Sie unterscheiden sich jedoch nur in der Art der Daten oder Datenreihen, die sie abbilden.

Datensatz-Eigenschaften

Die folgende Tabelle fasst die Attribute des Elements <Datensatz> - zusammen.

Attribut Beschreibung Werte
resetType Dieses Attribut bestimmt, wann der Wert des Diagrammausdrucks zurückgesetzt werden soll. Keine, Bericht, Seite, Spalte, Gruppe. Standardwert istReport.
resetGroup Dieses Attribut bestimmt den Namen der Gruppe, bei der der Diagrammausdruckswert zurückgesetzt wird. Der Wert für dieses Attribut muss mit dem Namen einer in der JRXML-Berichtsvorlage deklarierten Gruppe übereinstimmen.
incrementType Dieses Attribut bestimmt, wann der Wert des Diagrammausdrucks neu berechnet werden soll. Keine, Bericht, Seite, Spalte, Gruppe. Standardwert ist"None".
incrementGroup Dieses Attribut bestimmt den Namen der Gruppe, in der der Diagrammausdruck neu berechnet wird. Der Wert für dieses Attribut muss mit dem Namen einer Gruppe übereinstimmen, die in der JRXML-Berichtsvorlage deklariert ist.

In der folgenden Tabelle sind die Unterelemente des Elements <Datensatz> zusammengefasst.

Unterelement Beschreibung
<incrementWhenExpression> Die Art und Weise, wie ein Diagrammdatensatz inkrementiert wird, kann angepasst werden, indem unerwünschte Daten mithilfe dieses Unterelements herausgefiltert werden.
<datasetRun> Diese enthält Informationen, die zum Instanziieren eines Berichtsunterdatensatzes erforderlich sind.

Datensatztypen

Bestimmte Datensatztypen werden nachfolgend erläutert -

Torten-Datensatz

Ein Tortendatensatz ist durch die folgenden Ausdrücke gekennzeichnet:

  • <keyExpression> - repräsentiert die Kategorien, aus denen die Slices im Kreisdiagramm bestehen. Dieser Ausdruck kann jedes java.lang.Comparable-Objekt zurückgeben.

  • <valueExpression> - Erzeugt die Werte, die jeder Kategorie / jedem Schlüssel im Dataset entsprechen. Werte sind immer java.lang.Number-Objekte.

  • <labelExpression> - Wenn dieser Ausdruck fehlt, werden im Diagramm Standardbeschriftungen für jedes Slice im Kreisdiagramm angezeigt. Verwenden Sie diesen Ausdruck, der java.lang.String-Werte zurückgibt, um die Elementbeschriftungen für das Kreisdiagramm anzupassen.

  • <sectionHyperlink> - Legt Hyperlinks fest, die den Kreisabschnitten zugeordnet sind.

Kategoriedatensatz

Ein Kategoriedatensatz ist durch das Element <categorySeries> gekennzeichnet, das - enthält

  • <seriesExpression> - Gibt den Namen der Serie an. Dieser Ausdruck kann jedes java.lang.Comparable-Objekt zurückgeben.

  • <categoryExpression> - Gibt den Namen der Kategorie für jeden Wert innerhalb der durch den Serienausdruck angegebenen Reihe zurück. Kategorien sind java.lang.Comparable-Objekte.

  • <valueExpression> - Erzeugt die Werte, die jeder Kategorie im Dataset entsprechen. Werte sind immer java.lang.Number-Objekte.

  • <labelExpression> - Wenn dieser Ausdruck fehlt, werden im Diagramm Standardbezeichnungen für jedes Element im Diagramm angezeigt. Verwenden Sie diesen Ausdruck, der java.lang.String-Werte zurückgibt, um die Elementbezeichnungen für das Diagramm anzupassen.

  • <itemHyperlink> - Legt Hyperlinks fest, die Diagrammelementen zugeordnet sind.

XY-Datensatz

Ein XY-Datensatz ist durch das Element <xySeries> gekennzeichnet, das - enthält

  • <seriesExpression> - Gibt den Namen der Serie an. Dieser Ausdruck kann jedes java.lang.Comparable-Objekt zurückgeben.

  • <xValueExpression> - Gibt den Wert java.lang.Number zurück, der den X-Wert aus dem (x, y) -Paar darstellt, das der aktuellen Datenreihe hinzugefügt wird.

  • <yValueExpression> - Gibt den Wert java.lang.Number zurück, der den Y-Wert aus dem (x, y) -Paar darstellt, das der aktuellen Datenreihe hinzugefügt wird.

  • <labelExpression> - Wenn dieser Ausdruck fehlt, werden im Diagramm Standardbezeichnungen für jedes Element im Diagramm angezeigt. Verwenden Sie diesen Ausdruck, der java.lang.String-Werte zurückgibt, um die Elementbezeichnungen für das Diagramm anzupassen.

  • <itemHyperlink> - Legt Hyperlinks fest, die den Diagrammelementen zugeordnet sind.

XYZ-Datensatz

Ein XYZ-Dataset ist durch das <xyzSeries> -Element gekennzeichnet, das - enthält

  • <seriesExpression> - Gibt den Namen der Serie an. Dieser Ausdruck kann jedes java.lang.Comparable-Objekt zurückgeben.

  • <xValueExpression> - Gibt den Wert java.lang.Number zurück, der den X-Wert aus dem Element (x, y, z) darstellt, das der aktuellen Datenreihe hinzugefügt wird.

  • <yValueExpression> - Gibt den Wert java.lang.Number zurück, der den Y-Wert aus dem Element (x, y, z) darstellt, das der aktuellen Datenreihe hinzugefügt wird.

  • <zValueExpression> - Gibt den Wert java.lang.Number zurück, der den Z-Wert aus dem Element (x, y, z) darstellt, das der aktuellen Datenreihe hinzugefügt wird.

  • <labelExpression> - Wenn dieser Ausdruck fehlt, werden im Diagramm Standardbezeichnungen für jedes Element im Diagramm angezeigt. Verwenden Sie diesen Ausdruck, der java.lang.String-Werte zurückgibt, um die Elementbezeichnungen für das Diagramm anzupassen.

  • <itemHyperlink> - Legt Hyperlinks fest, die den Diagrammelementen zugeordnet sind.

Zeitreihendatensatz

Ein Zeitreihendatensatz ist durch das Attribut timePeriod und das Element <timeSeries> gekennzeichnet. Das Attribut timePeriod gibt den Typ der Datenreihe innerhalb des Datasets an. Zeitreihen können numerische Werte enthalten, die Tagen, Monaten, Jahren oder anderen vordefinierten Zeiträumen zugeordnet sind. Mögliche Werte sind: Jahr, Quartal, Monat, Woche, Tag - dies ist der Standardwert, Stunde, Minute, Sekunde, Millisekunde.

Das <timeSeries> -Element enthält -

  • <seriesExpression> - Gibt den Namen der Serie an. Dieser Ausdruck kann jedes java.lang.Comparable-Objekt zurückgeben.

  • <timePeriodExpression> - Gibt einen java.util.Date-Wert zurück, aus dem die Engine den entsprechenden Zeitraum in Abhängigkeit von dem für das oben erwähnte timePeriod-Attribut festgelegten Wert extrahiert.

  • <valueExpression> - Gibt den Wert java.lang.Number zurück, der beim Erhöhen der aktuellen Serie des Datasets dem entsprechenden Zeitraumwert zugeordnet werden soll.

  • <labelExpression> - Wenn dieser Ausdruck fehlt, werden im Diagramm Standardbezeichnungen für jedes Element im Diagramm angezeigt. Verwenden Sie diesen Ausdruck, der java.lang.String-Werte zurückgibt, um die Elementbezeichnungen für das Diagramm anzupassen.

  • <itemHyperlink> - Legt Hyperlinks fest, die den Diagrammelementen zugeordnet sind.

Zeitraum Datensatz

Ein Zeitraumdatensatz ist durch das Element <timePeriodSeries> gekennzeichnet, das - enthält

  • <seriesExpression> - Gibt den Namen der Serie an. Dieser Ausdruck kann jedes java.lang.Comparable-Objekt zurückgeben.

  • <startDateExpression> - Gibt den Beginn des Datumsintervalls an, dem der numerische Wert zugeordnet wird, wenn er zur Zeitreihenreihe hinzugefügt wird.

  • <endDateExpression> - Gibt das Ende des Datumsintervalls an, dem der numerische Wert zugeordnet wird, wenn er zur Zeitreihenreihe hinzugefügt wird.

  • <valueExpression> - Gibt den Wert java.lang.Number zurück, der dem aktuellen Datumsintervall zugeordnet werden soll, das durch die Ausdrücke für Startdatum und Enddatum angegeben wird.

  • <labelExpression> - Wenn dieser Ausdruck fehlt, werden im Diagramm Standardbezeichnungen für jedes Element im Diagramm angezeigt. Verwenden Sie diesen Ausdruck, der java.lang.String-Werte zurückgibt, um die Elementbezeichnungen für das Diagramm anzupassen.

  • <itemHyperlink> - Legt Hyperlinks fest, die den Diagrammelementen zugeordnet sind.

High Low Dataset

Ein High-Low-Datensatz ist durch die folgenden Ausdrücke gekennzeichnet:

  • <seriesExpression> - Derzeit wird nur eine Serie in einem High-Low- oder Candlestick-Diagramm unterstützt. Diese einzelne Serie muss jedoch durch einen java.lang.Comparable-Wert identifiziert werden, der von diesem Ausdruck zurückgegeben wird, und sie muss auch als Serienname in der Legende des Diagramms verwendet werden.

  • <dateExpression> - Gibt das Datum zurück, auf das sich das aktuelle Element (High, Low, Open, Close, Volume) bezieht.

  • <highExpression> - gibt einen java.lang.Number-Wert zurück, der Teil des Datenelements ist, das der Serie hinzugefügt wird, wenn das Dataset inkrementiert wird.

  • <lowExpression> - Gibt einen java.lang.Number-Wert zurück, der Teil des Datenelements ist, das der Serie hinzugefügt wird, wenn das Dataset inkrementiert wird.

  • <openExpression> - Gibt einen java.lang.Number-Wert zurück, der Teil des Datenelements ist, das der Serie hinzugefügt wird, wenn das Dataset inkrementiert wird.

  • <closeExpression> - gibt einen java.lang.Number-Wert zurück, der Teil des Datenelements ist, das der Serie hinzugefügt wird, wenn das Dataset inkrementiert wird.

  • <volumeExpression> - Ein numerischer Ausdruck, der den für das aktuelle Datenelement zu verwendenden Volume-Wert zurückgibt. Es wird nur für Candlestick-Diagramme verwendet.

  • <itemHyperlink> - Legt Hyperlinks fest, die den Diagrammelementen zugeordnet sind.

Wertedatensatz

Dies ist eine spezielle Implementierung eines Diagrammdatensatzes, die einen einzelnen Wert enthält und zum Rendern von Mess- und Thermometerdiagrammen verwendet wird. Der Wert wird mit dem Ausdruck <valueExpression> erfasst.

Diagrammdiagramme

Ein weiteres gemeinsames JRXML-Element für alle Diagrammtypen ist das <plot> Element. Auf diese Weise können wir verschiedene Merkmale des Diagramms wie Ausrichtung und Hintergrundfarbe definieren. Die Diagramme unterscheiden sich je nach Diagrammtyp.

Plot-Attribut

Die folgende Tabelle fasst die Attribute des <plot> -Elements zusammen -

Attribut Beschreibung Werte
Hintergrundfarbe Dieses Attribut definiert die Hintergrundfarbe des Diagramms. Jeder sechsstellige Hexadezimalwert ist ein gültiger Wert für dieses Attribut. Vor dem Hexadezimalwert muss ein # stehen.
Orientierung Dieses Attribut definiert die Ausrichtung des Diagramms. Horizontal, vertikal Der Standardwert ist "Vertikal".
HintergrundAlpha Dieses Attribut definiert die Transparenz der Hintergrundfarbe des Diagramms. Die gültigen Werte für dieses Attribut enthalten eine beliebige Dezimalzahl zwischen 0 und 1 einschließlich. Je höher die Zahl, desto weniger transparent ist der Hintergrund. Der Standardwert ist "1".
VordergrundAlpha Dieses Attribut definiert die Transparenz der Vordergrundfarben des Diagramms. Die gültigen Werte für dieses Attribut enthalten eine beliebige Dezimalzahl zwischen 0 und 1 einschließlich. Je höher die Zahl, desto weniger transparent ist der Hintergrund. Der Standardwert ist "1".
labelRotation Dieses Attribut ermöglicht das Drehen von Textbeschriftungen auf der x-Achse im oder gegen den Uhrzeigersinn. Dieses Attribut gilt nur für Diagramme, für die die x-Achse nicht numerisch ist oder keine Daten anzeigt. Der Standardwert ist "0.0".

Das <plot> -Element hat ein Unterelement <seriesColor>, dessen Attribute sind: seriesOrder und color . Dieses Element passt Farben für Serien und ihre Position innerhalb der Farbsequenz an.

Spezifische Einstellungen für Diagrammdiagramme

  • piePlot - Es hat keine spezifischen Einstellungen

  • pie3DPlot- Enthält das Attribut depthFactor , einen numerischen Wert zwischen 0 und 1, der die Tiefe des Kreises als Prozentsatz der Höhe des Plotbereichs darstellt .

  • barPlot - Sie können Häkchenbeschriftungen, Häkchen oder Elementbeschriftungen ein- oder ausblenden und stellen Einstellungen für beide Achsen bereit.

  • bar3DPlot - Bietet dieselben Einstellungen wie barPlot und generiert mithilfe der Attribute xOffset und yOffset einen 3D-Effekt.

  • linePlot - Sie können Linien anzeigen oder ausblenden, die Elementpunkte verbinden, Formen anzeigen oder ausblenden, die Elementpunkten zugeordnet sind, und Einstellungen für beide Achsen bereitstellen.

  • scatterPlot - Ähnlich wie beim linePlot können Linien, die Elementpunkte verbinden, ein- oder ausgeblendet, Formen angezeigt oder ausgeblendet werden, die Elementpunkten zugeordnet sind, und es werden Einstellungen für beide Achsen bereitgestellt.

  • areaPlot - Bietet Einstellungen für beide Achsen.

  • bubblePlot - Sie können die Blasenabmessungen durch Festlegen des Attributs scaleType festlegen und Einstellungen für beide Achsen bereitstellen.

  • timeSeriesPlot - Sie können Linien anzeigen oder ausblenden, die Elementpunkte verbinden, Formen anzeigen oder ausblenden, die Elementpunkten zugeordnet sind, und Einstellungen für beide Achsen bereitstellen.

  • highLowPlot - Sie können offene Ticks ein- oder ausblenden, geschlossene Ticks ein- oder ausblenden und Einstellungen für beide Achsen vornehmen.

  • candlestickPlot - Man kann die Lautstärke ein- oder ausblenden und stellt Einstellungen für beide Achsen bereit.

  • meterPlot - Enthält spezifische Einstellungen für Zifferblattform, Skalierungswinkel, Maßeinheiten, Tickintervall, Zifferblattfarbe, Nadelfarbe, Tickfarbe, Wertanzeigeschriftart, Farb- und Formatmuster, Datenbereich und Messintervalle.

  • thermometerPlot - Enthält spezifische Einstellungen für den Werteort, die Quecksilberfarbe, die Wertlinien zum Ein- und Ausblenden, die Schriftart der Wertanzeige, das Farb- und Formatmuster, den Datenbereich, den unteren Bereich, den mittleren Bereich und den hohen Bereich.

  • multiAxisChart - Enthält spezifische Einstellungen für die im Diagramm enthaltene Achse.

Arten von Diagrammen

JasperReports bietet integrierte Unterstützung für verschiedene Diagrammtypen. Sie sind wie folgt aufgeführt -

  • pieChart - Eine Kombination aus einem Kreisdatensatz und einem Kreisdiagramm.

  • pie3DChart - Gruppiert einen Pie-Datensatz und ein Pie-3D-Diagramm.

  • barChart - Eine grundlegende Kombination aus einem Kategoriedatensatz und einem Balkendiagramm.

  • bar3DChart - Umschließt ein Kategoriedatensatz und ein 3D-Balkendiagramm.

  • xyBarChart - Unterstützt Zeitperiodendatensätze, Zeitreihendatensätze und XY-Datensätze und verwendet ein Balkendiagramm zum Rendern der Achse und der Elemente.

  • stackedBarChart - Verwendet Daten aus einem Kategoriedatensatz und rendert dessen Inhalt mithilfe eines Balkendiagramms.

  • stackedBar3DChart - Verwendet Daten aus einem Kategoriedatensatz und rendert dessen Inhalt mithilfe eines 3D-Balkendiagramms.

  • lineChart - Gruppiert einen Kategoriedatensatz und ein Liniendiagramm.

  • xyLineChart - Gruppiert einen XY-Datensatz und ein Liniendiagramm.

  • areaChart - Elemente aus einem Kategoriedatensatz werden mithilfe eines Flächendiagramms gerendert.

  • stackedAreaChart - Elemente aus einem Kategoriedatensatz werden mithilfe eines Flächendiagramms gerendert.

  • xyAreaChart - Verwendet Daten aus einem XY-Datensatz und rendert sie über ein Flächendiagramm.

  • scatterChart - Umschließt einen XY-Datensatz mit einem Streudiagramm.

  • bubbleChart - Kombiniert einen XYZ-Datensatz mit einem Bubble-Plot.

  • timeSeriesChart - Gruppiert einen Zeitreihendatensatz und ein Zeitreihendiagramm.

  • highLowChart - Eine Kombination aus einem High-Low-Datensatz und einem High-Low-Diagramm.

  • candlestickChart - Verwendet Daten aus einem High-Low-Datensatz, jedoch mit einem speziellen Candlestick-Diagramm.

  • meterChart - Zeigt einen einzelnen Wert aus einem Wertedatensatz auf einem Zifferblatt an, wobei Renderoptionen aus einem Meter-Diagramm verwendet werden.

  • thermometerChart - Zeigt den Einzelwert in einem Wertedatensatz mithilfe von Renderoptionen aus einem Thermometerdiagramm an.

  • multiAxisChart - Enthält mehrere Bereichsachsen, die sich alle eine gemeinsame Domänenachse teilen.

Beispiel

Um die Diagramme zu demonstrieren, schreiben wir eine neue Berichtsvorlage (jasper_report_template.jrxml). Hier fügen wir das <hinzubarChart> Element zum Abschnitt <pageHeader> und <pieChart> zum Abschnitt <Zusammenfassung>. Wir würden die für jedes Thema erhaltenen Noten in Diagrammen anzeigen. Speichern Sie es im VerzeichnisC:\tools\jasperreports-5.0.1\test. Der Inhalt der Datei ist wie folgt:

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

Die Details der obigen Datei sind wie folgt:

  • Das JRXML-Element, das zum Erstellen eines Balkendiagramms verwendet wird, ist </ barChart> im <pageHeader>. Es enthält ein </ chart> -Unterelement, das ein <reportElement> -Unterelement enthält, das die Abmessungen und die Position des Diagramms definiert.

  • Das <dataset> -Element in einem Balkendiagramm muss zwischen den JRXML-Elementen <categoryDataset> und </ categoryDataset> eingeschlossen sein.

  • <categoryDataset> muss ein <categorySeries> -Element enthalten. Dieses Element definiert, welches Datenelement die Balken darstellen (in diesem Beispiel Betreffnamen).

  • <categoryDataset> muss auch ein Element enthalten, das definiert, wie die Daten zum Vergleich in Kategorien unterteilt werden. Hier werden Daten durch Betreffnamen getrennt.

  • Das <valueExpression> -Element definiert, mit welchem ​​Ausdruck der Wert jedes Balkens im Diagramm bestimmt wird. Hier verwenden wir "Marken".

  • Für das Kreisdiagramm haben wir das Element <pieChart> im Abschnitt <summary> verwendet. Es enthält ein </ chart> -Unterelement.

  • Das Unterelement enthält einen Berichtsausdruck, der angibt, was als Schlüssel im Diagramm verwendet werden soll. Hier haben wir subjectName verwendet.

  • Das Unterelement enthält einen Ausdruck, mit dem der Wert für den Schlüssel berechnet wird. Hier haben wir Marken verwendet.

Die Java-Codes für das Ausfüllen von Berichten bleiben unverändert. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sind wie unten angegeben -

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

Da wir die für jedes Thema erzielten Noten anzeigen würden, muss POJO geändert werden. Die DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java Inhalt sind wie unten angegeben -

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

}

Sogar der Inhalt der Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java müssen wie unten angegeben aktualisiert werden -

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

Berichterstellung

Als nächstes kompilieren wir die obigen Dateien und führen sie mit unserem regulären ANT-Erstellungsprozess aus. Der Inhalt der Datei build.xml (gespeichert im Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test) ist wie folgt.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup übernommen 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) wie folgt:

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

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

Hier sehen wir, dass das Balkendiagramm im Pageheader und das Kreisdiagramm in den Zusammenfassungsabschnitten erstellt werden.

Kreuztabellenberichte (Kreuztabellenberichte) sind Berichte, die Tabellen enthalten, die Daten in Tabellenform über Zeilen und Spalten hinweg anordnen. Das Kreuztabellenobjekt wird zum Einfügen eines Kreuztabellenberichts in den Hauptbericht verwendet. Kreuztabellen können mit jeder Datenebene (nominal, ordinal, Intervall oder Verhältnis) verwendet werden und zeigen normalerweise die in den Berichtsvariablen enthaltenen zusammengefassten Daten in Form einer dynamischen Tabelle an. Variablen werden verwendet, um aggregierte Daten wie Summen, Zählungen und Durchschnittswerte anzuzeigen.

Kreuztabelleneigenschaften

JRXML-Element <crosstab> wird verwendet, um eine Kreuztabelle in einen Bericht einzufügen.

Attribut

Es folgt eine Liste der Attribute eines <crosstab> Element -

  • isRepeatColumnHeaders- Gibt an, ob die Spaltenüberschriften nach einem Seitenumbruch erneut gedruckt werden sollen. Der Standardwert ist true .

  • isRepeatRowHeaders- Gibt an, ob die Zeilenüberschriften nach einem Kreuztabellen-Spaltenumbruch erneut gedruckt werden sollen. Der Standardwert ist true .

  • columnBreakOffset- Wenn ein Spaltenumbruch auftritt, wird der in Pixel gemessene vertikale Abstand vor dem nachfolgenden Kreuztabellenstück angegeben, das unter dem vorherigen auf derselben Seite platziert werden soll. Der Standardwert ist 10.

  • runDirection- Gibt an, ob die Kreuztabellendaten von links nach rechts (LTR) oder von rechts nach links (RTL) gefüllt werden sollen. Der Standardwert ist LTR.

  • ignoreWidth- Gibt an, ob die Kreuztabelle die anfängliche Breite der Kreuztabellenbreite überschreitet und keine Spaltenumbrüche generiert. Andernfalls wird das Rendern von Spalten innerhalb der Grenzwerte für die Kreuztabellenbreite beendet und die verbleibenden Spalten werden erst fortgesetzt, nachdem alle Zeilen mit dem Rendern begonnen haben. Der Standardwert ist false .

Unterelemente

Ein <crosstab> -Element hat folgende Unterelemente:

  • <reportElement>- Dieses Element definiert die Position, Breite und Höhe der Kreuztabelle innerhalb ihrer Umschließung. Zu den Attributen für dieses Element gehören alle Standardattribute <reportElement>.

  • <crosstabParameter>- Mit diesem Element können Sie über die Kreuztabelle auf Berichtsvariablen und -parameter zugreifen. Zu den Attributen für dieses Element gehören -

    • name - Definiert den Parameternamen.

    • Klasse - Dies gibt die Parameterklasse an.

  • <parametersMapExpression>- Dieses Element wird verwendet, um eine Berichtsvariable oder einen Parameter mit einer Instanz von java.util.Map als Parametersatz für die Kreuztabelle zu übergeben. Dieses Element enthält keine Attribute.

  • <crosstabDataset>- Dieses Element definiert das Dataset, das zum Auffüllen der Kreuztabelle verwendet werden soll (eine ausführliche Erläuterung finden Sie im nächsten Abschnitt). Zu den Attributen für dieses Element gehören -

    • isDataPreSorted - Gibt an, ob die Daten im Dataset vorsortiert sind. Der Standardwert ist false .

  • <crosstabHeaderCell>- Dieses Element definiert den Inhalt des Bereichs in der oberen linken Ecke der Kreuztabelle, in dem sich Spalten- und Zeilenüberschriften treffen. Die Größe dieser Zelle wird automatisch anhand der definierten Zeilen- und Spaltenbreiten und -höhen berechnet.

  • <rowGroup>- Dieses Element definiert eine Gruppe, mit der die Daten in Zeilen aufgeteilt werden. Zu den Attributen für dieses Element gehören -

    • name - Definiert den Namen der Zeilengruppe.

    • width - Definiert die Breite der Zeilengruppe.

    • headerPosition - Definiert die Position des Header-Inhalts (oben, Mitte, unten, Stretch).

    • totalPosition - Definiert die Position der gesamten Spalte (Start, Ende, Keine).

    Dieses Element enthält die folgenden Unterelemente:

    • <bucket>

    • <crosstabRowHeader>

    • <crosstabTotalRowHeader>

  • <columnGroup>- Dieses Element definiert eine Gruppe, mit der die Daten in Spalten aufgeteilt werden. Zu den Attributen für dieses Element gehören -

    • name - Definiert den Namen der Spaltengruppe.

    • height - Dies definiert die Höhe des Spaltengruppen-Headers.

    • headerPosition - Definiert die Position des Header-Inhalts ( rechts, links, Mitte, Dehnung ).

    • totalPosition - Definiert die Position der gesamten Spalte ( Start, Ende, Keine ).

    Dieses Element enthält die folgenden Unterelemente:

    • <bucket>

    • <crosstabColumnHeader>

    • <crosstabTotalColumnHeader>

  • <measure>- Dieses Element definiert die Berechnung, die zeilen- und spaltenübergreifend durchgeführt werden soll. Zu den Attributen für dieses Element gehören -

    • name - Definiert den Namen der Kennzahl.

    • Klasse - Dies gibt die Kennzahlklasse an.

    • Berechnung - Dies gibt die Berechnung an, die zwischen Kreuztabellenzellenwerten durchgeführt werden soll. Die Werte können beliebig sein: Nothing, Count, DistinctCount, Sum, Average, Lowest, Highest, StandardDeviation, Varianz und First . Standardwert istNothing.

  • <crosstabCell>- Dieses Element definiert, wie Daten in Nicht-Header-Zellen angeordnet werden. Zu den Attributen für dieses Element gehören -

    • columnTotalGroup - Gibt die Gruppe an, die zur Berechnung der Spaltensumme verwendet werden soll.

    • Höhe - Dies definiert die Höhe der Zelle.

    • rowTotalGroup - Dies gibt die Gruppe an, die zur Berechnung der Zeilensumme verwendet werden soll.

    • width - Dies definiert die Breite der Zelle.

  • <whenNoDataCell>- Dieses Element definiert, was in einer leeren Kreuztabellenzelle angezeigt werden soll. Dieses Element enthält keine Attribute.

Datengruppierung in Kreuztabelle

Die Kreuztabellenberechnungs-Engine aggregiert Daten, indem sie die zugehörigen Dataset-Datensätze durchläuft. Um Daten zu aggregieren, müssen sie zuerst gruppiert werden. In einer Kreuztabelle basieren Zeilen und Spalten auf bestimmten Gruppenelementen, die aufgerufen werdenbuckets. Eine Bucket-Definition sollte enthalten -

  • BucketExpression - Der Ausdruck, der ausgewertet werden soll, um Datengruppenelemente abzurufen .

  • compareatorExpression - Wird benötigt, wenn die natürliche Reihenfolge der Werte nicht die beste Wahl ist.

  • orderByExpression - Gibt den Wert an, der zum Sortieren von Daten verwendet wird.

Zeilen- und Spaltengruppen (oben definiert) in einer Kreuztabelle sind abhängig von buckets.

Integrierte Kreuztabellen-Gesamtvariablen

Nachfolgend finden Sie eine Liste des aktuellen Messwerts und der Summen verschiedener Ebenen, die der Zelle entsprechen. Über Variablen, die nach dem folgenden Schema benannt wurden, kann auf sie zugegriffen werden:

  • Der aktuelle Wert einer Kennzahlberechnung wird in einer Variablen mit demselben Namen wie die Kennzahl gespeichert.

  • <Maßnahme> _ <Spaltengruppe> _ALL - Dies ergibt die Summe aller Einträge in der Spaltengruppe aus derselben Zeile.

  • <Maßnahme> _ <Zeilengruppe> _ALL - Dies ergibt die Summe aller Einträge in der Zeilengruppe aus derselben Spalte.

  • <Maßnahme> _ <Zeilengruppe> _ <Spaltengruppe> _ALL - Dies ergibt die Gesamtsumme, die allen Einträgen in Zeilen- und Spaltengruppen entspricht.

Beispiel

Um die Kreuztabellen zu demonstrieren, schreiben wir eine neue Berichtsvorlage (jasper_report_template.jrxml). Hier fügen wir die Kreuztabelle zum Zusammenfassungsabschnitt hinzu. Speichern Sie es im VerzeichnisC:\tools\jasperreports-5.0.1\test. Der Inhalt der Datei ist wie folgt:

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

Die Details der obigen Datei sind wie folgt:

  • Kreuztabelle wird durch das Element <kreuztabelle> definiert.

  • Das Element <rowGroup> definiert eine Gruppe, um die Daten in Zeilen aufzuteilen. Hier werden in jeder Zeile Daten für einen anderen Namen angezeigt.

  • Die Elemente <bucket> und <bucketExpression> definieren, welcher Berichtsausdruck als Gruppenbegrenzer für <rowGroup> verwendet werden soll. Hier haben wir das Namensfeld als Trennzeichen verwendet, um die Zeilen nach Namen aufzuteilen.

  • Das Element <crosstabRowHeader> definiert den Ausdruck, der als Zeilenkopf verwendet werden soll. Es enthält ein einzelnes Unterelement, nämlich <cellContents>, das sich wie ein inneres Band innerhalb der Kreuztabelle verhält. Anstatt den Variablennamen für das Textfeld in <crosstabRowHeader> zu definieren, haben wir <rowGroup> den Namen zugewiesen (über sein Namensattribut), sodass eine implizite Variable erstellt wird. Das Element <crosstabRowHeader> definiert den Inhalt der Kopfzelle für die gesamte Zeile. Es wird ein einzelnes <cellContents> -Element als einziges Unterelement verwendet.

  • Das <columnGroup> -Element sowie seine Unterelemente sind analog zum <rowGroup> -Element, außer dass es Spalten anstelle von Zeilen beeinflusst.

  • Das <measure> -Element definiert die Berechnung, die über Zeilen und Spalten hinweg ausgeführt werden soll. Das Berechnungsattribut wird auf Count gesetzt .

  • Das <crosstabCell> -Element definiert, wie Daten in Nicht-Header-Zellen angeordnet werden. Dieses Element enthält auch ein einzelnes <crosstabCell> -Element als einziges Unterelement.

Die Java-Codes für das Ausfüllen von Berichten bleiben unverändert. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sind wie unten angegeben -

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

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

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

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

Berichterstellung

Als nächstes kompilieren wir die obigen Dateien und führen sie mit unserem regulären ANT-Erstellungsprozess aus. Der Inhalt der Datei build.xml (gespeichert im Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test) ist wie folgt.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup übernommen 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) wie folgt:

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

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

Hier sehen wir, dass jedes Land und jeder Name tabellarisch aufgeführt sind.

Manchmal brauchen wir Berichte in verschiedenen Sprachen. Das Schreiben des gleichen Berichts für jede Sprache erfordert viel redundante Arbeit. Nur von Sprache zu Sprache unterschiedliche Textteile sollten separat geschrieben und je nach Gebietsschemaeinstellungen zur Laufzeit in Textelemente geladen werden. Dies ist der Zweck des Berichts Internationalisierung. Einmal verfasste internationalisierte Berichte können überall ausgeführt werden.

In den folgenden Schritten haben wir aufgeführt, wie ein Bericht in verschiedenen Sprachen erstellt wird, sowie einige andere Funktionen der Internationalisierung von Berichten:

  • Verknüpfen Sie der Berichtsvorlage ein Ressourcenpaket java.util.ResourceBundle . Es gibt zwei Möglichkeiten, das Objekt java.util.ResourceBundle der Berichtsvorlage zuzuordnen.

    • Zur Entwurfszeit können Sie das resourceBundle- Attribut des Berichtsvorlagenobjekts auf den Basisnamen des Zielressourcenpakets setzen.

    • Eine dynamische / Laufzeitzuordnung kann hergestellt werden, indem ein java.util.ResourceBundle- Objekt als Wert für den Parameter REPORT_RESOURCE_BUNDLE zum Zeitpunkt des Ausfüllens des Berichts angegeben wird.

    • Wenn der Bericht in einem anderen Gebietsschema als dem aktuellen erstellt werden muss, kann der integrierte Laufzeitschema beim Ausfüllen des Berichts mit dem integrierten Parameter REPORT_LOCALE angegeben werden.

  • Zur Erleichterung der Internationalisierung von Berichten eine spezielle Syntax $R{}ist in Berichtsausdrücken verfügbar, um auf java.lang.String- Ressourcen zu verweisen , die in einem dem Bericht zugeordneten java.util.ResourceBundle- Objekt platziert sind . Das$R{} Die Zeichensyntax extrahiert die länderspezifische Ressource aus dem Ressourcenpaket basierend auf dem Schlüssel, der in Klammern gesetzt werden muss.

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

Das obige Textfeld zeigt den Titel des Berichts an, indem der String-Wert aus dem Ressourcenpaket extrahiert wird, das der Berichtsvorlage zugeordnet ist, basierend auf dem angegebenen Gebietsschema zur Laufzeit und dem Schlüssel report.title .

  • Beim Formatieren von Nachrichten in verschiedenen Sprachen basierend auf dem Gebietsschema des Berichts ist in den Berichten net.sf.jasperreports.engine.fill.JRCalculator eine integrierte Methode integriert . Diese Methode bietet ähnliche Funktionen wie die Klasse java.text.MessageFormat . Diese Methode, msg (), verfügt über drei praktische Signaturen, mit denen Sie bis zu drei Nachrichtenparameter in den Nachrichten verwenden können.

  • Eine integrierte str () -Methode (entspricht der $ R {} -Syntax in den Berichtsausdrücken), die den Zugriff auf den Inhalt des Ressourcenpakets basierend auf dem Berichtsgebietsschema ermöglicht.

  • Für die Formatierung von Datum und Uhrzeit kann der integrierte Parameter REPORT_TIME_ZONE verwendet werden, um ordnungsgemäße Zeittransformationen sicherzustellen.

  • In der generierten Ausgabe speichert die Bibliothek Informationen über die Textlaufrichtung, sodass Dokumente, die in Sprachen von rechts nach links (wie Arabisch und Hebräisch) generiert wurden, ordnungsgemäß gerendert werden können.

  • Wenn eine Anwendung zum Anzeigen generierter Berichte auf den integrierten Swing-Viewer angewiesen ist, muss sie durch Anpassen der Schaltfläche QuickInfos oder anderer angezeigter Texte internationalisiert werden. Dies ist sehr einfach, da der Viewer auf ein vordefiniertes Ressourcenpaket angewiesen ist, um länderspezifische Informationen zu extrahieren. Der Basisname für dieses Ressourcenpaket lautet net.sf.jasperreports.view.viewer.

Beispiel

Um die Internationalisierung zu demonstrieren, schreiben wir eine neue Berichtsvorlage (jasper_report_template.jrxml). Der Inhalt der JRXML ist wie folgt. Speichern Sie es im Verzeichnis 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>

In der obigen Datei teilt das resourceBundle- Attribut des <jasperReport> -Elements JasperReports mit, wo die lokalisierten Zeichenfolgen für den Bericht verwendet werden sollen. Wir müssen eine Eigenschaftendatei mit einem Stammnamen erstellen, der dem Wert des Attributs entspricht. Diese Datei muss beim Ausfüllen des Berichts an einer beliebigen Stelle im KLASSENPFAD vorhanden sein. In diesem Beispiel die Eigenschaftendateilocalizationdemo.properties wird unter dem Verzeichnis gespeichert C:\tools\jasperreports-5.0.1\test. Der Inhalt dieser Datei lautet wie folgt:

localization.text1 = This is English text.

Um ein anderes Gebietsschema zu verwenden, muss der Name der Datei localizationdemo [locale] .properties lauten. Hier schreiben wir eine Datei für das spanische Gebietsschema. Speichern Sie diese Datei als -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. Der Inhalt dieser Datei lautet wie folgt:

localization.text1 = Este texto es en Español.

Die Syntax zum Abrufen des Werts für resourceBundle-Eigenschaften lautet $ R {key}.

Damit JasperReports weiß, welches Gebietsschema wir verwenden möchten, müssen wir einem integrierten Parameter einen Wert zuweisen. Der Name dieses Parameters ist als Konstante mit dem Namen REPORT_LOCALE definiert. Diese Konstante ist in der Klasse net.sf.jasperreports.engine.JRParameter definiert . Der Wert der Konstante muss eine Instanz von java.util.Locale sein . Diese Logik ist in Java-Code integriert, um den Bericht zu füllen und zu generieren. Speichern wir diese DateiJasperReportFillI18.javain das Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. Der Inhalt der Datei ist wie folgt:

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

   }
}

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 wie folgt.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup übernommen 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.JasperReportFillI18 (viewFullReport ist das Standardziel) wie folgt:

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

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