JasperReports - Kompilieren des Berichtsdesigns

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.