JasperReports - Conception de rapports de compilation
Nous avons généré le modèle JasperReport (fichier JRXML) dans le chapitre précédent. Ce fichier ne peut pas être utilisé directement pour générer des rapports. Il doit être compilé au format binaire natif de JasperReport, appeléJasperfichier. Lors de la compilation, nous transformons l'objet JasperDesign en objet JasperReport -
L'interface net.sf.jasperreports.engine.design.JRCompiler joue un rôle central lors de la compilation. Cette interface a plusieurs implémentations en fonction du langage utilisé pour les expressions de rapport, qui peuvent être écrites en Java, Groovy, JavaScript ou tout autre langage de script à condition que l'implémentation du compilateur puisse l'évaluer au moment de l'exécution.
Nous pouvons compiler le fichier JRXML des deux manières suivantes -
- Compilation programmatique.
- Compilation via la tâche ANT.
Compilation programmatique de JRXML
L'API JasperReports propose une classe de façade net.sf.jasperreports.engine.JasperCompileManager pour la compilation d'un JasperReport. Cette classe se compose de plusieurs méthodes statiques publiques pour la compilation de modèles de rapport. La source des modèles peut être des fichiers, des flux d'entrée et / ou des objets mémoire.
Le contenu du fichier JRXML (jasper_report_template.jrxml) est le suivant. Il est enregistré dans le répertoireC:\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>
Le code suivant illustre la compilation du fichier jasper_report_template.jrxml ci-dessus .
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!!! ...");
}
}
Compilation de modèles
À l'étape suivante, sauvegardons le contenu ci-dessus dans le fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.javaet importez le baseBuild.xml dans le fichier build.xml comme ci-dessous. Le fichier baseBuild.xml a déjà lecompile et run cibles -
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "run" basedir = ".">
<import file = "baseBuild.xml"/>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class = com.tutorialspoint.JasperReportCompile comme -
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
À la suite de la compilation ci-dessus, vous verrez que le fichier modèle jasper_report_template.jasper a été généré dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test.
Aperçu du modèle de rapport compilé
Le net.sf.jasperreports.view.JasperDesignViewer peut être utilisé pour prévisualiser les modèles de rapport compilés et les modèles JRXML.
Pour aller plus loin, ajoutons une nouvelle cible viewDesignau fichier build.xml ci-dessus, qui nous permettra de prévisualiser le rapport compilé. Voici le build.xml révisé -
Le fichier d'importation - baseBuild.xml est choisi dans le chapitre Configuration de l'environnement et doit être placé dans le même répertoire que build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "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>
Exécutons la commande - ant(viewDesign est la cible par défaut) à l'invite de commande. La fenêtre JasperDesignViewer s'ouvre et affiche le fichier Jasper comme ci-dessous -
Compilation via la tâche ANT
Comme la compilation de modèles de rapport ressemble plus à un travail de conception qu'à un travail d'exécution, la bibliothèque JasperReport a une tâche ANT personnalisée. Dans certaines situations, lorsque le fichier JRXML est créé au moment de l'exécution, nous ne pouvons pas utiliser cette tâche ANT. La tâche ANT personnalisée est appelée JRC et est implémentée par la classe: net.sf.jasperreports.ant.JRAntCompileTask . Sa syntaxe et son comportement sont très similaires à ceux du<javac> Tâche ANT.
Compilation de modèles
Ajoutons une nouvelle cible compilereportdesingà notre build.xml existant. Ici, le dossier source est spécifié à l'aide d'une balise <src> imbriquée avec les ensembles de fichiers. La balise source imbriquée permet de compiler des modèles de rapport qui sont dispersés dans de nombreux emplacements différents et ne sont pas regroupés sous un seul dossier source de rapport racine. Voici le build.xml révisé -
<?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>
Ensuite, ouvrons l'invite de commande et allons dans le répertoire où build.xml est placé. Exécutez la commandeant(compilereportdesing est la cible par défaut); La sortie est la suivante -
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
Le fichier jasper_report_template.jasper est généré dans le système de fichiers (dans notre cas, le répertoire C: \ tools \ jasperreports-5.0.1 \ test). Ce fichier est identique au fichier généré par programme en appelant le net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile (). Nous pouvons prévisualiser ce fichier jasper, en exécutantant viewDesign.