JasperReports - Guide rapide
Qu'est-ce qu'un rapport
Un rapport est une présentation d'information significative, bien définie et résumée. Habituellement, les activités de routine sont automatisées et les données sont résumées dans des «rapports» d'aide à la décision. Les rapports représentent les données désordonnées habituelles dans des tableaux, des graphiques et d'autres formes de représentations graphiques.
Modèle de rapport
Généralement, la mise en page suivante est adoptée pour générer des rapports par la plupart des outils commerciaux de génération de rapports.
TITRE |
EN-TÊTE DE PAGE |
EN-TÊTE DE COLONNE |
DÉTAIL |
COLUMNFOOTER |
PIED DE PAGE |
SOMMAIRE |
Voici les descriptions de chaque élément mentionné dans le diagramme -
S.NON | Élément et description |
---|---|
1 | title Le titre contient le «titre» du rapport. Il n'apparaît qu'une seule fois au tout début du rapport, par exemple, "Rapport sur les points de tutoriels". |
2 | pageHeader PageHeader peut contenir des informations de date et d'heure et / ou le nom de l'organisation. Cela apparaît en haut de chaque page. |
3 | columnHeader ColumnHeader répertorie les noms de ces champs spécifiques que vous souhaitez afficher dans le rapport, par exemple, "Nom de l'auteur", "Heure de début", "Heure de fin", "Heures travaillées", "Date", etc. |
4 | detail Détail est la partie où les entrées des champs spécifiques (listés dans columnHeader) sont affichées, par exemple "Manisha", "9:00", "18:00", "9", "10.02.2013". |
5 | columnFooter ColumnFooter peut afficher la somme de n'importe quel champ, par exemple, "Total des heures travaillées:" 180. " |
6 | pageFooter PageFooter peut contenir des informations sur le nombre de pages. Il apparaît au bas de chaque page, par exemple, "1/23". |
sept | summary Le résumé contient des informations déduites de la partie "détail", par exemple, après avoir répertorié le nombre d'heures travaillées par chaque auteur, le total des heures travaillées par chaque auteur peut être mis dans un diagramme visuel comme un camembert, un graphique, etc. pour une meilleure comparaison. |
JasperRapports
Voici les problèmes courants rencontrés lors de l'élaboration du rapport -
Core changes - En règle générale, refléter les changements ou les améliorations commerciaux nécessaires pour modifier la logique de base du rapport.
Results exporting - Il existe un large éventail de formats vers lesquels votre rapport peut être exporté, tels que: HTML, Texte, PDF, MS Excel, RTF, ODT, Valeurs séparées par des virgules, XML ou image.
Complicated reports - les sous-rapports et les rapports croisés sont un bon exemple.
Charts reports - Graphiques visuels, par exemple, graphique, camembert, ligne XY, barre, compteur et séries chronologiques.
Pour supprimer la surcharge des points mentionnés ci-dessus et pour faciliter le processus de rapport, de nombreux cadres, outils, bibliothèques et applications tierces ont été introduits. JasperReports est l'un d'eux.
JasperReportsest un moteur de reporting Java open source. Il est basé sur Java et n'a pas sa propre syntaxe d'expression. JasperReports a la capacité de fournir un contenu riche à l'écran, à l'imprimante ou dans des fichiers PDF, HTML, XLS, RTF, ODT, CSV, TXT et XML. Comme il ne s'agit pas d'un outil autonome, il ne peut pas être installé seul. Au lieu de cela, il est intégré aux applications Java en incluant sa bibliothèque dans le CLASSPATH de l'application.
JasperReports est une bibliothèque de classes Java, et n'est pas destinée aux utilisateurs finaux, mais s'adresse plutôt aux développeurs Java qui ont besoin d'ajouter des capacités de reporting à leurs applications.
Caractéristiques de JasperReports
Certaines des caractéristiques importantes de JasperReports sont:
Il a une présentation de rapport flexible.
Il peut présenter des données sous forme textuelle ou graphique.
Les développeurs peuvent fournir des données de plusieurs manières.
Il peut accepter des données provenant de plusieurs sources de données.
Il peut générer des filigranes (un filigrane est comme une image secondaire qui est posée sur l'image principale).
Il peut générer des sous-rapports.
Il est capable d'exporter des rapports dans une variété de formats.
JasperReports est une bibliothèque Java pure et non une application autonome. Il ne peut pas s'exécuter seul, il doit donc être intégré dans une autre application Java client ou serveur. Comme il est basé sur Java, il peut être exécuté sur n'importe quelle plate-forme prenant en charge Java (JDK 1.3 et supérieur). Toutes les fonctionnalités de JasperReport sont rassemblées dans un seul fichier JAR, jasperreports-xxxjar. Ce JAR ainsi que les bibliothèques obligatoires et facultatives (fichier .ZIP) peuvent être téléchargés à partir du site: JasperReport Library Link . Téléchargez la dernière version à partir de ce lien.
Le fichier ZIP comprend le fichier JAR JasperReports ainsi que le code source JasperReports, les JAR dépendants et de nombreux exemples illustrant les fonctionnalités de JasperReport.
Environnement JasperReport
Pour commencer à créer les rapports, nous devons configurer l'environnement prêt. Extrayez le fichier JasperReport.ZIP téléchargé à n'importe quel emplacement (dans notre cas, nous l'avons extrait dans C: \ tools \ jasperreports-5.0.1). La structure du répertoire du fichier extrait est la même que celle indiquée ci-dessous -
Voici le détail de tous les répertoires -
build - Contient les fichiers de classe JasperReport compilés.
demo - Contient divers exemples, démontrant plusieurs aspects de la fonctionnalité JasperReports.
dist - Contient le fichier jasperreports-xxxjar. Nous ajouterons ce fichier JAR à notre CLASSPATH pour profiter de JasperReports.
docs - Contient une copie locale de la documentation JasperReports.
lib - Contient tous les JAR nécessaires, à la fois pour construire JasperReports et pour l'utiliser dans nos applications.
src - Contient le code source JasperReports.
build.xml - Un fichier de construction ANT pour créer le code source JasperReports. Si nous n'avons pas l'intention de modifier JasperReports, nous n'avons pas besoin d'utiliser ce fichier puisque JasperReports est distribué sous la forme compilée.
changes.txt - Un document texte, expliquant les différences entre les versions actuelle et précédente de la bibliothèque de classes JasperReports.
license.txt - Un document texte qui contient le texte intégral de la licence LGPL (Lesser General Public License).
readme.txt - Un document texte, contenant des instructions sur la façon de construire et d'exécuter les exemples fournis.
Fondamentalement, nous utilisons uniquement jasperreports-xxxjar sous dist et JAR sous le répertoire lib pour générer des rapports. Comme JasperReports est un outil open source, si un défaut ou un bogue est reconnu pendant l'exécution dans le jasperreports-xxxjar, nous pouvons le corriger et reconstruire le JAR en utilisant le fichier build.xml.
Réglez le CLASSPATH
Pour utiliser JasperReport, nous devons définir les fichiers suivants sur notre CLASSPATH -
jasperreports-xxxjar, où xxx est la version JasperReports. Cela se trouve sous le répertoire C: \ tools \ jasperreports-xxx \ dist).
Tous les fichiers JAR du sous- répertoire lib (C: \ tools \ jasperreports-xxx \ lib).
Au moment de l'installation, nous avons utilisé JasperReport version 5.0.1. Cliquez avec le bouton droit sur «Poste de travail» et sélectionnez «Propriétés», cliquez sur le bouton «Variables d'environnement» sous l'onglet «Avancé». Maintenant, mettez à jour la variable 'Path' avec ceciC:\tools\jasperreports-5.0.1\dist\jasperreports-5.0.1.jar:C:\tools\jasperreports-5.0.1\lib. Vous êtes maintenant prêt à créer vos rapports.
Dans tous les exemples de ce tutoriel, nous avons utilisé des tâches ANT pour générer des rapports. lebuildfile se charge d'importer tous les JAR requis pour générer des rapports. Par conséquent, la configuration de CLASSPATH comme mentionné ci-dessus n'aidera que ceux qui souhaitent générer des rapports sans utiliser ANT.
Configuration de la construction
Tous les exemples de ce tutoriel -
ont été écrits en utilisant un simple éditeur de texte.
ont été enregistrés dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.
ont été compilés et exécutés à partir de l'invite de commande, à l'aide d'Apache ANT. Nous utiliserons unbaseBuild.xml fichier, que nous importerons dans ANT build.xmlfichier dans les chapitres suivants. Enregistrez ce fichier dans C: \ tools \ jasperreports-5.0.1 \ test. Voici le contenu du fichier 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>
Ce fichier a toutes les cibles requises, comme le nettoyage des répertoires, la compilation des fichiers java et l'exécution des fichiers de classe.
Voici les détails, mentionnés par divers répertoires dans baseBuild.xml. En supposant que le répertoire actuel est C: \ tools \ jasperreports-5.0.1 \ test) -
jasper.dir - est le répertoire C: \ tools \ jasperreports-5.0.1
lib.dir - est le répertoire C: \ tools \ jasperreports-5.0.1 \ lib
src.dir - est C: \ tools \ jasperreports-5.0.1 \ test \ src
classes.dir - est C: \ tools \ jasperreports-5.0.1 \ test \ classes
classe principale - com.tutorialspoint.HelpMe. Cette classe est une classe simple exécutée, lorsqu'aucun nom de fichier de classe n'est passé depuis la ligne de commande. Enregistrez ce fichier dans 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 ");
}
}
Cours de gestionnaires Jasper
Il existe un certain nombre de classes qui seront utilisées pour compiler une conception de rapport JRXML, pour remplir un rapport, pour imprimer un rapport, pour exporter vers des fichiers PDF, HTML et XML, pour afficher les rapports générés et pour la conception de rapports.
La liste de ces classes est -
net.sf.jasperreports.engine.JasperCompileManager - Utilisé pour compiler un modèle de rapport JRXML.
net.sf.jasperreports.engine.JasperFillManager - Utilisé pour remplir un rapport avec les données de la source de données.
net.sf.jasperreports.engine.JasperPrintManager - Utilisé pour imprimer les documents générés par la bibliothèque JasperReports.
net.sf.jasperreports.engine.JasperExportManager - Utilisé pour obtenir du contenu PDF, HTML ou XML pour les documents produits par le processus de remplissage de rapport.
net.sf.jasperreports.view.JasperViewer - Il représente une application Java Swing simple, qui peut charger et afficher des rapports.
net.sf.jasperreports.view.JasperDesignViewer - Utilisé au moment du design pour prévisualiser les modèles de rapport.
Configurer Apache ANT
Nous allons construire tous les exemples en utilisant Apache ANT. Veuillez donc consulter le chapitre ANT - Configuration de l'environnement pour configurer Apache ANT sur votre système.
L'objectif principal de JasperReports est de créer des documents orientés page, prêts à imprimer d'une manière simple et flexible. L'organigramme suivant illustre un flux de travail typique lors de la création de rapports.
Comme le montre l'image, le cycle de vie comporte des phases distinctes suivantes -
Conception du rapport - Dans cette étape, nous créons le fichier JRXML, qui est un document XML contenant la définition de la mise en page du rapport. Nous pouvons utiliser n'importe quel éditeur de texte ou iReportDesigner pour le créer manuellement. Si iReportDesigner est utilisé, la mise en page est conçue de manière visuelle, par conséquent la structure réelle du JRXML peut être ignorée.
Compilation du rapport - Dans cette étape, JRXML est compilé dans un objet binaire appelé fichier Jasper (* .jasper). Cette compilation est faite pour des raisons de performances. Les fichiers Jasper sont ce dont vous avez besoin avec votre application pour exécuter les rapports.
Exécution du rapport (Remplissage des données dans le rapport) - Dans cette étape, les données de l'application sont remplies dans le rapport compilé. La classe net.sf.jasperreports.engine.JasperFillManager fournit les fonctions nécessaires pour remplir les données dans les rapports. Un fichier d'impression Jasper (* .jrprint) est créé, qui peut être utilisé pour imprimer ou exporter le rapport.
Exportation du rapport au format souhaité - Dans cette étape, nous pouvons exporter le fichier d'impression Jasper créé à l'étape précédente vers n'importe quel format à l'aide de JasperExportManager. Comme Jasper propose diverses formes d'export, donc avec la même entrée, nous pouvons créer plusieurs représentations des données.
Un aperçu détaillé de chacune des étapes ci-dessus sera donné dans les chapitres suivants.
Les modèles JRXML (ou fichiers JRXML) dans JasperReport sont des fichiers XML standard, ayant une extension .jrxml. Tous les fichiers JRXML contiennent la balise <jasperReport>, comme élément racine. Celui-ci contient à son tour de nombreux sous-éléments (tous sont facultatifs). Le framework JasperReport peut gérer différents types de sources de données. Dans ce tutoriel, nous montrerons comment générer un rapport de base, simplement en passant une collection d'objets de données Java (à l'aide de beans Java), au moteur JasperReport. Le rapport final affichera une liste de personnes avec les catégories comprenant leurs noms et pays.
Les étapes suivantes sont couvertes dans ce chapitre pour décrire - comment concevoir un JasperReport -
- Création d'un modèle de rapport JRXML et.
- Aperçu du modèle de rapport XML.
Création d'un modèle de rapport JRXML
Créez le fichier JRXML, qui est jasper_report_template.jrxmlà l'aide d'un éditeur de texte et enregistrez ce fichier dans C: \ tools \ jasperreports-5.0.1 \ test selon la configuration de notre environnement.
<?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>
Voici les détails des principaux champs dans le modèle de rapport ci-dessus -
<queryString> - Ceci est vide (car nous transmettons des données via Java Beans). Contient généralement l'instruction SQL, qui récupère le résultat du rapport.
<nom du champ> - Cet élément est utilisé pour mapper des données provenant de sources de données ou de requêtes vers des modèles de rapport. name est réutilisé dans le corps du rapport et est sensible à la casse.
<fieldDescription> - Cet élément mappe le nom du champ avec l'élément approprié dans le fichier XML.
<staticText> - Ceci définit le texte statique qui ne dépend d'aucune source de données, variable, paramètre ou expression de rapport.
<textFieldExpression> - Ceci définit l'apparence du champ de résultat.
$ F {country} - Il s'agit d'une variable qui contient la valeur du résultat, champ prédéfini dans la balise <nom du champ>.
<band> - Les bandes contiennent les données, qui sont affichées dans le rapport.
Une fois la conception du rapport prête, enregistrez-la dans le répertoire C: \.
Aperçu du modèle de rapport XML
Il existe un utilitaire net.sf.jasperreports.view.JasperDesignViewer disponible dans le fichier JAR JasperReports, qui permet de prévisualiser la conception du rapport sans avoir à le compiler ou à le remplir. Cet utilitaire est une application Java autonome et peut donc être exécuté à l'aide d'ANT.
Écrivons une cible ANT viewDesignXMLpour afficher le JRXML. Alors, créons et sauvegardonsbuild.xmlsous le répertoire C: \ tools \ jasperreports-5.0.1 \ test (doit être placé dans le même répertoire où JRXML est placé). Voici le fichier 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>
Ensuite, ouvrons une invite de commande et allons dans le répertoire où build.xml est placé. Exécutez la commandeant(Comme viewDesignXML 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
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.
L'avertissement Log4j peut être ignoré, et à la suite de l'exécution ci-dessus, une fenêtre intitulée "JasperDesignViewer" s'ouvre, affichant notre aperçu du modèle de rapport.
Comme nous le voyons, seules les expressions de rapport permettant d'obtenir les données sont affichées, car JasperDesignViewer n'a pas accès à la source de données réelle ou aux paramètres du rapport. Terminez JasperDesignViewer en fermant la fenêtre ou en appuyant sur Ctrl-c dans la fenêtre de ligne de commande.
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 tant que l'implémentation du compilateur peut 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
Comme prochaine étape, 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, ce 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 le 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 net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile (). Nous pouvons prévisualiser ce fichier jasper, en exécutantant viewDesign.
Le but principal de tout outil de reporting est de produire des documents de haute qualité. Le processus de remplissage de rapport aide l'outil de création de rapports à atteindre cet objectif en manipulant des ensembles de données.
Les principales entrées requises pour le processus de remplissage des rapports sont:
Report Template - Il s'agit d'un fichier JasperReport réel.
Report Parameters- Ce sont essentiellement des valeurs nommées qui sont transmises au moteur au moment du remplissage du rapport. Nous en discuterons dans le chapitre Paramètres du rapport .
Data Source- Nous pouvons remplir un fichier Jasper à partir d'une gamme de sources de données comme une requête SQL, un fichier XML, un fichier csv, une requête HQL (Hibernate Query Language), une collection de Java Beans, etc. Cela sera discuté en détail dans Report Chapitre Sources de données .
Le résultat généré par ce processus est un .jrprint document qui est prêt à être visualisé, imprimé ou exporté vers d'autres formats. La classe de façade net.sf.jasperreports.engine.JasperFillManager est généralement utilisée pour remplir un modèle de rapport avec des données. Cette classe a diverses méthodes fillReportXXX () qui remplissent les modèles de rapport (les modèles peuvent être situés sur le disque, choisis dans les flux d'entrée ou fournis directement en mémoire).
Il existe deux catégories de méthodes fillReportXXX () dans cette classe de façade -
Le premier type, reçoit un objet java.sql.Connection comme troisième paramètre. La plupart du temps, les rapports sont remplis de données provenant d'une base de données relationnelle. Ceci est réalisé par -
Connectez-vous à la base de données via JDBC.
Incluez une requête SQL dans le modèle de rapport.
Le moteur JasperReports utilise la connexion transmise et exécute la requête SQL.
Une source de données de rapport est ainsi produite pour remplir le rapport.
Le second type, reçoit un objet net.sf.jasperreports.engine.JRDataSource, lorsque les données à renseigner sont disponibles dans d'autres formulaires.
Remplir les modèles de rapport
Écrivons un modèle de rapport. Le contenu du fichier JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) est comme ci-dessous -
<?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>
Ensuite, passons une collection d'objets de données Java (Java beans), au moteur JasperReport, pour remplir ce rapport compilé.
Écrivez un POJO DataBean.java, qui représente l'objet de données (bean Java). Cette classe définit deux objets String, à savoir «nom» et «pays». Enregistrez-le dans le répertoireC:\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;
}
}
Ecrivez une classe DataBeanList.java, qui a une logique métier pour générer une collection d'objets bean java. Ceci est ensuite transmis au moteur JasperReports, pour générer le rapport. Ici, nous ajoutons 4 objets DataBean dans la liste. Enregistrez-le dans le répertoireC:\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;
}
}
Ecrire un fichier de classe principal JasperReportFill.java, qui récupère la collection de bean java de la classe (DataBeanList) et la transmet au moteur JasperReports, pour remplir le modèle de rapport. Enregistrez-le dans le répertoireC:\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();
}
}
}
Générer des rapports
Nous allons maintenant compiler et exécuter ces fichiers en utilisant notre processus de construction ANT normal. Le fichier build.xml est comme indiqué ci-dessous -
Le fichier d'importation - baseBuild.xml est choisi dans le chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?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>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commande ant -Dmain-class = com.tutorialspoint.JasperReportFill (executereport est la cible par défaut) comme suit -
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
À la suite de l'exécution ci-dessus, un fichier jasper_report_template.jrprint est généré dans le même répertoire que le fichier .jasper (dans ce cas, il est généré à C: \ tools \ jasperreports-5.0.1 \ test).
La sortie du processus de remplissage de rapport Les objets JasperPrint peuvent être visualisés à l'aide d'un composant de visionneuse intégré, ou imprimés, ou exportés vers des formats de documents plus courants tels que PDF, HTML, RTF, XLS, ODT, CSV ou XML. L'affichage et l'impression des documents Jasper seront discutés dans ce chapitre et l'exportation sera discutée dans le chapitre suivant, à savoir «Exporter des rapports».
Affichage des rapports
JasperReport fournit une visionneuse intégrée pour visualiser les rapports générés dans leur format d'origine. C'est un composant basé sur le swing et d'autres applications Java peuvent intégrer ce composant sans avoir à exporter les documents vers d'autres formats afin d'être visualisés ou imprimés. La classe net.sf.jasperreports.view.JRViewer représente ce composant visuel. Cette classe peut également être personnalisée selon les besoins de l'application, en la sous-classant.
JasperReports dispose également d'une application Swing, qui utilise le composant visuel pour visualiser les rapports. Cette application permet d'afficher les rapports dans le même format que * .jrprint est produit. Cette application Swing est implémentée dans la classe net.sf.jasperreports.view.JasperViewer . Pour afficher les rapports utilisant cette classe, nous devons l'envelopper dans une cible ANT.
Affichage du rapport généré
L'exemple suivant montre - comment afficher un rapport à l'aide de la classe JasperViewer -
Écrivons un modèle de rapport. Le contenu du fichier JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) est comme indiqué ci-dessous -
<?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>
Ensuite, passons une collection d'objets de données Java (Java beans), au moteur JasperReports, pour remplir ce rapport compilé.
Écrivez un POJO DataBean.java, qui représente l'objet de données (bean Java). Cette classe définit deux objets String, à savoir «nom» et «pays». Enregistrez-le dans le répertoireC:\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;
}
}
Ecrivez une classe DataBeanList.java, qui a une logique métier pour générer une collection d'objets bean java. Ceci est ensuite transmis au moteur JasperReports, pour générer le rapport. Ici, nous ajoutons 4 objets DataBean dans la liste. Enregistrez-le dans le répertoireC:\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;
}
}
Ecrire un fichier de classe principal JasperReportFill.java, qui récupère la collection de bean java de la classe (DataBeanList) et la transmet au moteur JasperReports, pour remplir le modèle de rapport. Enregistrez-le dans le répertoireC:\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();
}
}
}
Écrivons une cible viewFillReportdans le fichier build.xml. Le fichier build.xml est le suivant -
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 le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml"/>
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer
to preview the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc"
classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commande ant -Dmain-class=com.tutorialspoint.JasperReportFill(viewFillReport est la cible par défaut). En conséquence, nous voyons une fenêtre JasperViewer comme indiqué dans l'écran ci-dessous -
Impression de rapports
Nous pouvons imprimer les documents générés par la bibliothèque JasperReports (dans leur format propriétaire c'est-à- dire les objets JasperPrint ) en utilisant la classe net.sf.jasperreports.engine.JasperPrintManager . Il s'agit d'une classe de façade qui repose sur l'API d'impression Java 2. Nous pouvons également imprimer les documents une fois que les documents JasperReport sont exportés vers d'autres formats tels que HTML ou PDF.
Impression du rapport généré
Le code suivant illustre l'impression d'un rapport. Mettons à jour notre classe existante JasperReportFill. Nous utiliserons la méthode JasperPrintManager.printReport () . Cette méthode prend le nom du fichier source (ici nous passons le fichier .jrprint , que nous générons à l'étape précédente en utilisant la méthode JasperFillManager.fillReportToFile ()) comme premier paramètre. Le deuxième paramètre est le booléen pour afficher la boîte de dialogue d'impression standard (nous l'avons défini surtrue ici).
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();
}
}
}
Maintenant, sauvegardons ce fichier dans le répertoire C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint. Nous compilerons et exécuterons ce fichier en utilisant ANT. Le contenu de build.xml est comme indiqué ci-dessous -
<?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>
Ensuite, ouvrons l'invite de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportPrint. En conséquence, une boîte de dialogue d'impression apparaît. Cliquez sur ok pour imprimer le document.
Nous avons vu dans le chapitre précédent, comment imprimer et visualiser un document généré par JasperReport. Ici, nous allons voir comment transformer ou exporter ces rapports dans d'autres formats tels que PDF, HTML et XLS. La classe de façade net.sf.jasperreports.engine.JasperExportManager est fournie pour réaliser cette fonctionnalité. Exporter signifie transformer l' objet JasperPrint (fichier .jrprint) dans un format différent.
Le code suivant (JasperReportExport.java) illustre le processus d'exportation du document JasperReport. JasperExportManager fournit des méthodes pour exporter un rapport au format PDF, HTML et XML uniquement. Pour exporter au format XLS, nous avons utilisé la classe net.sf.jasperreports.engine.export.JRXlsExporter . Ce code génère les trois fichiers suivants -
- sample_report.pdf
- sample_report.html
- sample_report.xls
Exportation vers d'autres formats
Écrivons un modèle de rapport. Le contenu du fichier JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) est comme ci-dessous -
<?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>
Ensuite, le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme indiqué ci-dessous -
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;
}
}
Le contenu du fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme indiqué ci-dessous -
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;
}
}
Ecrire un fichier de classe principal JasperReportFill.java, qui récupère la collection de bean java de la classe (DataBeanList) et la transmet au moteur JasperReports, pour remplir le modèle de rapport. Enregistrez-le dans le répertoireC:\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();
}
}
}
Ici, nous avons inclus la logique pour exporter le fichier d'impression jasper au format pdf, html et xls.
Générer des rapports
Compilons et exécutons les fichiers ci-dessus en utilisant notre processus de construction ANT normal. Le fichier build.xml est comme indiqué ci-dessous -
<?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>
Accédez à l'invite de commande, puis accédez au répertoire C: \ tools \ jasperreports-5.0.1 \ test, où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill. La sortie est la suivante -
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
Comme résultat de l'exécution ci-dessus, vous trouverez trois fichiers sample_report.pdf, sample_report.html, sample_report.xls générés dans le répertoire C: \.
Les principales entrées pour remplir un rapport sont: le modèle de rapport, les paramètres et les sources de données. Ce chapitre décrira les paramètres et dans le chapitre suivant, nous discuterons des sources de données.
Les paramètres sont les références d'objet, celles-ci sont transmises lors des opérations de remplissage de rapport au moteur de rapport. Les données qui ne peuvent pas être transmises via la source de données peuvent être transmises à l'aide de paramètres. Des données telles que le nom de l'auteur, le titre du rapport, etc. peuvent être transmises via des paramètres. Un modèle JasperReports ou un modèle JRXML peut avoir zéro ou plusieurs éléments de paramètre.
Déclaration des paramètres
Déclaration des paramètres comme suit -
<parameter name = "exampleParameter" class = "java.lang.String" />
L'attribut de nom
L' attribut name de l'élément <parameter> est obligatoire. Il fait référence au paramètre dans les expressions de rapport par son nom. Le nom du paramètre doit être un seul mot. Il ne doit contenir aucun caractère spécial comme un point ou une virgule.
L'attribut de classe
L' attribut class est également obligatoire et spécifie le nom de classe des valeurs de paramètre. Sa valeur par défaut est java.lang.String . Cela peut être changé en n'importe quelle classe disponible au moment de l'exécution. Quel que soit le type d'un paramètre de rapport, le moteur se charge de la conversion dans les expressions de rapport dans lesquelles le jeton $ P {} est utilisé, par conséquent, la conversion manuelle est inutile.
Les valeurs des paramètres du rapport sont toujours regroupées dans un objet java.util.Map, qui a le nom du paramètre comme clé. Les paramètres de rapport peuvent être utilisés dans la chaîne de requête du rapport, afin de personnaliser davantage l'ensemble de données, extrait de la base de données. Ceux-ci agissent comme des filtres dynamiques dans la requête qui fournit des données pour le rapport.
Paramètres intégrés
Voici les paramètres de rapport prédéfinis, prêts à être utilisés dans les expressions -
S.NON | Nom et description du paramètre |
---|---|
1 | REPORT_PARAMETERS_MAP Contient une carte avec tous les paramètres définis par l'utilisateur et intégrés. |
2 | REPORT_CONNECTION Cela pointe vers la classe java.sql.Connection fournie par l'utilisateur, utilisée pour les sources de données JDBC. |
3 | REPORT_DATA_SOURCE Il s'agit d'une instance fournie par l'utilisateur de JRDataSource représentant l'un des types de source de données intégrés ou défini par l'utilisateur. |
4 | REPORT_MAX_COUNT Il s'agit d'une valeur java.lang.Integer , permettant aux utilisateurs de limiter les enregistrements de la source de données. |
5 | REPORT_SCRIPTLET Cela pointe vers net.sf.jasperreports.engine.JRAbstractScriptlet et contient une instance du scriptlet de rapport fourni par l'utilisateur. |
6 | REPORT_LOCALE Il s'agit d'une instance java.util.Locale , contenant les paramètres régionaux souhaités du groupe de ressources. |
sept | REPORT_RESOURCE_BUNDLE Cela pointe vers l' objet java.util.ResourceBundle et contient des messages localisés. |
8 | REPORT_TIME_ZONE Il s'agit d'une instance java.util.TimeZone , utilisée pour le formatage de la date. |
9 | REPORT_VIRTUALIZER Il s'agit d'une instance de l' objet net.sf.jasperreports.engine.JRVirtualizer , et utilisée pour la virtualisation de page (optimisation de la consommation de mémoire). |
dix | REPORT_CLASS_LOADER Il s'agit d'une instance java.lang.ClassLoader à utiliser pendant le processus de remplissage du rapport pour charger des ressources telles que des images, des polices et des modèles de sous-rapport |
11 | IS_IGNORE_PAGINATION S'il est défini sur java.lang.Boolean.TRUE, le rapport sera généré sur une longue page et le saut de page ne se produira pas. |
Exemple
Passons ReportTitle et Author au rapport (généré par JasperReportFill.java). Fichier réviséC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java est comme suit -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource =
new JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme ci-dessous -
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;
}
}
Le contenu du fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme indiqué ci-dessous -
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;
}
}
Ajoutons les paramètres <ReportTitle> et <Author> à notre modèle de rapport existant (Chapter Report Designs ). Le titre et l'auteur du rapport seront affichés au début du rapport. Le modèle de rapport révisé (jasper_report_template.jrxml) est le suivant. Enregistrez-le dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test -
<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
"//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name = "jasper_report_template" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<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>
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est comme ci-dessous.
Le fichier d'importation - baseBuild.xml est sélectionné dans le chapitre Configuration de l'environnement et doit être placé dans le même répertoire que build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme suit -
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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran suivant -
Ici, nous voyons que le ReportTitle "Liste des contacts" et l'auteur "Préparé par Manisha" sont affichés au début du rapport.
Les sources de données sont des conteneurs de données structurées. Lors de la génération du rapport, le moteur JasperReports obtient les données des sources de données. Les données peuvent être obtenues à partir des bases de données, des fichiers XML, des tableaux d'objets et de la collection d'objets. Nous avons vu dans le chapitre Filling Reports , la méthode fillReportXXX () s'attend à recevoir une source de données du rapport, qui doit se remplir, sous la forme denet.sf.jasperreports.engine.JRDataSource objet ou un java.sql.Connection (lorsque les données du rapport se trouvent dans une base de données relationnelle).
L'interface JRDataSource n'a que deux méthodes, qui devraient être implémentées -
public boolean next () lance JRException;
Au moment du remplissage du rapport, cette méthode est appelée sur l'objet source de données par le moteur de rapport lors de l'itération des données.
L'objet public getFieldValue (JRField jrField) lance JRException;
Cette méthode fournit la valeur de chaque champ de rapport dans l'enregistrement de source de données actuel.
La seule façon de récupérer des données à partir de la source de données consiste à utiliser les champs du rapport. Il existe plusieurs implémentations par défaut de l'interface JRDataSource, selon la manière dont les enregistrements de la source de données sont acquis.
Implémentations de sources de données
Le tableau ci-dessous résume les sources de données et leurs classes d'implémentation -
La source de données | Classe d'implémentation |
---|---|
JDBC | net.sf.jasperreports.engine.JRResultSetDataSource |
JavaBean | net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource |
Basé sur la carte | net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource |
TableModèle | 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 |
Vide | net.sf.jasperreports.engine.JREmptyDataSource |
Sources de données JDBC
Classe JRResultSetDataSourcecraps un objet java.sql.ResultSet . Il s'agit de l'implémentation de source de données la plus couramment utilisée lorsque les données de rapport sont extraites d'une base de données relationnelle. Si un java.sql.Connection est passé au moteur à la place, il exécute d'abord la requête associée et stocke l' objet java.sql.ResultSet renvoyé dans une instance JRResultSetDataSource.
Sources de données JavaBean
Des classes JRBeanArrayDataSource et JRBeanCollectionDataSourcereprésentent des implémentations qui peuvent encapsuler des tableaux et des collections d'objets JavaBean. Chaque objet à l'intérieur du tableau ou de la collection sera vu comme un enregistrement dans ce type de source de données. Le mappage entre une propriété JavaBean particulière et le champ de rapport correspondant est effectué par des conventions de dénomination. Le nom du champ de rapport doit être le même que le nom de la propriété JavaBean tel que spécifié par les spécifications JavaBeans.
Dans tous les exemples de ce tutoriel, nous avons utilisé JRBeanCollectionDataSource.
Sources de données cartographiques
Les classes d'implémentation JRMapArrayDataSource et JRMapCollectionDataSourcesont utiles si l'application parente stocke déjà les données de rapport disponibles en mémoire sous forme d' objets java.util.Map . Chaque objet Map du tableau ou de la collection encapsulé est considéré comme un enregistrement virtuel dans la source de données et la valeur de chaque champ de rapport est extraite de la carte à l'aide du champ de rapport nommé comme clé.
Sources de données TableModel
Dans de nombreuses applications côté client, les données sont affichées sous forme de tableau. Une exigence courante dans de nombreuses applications est de permettre à l'utilisateur d'imprimer ce format tabulaire sous forme de rapport. Classe d'implémentationJRTableModelDataSourcerend la tâche de générer des rapports à partir du format tabulaire triviale pour les applications Swing. Cette classe encapsule un objet javax.swing.table.TableModel. Les colonnes de l'objet TableModel encapsulé sont accessibles soit par leurs noms, soit par leurs index de base 0.
Sources de données XML
Classe JRXmlDataSourceest une implémentation de source de données basée sur DOM, qui utilise des expressions XPath pour sélectionner des données dans le document XML. Les enregistrements de la source de données XML sont représentés par des éléments de nœud sélectionnés via l'expression XPath. Les valeurs de champ sont extraites de chaque enregistrement à l'aide de l'expression XPath fournie par la description de champ (élément <fieldDescription> dans JRXML).
XPath est un langage utilisé pour naviguer dans les attributs et les éléments d'un document XML. Vous trouverez plus d'informations sur XPath surhttp://www.w3.org/TR/xpath.
Sources de données CSV
JRCsvDataSourcereprésente une implémentation pour les sources de données, qui récupèrent leurs données à partir de fichiers texte structurés; généralement des CSV. Les valeurs de champ sont récupérées à l'aide de leur index de colonne.
Sources de données XLS
JRXlsDataSourcereprésente une implémentation pour les sources de données, qui récupèrent leurs données à partir de documents Excel. Le mappage de champ de rapport pour cette implémentation de source de données est également basé sur l'index de colonne de champ.
Sources de données vides
La classe JREmptyDataSource, simule une source de données avec un nombre donné d'enregistrements virtuels vides à l'intérieur. Il est utilisé par les outils d'interface utilisateur pour offrir une fonctionnalité de prévisualisation de rapport de base, ou dans des modèles de rapport spéciaux, ou à des fins de test et de débogage.
Sources de données rembobinables
le net.sf.jasperreports.engine.JRRewindableDataSourceétend l' interface de base de JRDataSource . Il ajoute une seule méthode, appelée moveFirst (), à l'interface. Cette méthode est destinée à déplacer le curseur vers le premier élément de la source de données.
Les sources de données rembobinables sont utiles lorsque vous travaillez avec des sous-rapports placés à l'intérieur d'une bande qui n'est pas autorisée à se diviser en raison du paramètre isSplitAllowed = "false" et qu'il n'y a pas assez d'espace sur la page en cours pour que le sous-rapport soit rendu.
Toutes les implémentations de source de données ci-dessus peuvent être rembobinées à l'exception de JRResultSetDataSource, car il ne prend pas en charge le déplacement du pointeur d'enregistrement vers l'arrière. Cela pose un problème uniquement si cette source de données est utilisée manuellement pour encapsuler un java.sql.ResultSet avant de le transmettre au sous-rapport. Il n'y a pas de problème, si la requête SQL réside dans le modèle de sous-rapport, car le moteur l'exécutera à nouveau lors du redémarrage du sous-rapport sur la page suivante.
Fournisseurs de sources de données
La bibliothèque JasperReports a une interface net.sf.jasperreports.engine.JRDataSourceProvider. Cela aide à créer et à supprimer des objets de source de données. Lors de la création d'un modèle de rapport à l'aide des outils GUI, un outil spécial pour personnaliser la source de données du rapport est nécessaire. JRDataSourceProvider est le moyen standard de brancher des sources de données personnalisées dans un outil de conception. Une implémentation personnalisée de cette interface doit implémenter les méthodes suivantes qui permettent de créer et de supprimer des objets de source de données, ainsi que des méthodes pour répertorier les champs de rapport disponibles dans la source de données, si possible -
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;
Les champs de rapport sont des éléments qui représentent le mappage des données entre la source de données et le modèle de rapport. Les champs peuvent être combinés dans les expressions de rapport pour obtenir la sortie souhaitée. Un modèle de rapport peut contenir zéro ou plusieurs éléments <field>. Lors de la déclaration de champs de rapport, la source de données doit fournir des données correspondant à tous les champs définis dans le modèle de rapport.
Déclaration de terrain
La déclaration sur le terrain se fait comme indiqué ci-dessous -
<field name = "FieldName" class = "java.lang.String"/>
L'attribut de nom
L' attribut name de l'élément <field> est obligatoire. Il fait référence au champ dans les expressions de rapport par son nom.
L'attribut de classe
L' attribut class spécifie le nom de classe des valeurs de champ. Sa valeur par défaut est java.lang.String . Cela peut être changé en n'importe quelle classe disponible au moment de l'exécution. Quel que soit le type de champ de rapport, le moteur se charge de transtyper les expressions de rapport dans lesquelles le jeton $ F {} est utilisé, rendant ainsi les transtypages manuels inutiles.
Description du champ
L'élément <fieldDesciption> est un élément facultatif. Ceci est très utile lors de l'implémentation d'une source de données personnalisée. Par exemple, nous pouvons stocker une clé ou des informations, grâce auxquelles nous pouvons récupérer la valeur du champ à partir de la source de données personnalisée au moment de l'exécution. En utilisant l'élément <fieldDesciption> au lieu du nom de champ, vous pouvez facilement surmonter les restrictions des conventions de dénomination de champ lors de la récupération des valeurs de champ à partir de la source de données.
Voici un morceau de code de notre fichier JRXML existant (Chapter Report Designs ). Ici, nous pouvons voir l'utilisation dename, class, et fieldDescription éléments.
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
Trier les champs
Au moment où le tri des données est requis et que l'implémentation de la source de données ne le prend pas en charge (par exemple, source de données CSV), JasperReports prend en charge le tri des sources de données en mémoire basé sur des champs. Le tri peut être effectué à l'aide d'un ou plusieurs éléments <sortField> dans le modèle de rapport.
Si au moins un champ de tri est spécifié, pendant le processus de remplissage du rapport, la source de données est transmise à une instance JRSortableDataSource . Ceci à son tour récupère tous les enregistrements de la source de données, effectue le tri en mémoire selon les champs spécifiés et remplace la source de données d'origine.
Le nom du champ de tri doit être identique au nom du champ du rapport. Les champs utilisés pour le tri doivent avoir des types qui implémentent java.util.Comparable. Le tri par ordre naturel est effectué pour tous les champs à l'exception de ceux de type java.lang.String (pour le type String, le collator correspondant aux paramètres régionaux de remplissage du rapport est utilisé). Lorsque plusieurs champs de tri sont spécifiés, le tri sera effectué en utilisant les champs comme clés de tri dans l'ordre dans lequel ils apparaissent dans le modèle de rapport. L'exemple suivant illustre la fonction de tri.
Exemple de rapport trié
Ajoutons le <sortField> élément de notre modèle de rapport existant ( conceptions de rapport de chapitre ). Trions le pays du champ par ordre décroissant. Le modèle de rapport révisé (jasper_report_template.jrxml) est le suivant. Enregistrez-le dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test -
<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
"//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi =
"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation =
"http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name = "jasper_report_template" pageWidth = "595" pageHeight = "842"
columnWidth = "515" leftMargin = "40" rightMargin = "40"
topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<sortField name = "country" order = "Descending"/>
<sortField name = "name"/>
<title>
<band height = "70">
<line>
<reportElement x = "0" y = "0" width = "515" height = "1"/>
</line>
<textField isBlankWhenNull = "true" bookmarkLevel = "1">
<reportElement x = "0" y = "10" width = "515" height = "30"/>
<textElement textAlignment = "Center">
<font size = "22"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{ReportTitle}]]>
</textFieldExpression>
<anchorNameExpression>
<![CDATA["Title"]]>
</anchorNameExpression>
</textField>
<textField isBlankWhenNull = "true">
<reportElement x = "0" y = "40" width = "515" height = "20"/>
<textElement textAlignment = "Center">
<font size = "10"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <columnHeader> <band height = "23"> <staticText> <reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15" backcolor = "#70A9A9" /> <box> <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" /> </box> <textElement /> <text> <![CDATA[]]> </text> </staticText> <staticText> <reportElement x = "414" y = "3" width = "121" height = "15" /> <textElement textAlignment = "Center" verticalAlignment = "Middle"> <font isBold = "true" /> </textElement> <text><![CDATA[Country]]></text> </staticText> <staticText> <reportElement x = "0" y = "3" width = "136" height = "15" /> <textElement textAlignment = "Center" verticalAlignment = "Middle"> <font isBold = "true" /> </textElement> <text><![CDATA[Name]]></text> </staticText> </band> </columnHeader> <detail> <band height = "16"> <staticText> <reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14" backcolor = "#E5ECF9" /> <box> <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" /> </box> <textElement /> <text> <![CDATA[]]> </text> </staticText> <textField> <reportElement x = "414" y = "0" width = "121" height = "15" /> <textElement textAlignment = "Center" verticalAlignment = "Middle"> <font size = "9" /> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle" />
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Les codes java pour le remplissage des rapports restent inchangés. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sont comme indiqué ci-dessous -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource =
new JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme indiqué ci-dessous -
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;
}
}
Le contenu du fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme indiqué ci-dessous -
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;
}
}
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.
Le fichier d'importation - baseBuild.xml est choisi dans le chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme suit -
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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -
Ici, nous pouvons voir que les noms de pays sont classés par ordre alphabétique décroissant.
Les expressions de rapport sont les fonctionnalités puissantes de JasperReports, qui nous permettent d'afficher des données calculées sur un rapport. Les données calculées sont les données qui ne sont pas des données statiques et qui ne sont pas spécifiquement transmises en tant que paramètre de rapport ou champ de source de données. Les expressions de rapport sont construites à partir de la combinaison de paramètres de rapport, de champs et de données statiques. Le langage Java est utilisé par défaut pour écrire des expressions de rapport. D'autres langages de script pour les expressions de rapport comme le langage de script Groovy, JavaScript ou le script BeanShell sont pris en charge par les compilateurs JasperReports.
Ce chapitre vous explique - comment fonctionnent les expressions de rapport, en supposant qu'elles ont été écrites en langage Java uniquement. Dans un modèle de rapport JRXML, il existe plusieurs éléments qui définissent les expressions comme -
- <variableExpression>
- <initialValueExpression>
- <groupExpression>
- <printWhenExpression>
- <imageExpression>
- <textFieldExpression>
Déclaration d'expression
Fondamentalement, toutes les expressions de rapport sont des expressions Java, qui peuvent référencer les champs de rapport, les variables de rapport et les paramètres de rapport.
Référence de champ dans l'expression
Pour utiliser une référence de champ de rapport dans une expression, le nom du champ doit être placé entre $F{et} séquences de caractères, comme indiqué ci-dessous -
<textfieldexpression>
$F{Name}
</textfieldexpression>
Voici un morceau de code de notre fichier JRXML existant (chapitre Modèles de rapports) -
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
Référence de variable dans l'expression
Pour référencer une variable dans une expression, il faut mettre le nom de la variable entre $V{et} comme le montre l'exemple ci-dessous -
<textfieldexpression>
"Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>
Référence de paramètre dans l'expression
Pour référencer un paramètre dans une expression, le nom du paramètre doit être placé entre $P{et} comme le montre l'exemple ci-dessous -
<textfieldexpression>
"ReportTitle : " + $P{Title}
</textfieldexpression>
Voici un morceau de code de notre fichier JRXML existant, qui montre le référencement de paramètre dans une expression. (JRXML du chapitre Report Designs ) -
<textField isBlankWhenNull = "true" bookmarkLevel = "1">
<reportElement x = "0" y = "10" width = "515" height = "30"/>
<textElement textAlignment = "Center">
<font size = "22"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{ReportTitle}]]>
</textFieldExpression>
<anchorNameExpression>
<![CDATA["Title"]]>
</anchorNameExpression>
</textField>
<textField isBlankWhenNull = "true">
<reportElement x = "0" y = "40" width = "515" height = "20"/>
<textElement textAlignment = "Center">
<font size = "10"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{Author}]]>
</textFieldExpression>
</textField>
Comme vous l'avez vu ci-dessus, les références de paramètre, de champ et de variable sont en fait de vrais objets Java. Connaissant leur classe à partir du paramètre, du champ ou de la déclaration de variable effectuée dans le modèle de rapport, nous pouvons même appeler des méthodes sur ces références d'objet dans les expressions.
L'exemple suivant montre - comment extraire et afficher la première lettre du champ de rapport java.lang.String "Nom" -
<textFieldExpression>
$F{Name}.substring(0, 1)
</textFieldExpression>
Référence de bundle de ressources dans l'expression
Pour référencer une ressource dans une expression, la clé doit être placée entre$R{et} comme le montre l'exemple ci-dessous -
<textfieldexpression>
$R{report.title}
</textfieldexpression>
En fonction des paramètres régionaux fournis à l'exécution et de la clé report.title , l'ensemble de ressources associé au modèle de rapport est chargé. Par conséquent, le titre du rapport est affiché en extrayant la valeur String de l'ensemble de ressources. Vous trouverez plus d'informations sur l'internationalisation dans le chapitre Internationalisation .
Calculatrice
Calculator est une entité de JasperReports, qui évalue les expressions et incrémente les variables ou les ensembles de données au moment du remplissage du rapport. Pendant le processus de compilation, les informations sont produites et stockées dans le rapport de compilation par le compilateur. Ces informations sont utilisées pendant le temps de remplissage du rapport pour créer une instance de la classe net.sf.jasperreports.engine.fill.JRCalculator.
Le fichier source Java est généré et compilé par des compilateurs de rapports basés sur Java à la volée. Cette classe générée est une sous-classe de JRCalculator, et le bytecode produit en la compilant est stocké dans l'objet JasperReport. Ce bytcode est chargé au moment du remplissage du rapport et la classe résultante est instanciée pour obtenir l'objet calculateur nécessaire à l'évaluation de l'expression.
Expressions conditionnelles
JasperReports ne prend pas en charge les instructions if-else lors de la définition d'expressions variables. Au lieu de cela, vous pouvez utiliser les opérateurs ternaires{cond} ? {statement 1} : {statement 2}. Cet opérateur peut être imbriqué dans une expression Java pour obtenir la sortie souhaitée en fonction de plusieurs conditions.
Exemple d'expression conditionnelle dans le rapport
Modifions le modèle de rapport existant (Chapter Report Designs ) et ajoutons une expression conditionnelle pour le champ country. Le modèle de rapport révisé (jasper_report_template.jrxml) est le suivant. Enregistrez-le dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test -
<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
"//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation =
"http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name = "jasper_report_template" pageWidth = "595" pageHeight = "842"
columnWidth = "515" leftMargin = "40" rightMargin = "40"
topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<sortField name = "country" order = "Descending"/>
<sortField name = "name"/>
<title>
<band height = "70">
<line>
<reportElement x = "0" y = "0" width = "515" height = "1"/>
</line>
<textField isBlankWhenNull = "true" bookmarkLevel = "1">
<reportElement x = "0" y = "10" width = "515" height = "30"/>
<textElement textAlignment = "Center">
<font size = "22"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{ReportTitle}]]> </textFieldExpression> <anchorNameExpression> <![CDATA["Title"]]> </anchorNameExpression> </textField> <textField isBlankWhenNull = "true"> <reportElement x = "0" y = "40" width = "515" height = "20"/> <textElement textAlignment = "Center"> <font size = "10"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{Author}]]>
</textFieldExpression>
</textField>
</band>
</title>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
backcolor = "#70A9A9" />
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
</box>
<textElement />
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true" />
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true" />
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
backcolor = "#E5ECF9" />
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
</box>
<textElement />
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9" />
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}.isEmpty() ? "NO COUNTRY" : $F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle" />
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Les codes java pour le remplissage des rapports sont les suivants. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sont comme -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource =
new JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme -
package com.tutorialspoint;
public class DataBean {
private String name;
private String country;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
Nous ajouterons un nouvel enregistrement avec le champ country vide dans notre liste de bean Java. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme -
package com.tutorialspoint;
import java.util.ArrayList;
public class DataBeanList {
public ArrayList<DataBean> getDataBeanList() {
ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();
dataBeanList.add(produce("Manisha", "India"));
dataBeanList.add(produce("Dennis Ritchie", "USA"));
dataBeanList.add(produce("V.Anand", "India"));
dataBeanList.add(produce("Shrinath", "California")); dataBeanList.add(produce("Tanmay", ""));
return dataBeanList;
}
/**
* This method returns a DataBean object,
* with name and country set in it.
*/
private DataBean produce(String name, String country) {
DataBean dataBean = new DataBean();
dataBean.setName(name);
dataBean.setCountry(country);
return dataBean;
}
}
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est donné ci-dessous.
Le fichier d'importation - baseBuild.xml est choisi dans le chapitre Configuration de l' environnement et doit être placé dans le même répertoire que build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class = com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes
compilereportdesing:
[jrc] Compiling 1 report design files.
[jrc] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[jrc] log4j:WARN Please initialize the log4j system properly.
[jrc] log4j:WARN See
http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
[echo] Runnin class : com.tutorialspoint.JasperReportFill
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 5 minutes 5 seconds
C:\tools\jasperreports-5.0.1\test>
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -
Ici, nous pouvons voir que pour le dernier enregistrement, nous n'avions transmis aucune donnée pour le champ pays, "NO COUNTRY" est en cours d'impression.
Les variables de rapport sont des objets spéciaux construits au-dessus de l'expression de rapport.
Les variables de rapport simplifient les tâches suivantes -
Expressions de rapport, largement utilisées dans le modèle de rapport. Ces expressions ne peuvent être déclarées qu'une seule fois à l'aide des variables de rapport.
Les variables de rapport peuvent effectuer divers calculs en fonction des valeurs d'expressions correspondantes telles que le nombre, la somme, la moyenne, la plus basse, la plus élevée, la variance, etc.
Si des variables sont définies dans une conception de rapport, elles peuvent être référencées par de nouvelles variables dans les expressions. Par conséquent, l'ordre dans lequel les variables sont déclarées dans une conception de rapport est important.
Déclaration de variable
Une déclaration de variable est la suivante -
<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
incrementGroup = "CityGroup" calculation = "Count">
<variableExpression>
<![CDATA[Boolean.TRUE]]>
</variableExpression>
</variable>
Comme vu ci-dessus, l'élément <variable> contient un certain nombre d'attributs. Ces attributs sont résumés ci-dessous -
L'attribut de nom
Comme pour les paramètres et les champs , l' attribut name de l'élément </variable> est obligatoire. Il permet de référencer la variable par son nom déclaré dans les expressions du rapport.
L'attribut de classe
L' attribut de classe est également obligatoire et spécifie le nom de classe pour les valeurs de variable. Sa valeur par défaut est java.lang.String . Cela peut être changé en n'importe quelle classe disponible dans le chemin de classe, à la fois au moment de la compilation du rapport et au moment du remplissage du rapport. Le moteur prend en charge la conversion de type dans les expressions de rapport pour lesquelles le jeton $ V {} est utilisé, par conséquent la conversion de type manuelle n'est pas nécessaire.
Calcul
Cet attribut détermine - quel calcul effectuer sur la variable lors du remplissage du rapport. Les sous-sections suivantes décrivent toutes les valeurs possibles pour l'attribut de calcul de l'élément <variable>.
Moyenne - La valeur de la variable est la moyenne de chaque valeur non nulle de l'expression de variable. Valide pour les variables numériques uniquement.
Count - La valeur de la variable est le nombre d'instances non nulles de l'expression de variable.
First - La valeur de la variable est la valeur de la première instance de l'expression de variable. Les valeurs suivantes sont ignorées.
La plus élevée - La valeur de la variable est la valeur la plus élevée de l'expression de variable.
La plus basse - La valeur de variable est la valeur la plus basse de l'expression de variable dans le rapport.
Rien - Aucun calcul n'est effectué sur la variable.
StandardDeviation - La valeur de la variable est l'écart type de toutes les valeurs non nulles correspondant à l'expression du rapport. Valide pour les variables numériques uniquement.
Somme : la valeur de la variable est la somme de toutes les valeurs non nulles renvoyées par l'expression de rapport.
Système - La valeur de la variable est un calcul personnalisé (calculant la valeur de cette variable vous-même, en utilisant la fonctionnalité de scriptlets de JasperReports).
Variance - La valeur de la variable est la variance de toutes les valeurs non nulles renvoyées par l'évaluation de l'expression de la variable de rapport.
Incrementer FactoryClass
Cet attribut détermine la classe utilisée pour calculer la valeur de la variable lors du remplissage de l'enregistrement actuel sur le rapport. La valeur par défaut serait n'importe quelle classe implémentantnet.sf.jasperreports.engine.fill.JRIncrementerFactory. La classe d'usine sera utilisée par le moteur pour instancier des objets incrémenteurs au moment de l'exécution en fonction de l' attribut de calcul défini pour la variable.
IncrementType
Cela détermine quand recalculer la valeur de la variable. Cet attribut utilise des valeurs, comme ci-dessous -
Colonne - La valeur de la variable est recalculée à la fin de chaque colonne.
Group - La valeur de la variable est recalculée lorsque le groupe spécifié par incrementGroup change.
Aucun - La valeur de la variable est recalculée avec chaque enregistrement.
Page - La valeur de la variable est recalculée à la fin de chaque page.
Rapport - La valeur de la variable est recalculée une fois, à la fin du rapport.
IncrementGroup
Cela détermine le nom du groupe auquel la valeur de la variable est recalculée, lorsque incrementType est Group . Cela prend le nom de tout groupe déclaré dans le modèle de rapport JRXML.
ResetType
Cela détermine quand la valeur d'une variable est réinitialisée. Cet attribut utilise des valeurs, comme ci-dessous -
Colonne - La valeur de la variable est réinitialisée au début de chaque colonne.
Group - La valeur de la variable est réinitialisée lorsque le groupe spécifié par incrementGroup change.
Aucun - La valeur de la variable n'est jamais réinitialisée.
Page - La valeur de la variable est réinitialisée au début de chaque page.
Rapport - La valeur de la variable est réinitialisée une seule fois, au début du rapport.
ResetGroup
Cela détermine le nom du groupe auquel la valeur de la variable est réinitialisée, lorsque resetType est Group . Les valeurs de cet attribut seraient le nom de tout groupe déclaré dans le modèle de rapport JRXML.
Variables de rapport intégrées
Il existe quelques variables système intégrées, prêtes à être utilisées dans les expressions, comme suit -
S.NON | Nom et description de la variable |
---|---|
1 | PAGE_NUMBER La valeur de cette variable est son numéro de page actuel. Il peut être utilisé pour afficher à la fois le numéro de page actuel et le nombre total de pages en utilisant une fonction spéciale des éléments de champ de texte JasperReports, l' attribut evaluationTime . |
2 | COLUMN_NUMBER Cette variable contient le numéro de colonne actuel. |
3 | REPORT_COUNT Cette variable de rapport contient le nombre total d'enregistrements traités. |
4 | PAGE_COUNT Cette variable contient le nombre d'enregistrements qui ont été traités lors de la génération de la page actuelle. |
5 | COLUMN_COUNT Cette variable contient le nombre d'enregistrements traités lors de la génération de la colonne actuelle. |
6 | GroupName_COUNT Le nom de cette variable est dérivé du nom du groupe auquel elle correspond, avec le suffixe de la séquence _COUNT. Cette variable contient le nombre d'enregistrements dans le groupe actuel. |
Exemple
Ajoutons une variable (countNumber) à notre modèle de rapport existant (Chapter Report Designs ). Nous préfixerons le décompte à chaque enregistrement. Le modèle de rapport révisé (jasper_report_template.jrxml) est le suivant. Enregistrez-le dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test -
<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
"//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name = "jasper_report_template" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription>
<![CDATA[country]]>
</fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription>
<![CDATA[name]]>
</fieldDescription>
</field>
<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>
Les codes java pour le remplissage des rapports restent inchangés. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sont comme indiqué ci-dessous -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource =
new JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme indiqué ci-dessous -
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;
}
}
Le contenu du fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme indiqué ci-dessous -
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;
}
}
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.
Le fichier d'importation - baseBuild.xml est sélectionné dans le chapitre Configuration de l'environnement et doit être placé dans le même répertoire que build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc"
classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28: warning:
'includeantruntime' was not set, defaulting to build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme dans l'écran ci-dessous -
Ici, nous voyons que le décompte est préfixé pour chaque enregistrement.
Nous avons discuté de la structure d'un modèle de rapport simple dans le chapitre Mise en route . Dans le même esprit, JasperReports structure le modèle de rapport en plusieurs sections. Les sections sont des parties du rapport qui ont une hauteur spécifiée et peuvent contenir des objets de rapport tels que des lignes, des rectangles, des images ou des champs de texte.
Le moteur de rapport parcourt les enregistrements virtuels de la source de données de rapport fournie, au moment du remplissage du rapport. En fonction du comportement défini de chaque section, le moteur rend ensuite chaque section de rapport le cas échéant. Par exemple, la section de détail est rendue pour chaque enregistrement de la source de données. Lorsque des sauts de page se produisent, les sections d'en-tête et de pied de page sont rendues selon les besoins.
Dans JasperReports, les sections terminologie et rapport sont également appelées report bands. Les sections sont constituées d'une ou plusieurs bandes. Ces sections sont remplies à plusieurs reprises au moment de la création du rapport et préparent le document final.
Sections principales
Un modèle de rapport dans JasperReports comprend les sections principales suivantes -
<title></title>
<pageheader></pageheader>
<columnheader></columnheader>
<groupheader></groupheader>
<detail></detail>
<groupfooter></groupfooter>
<columnfooter></columnfooter>
<pagefooter></pagefooter>
<lastpagefooter></lastpagefooter>
<summary></summary>
<nodata></nodata>
<background></background>
Le tableau suivant résume chacune des sections -
S.NON | Section et description |
---|---|
1 | Title Cette section n'apparaît qu'une seule fois au début du rapport. |
2 | Page Header Cette section apparaît au début de chaque page du document généré. |
3 | Column Header Cette section apparaît au début de chaque colonne du document généré. Si le rapport n'a qu'une seule colonne définie, les sections d'en-tête et de pied de page de colonne sont ignorées. |
4 | Group Header Cette section est introduite par un groupe de rapports (chapitre Groupes ). Chaque fois que l'expression de regroupement change de valeur, la section d'en-tête de groupe est imprimée au-dessus de la section de détail. Si plusieurs groupes sont définis, l'en-tête du groupe est imprimé dans l'ordre de définition du groupe. |
5 | Detail Cette section est répétée pour chaque ligne de données fournie par la source de données du rapport. La section de détail peut être constituée de plusieurs bandes. |
6 | Group Footer Cette section est introduite par un groupe de rapports (chapitre Groupes ). La section de pied de page de groupe est imprimée sous la section de détail avant que la valeur de l'expression de regroupement ne change. Le pied de page du groupe est toujours imprimé pour la dernière ligne de données dans la source de données. Si plusieurs groupes sont définis, le pied de page du groupe est imprimé dans l'ordre inverse de la définition du groupe. |
sept | Column Footer Cette section apparaît au bas de chaque colonne. Si le nombre de colonnes du rapport est égal à 1, les sections d'en-tête et de pied de page de colonne sont ignorées. |
8 | Page Footer Cette section apparaît au bas de chaque page. |
9 | Last Page Footer Cette section remplace le pied de page normal de la dernière page du rapport. Dans le cas où la section de résumé est également présente, il se peut que ce ne soit pas la toute dernière page du document. Cette section est parfois utile lorsque des informations récapitulatives doivent être affichées au bas de la dernière page. |
dix | Summary Cette section n'apparaît qu'une seule fois à la fin du rapport. |
11 | No Data Cette section est imprimée lorsque la propriété du rapport When No Data Print est définie sur No Data Section. Si la section <noData> est définie dans le modèle de rapport, et si la source de données est vide, alors la section <noData> sera la seule prise en compte au moment du remplissage, et son contenu produira la sortie du rapport. |
12 | Background La section d'arrière-plan est affichée sur chaque page et ne peut pas déborder sur la page suivante. Les éléments placés sur cette section sont évalués au moment de l'initialisation de la page et sont affichés en arrière-plan. Tous les autres objets de page sont affichés au-dessus des objets d'arrière-plan. Cette section est utile pour créer des filigranes de page. |
Relation entre les sections, les éléments et les attributs
Le diagramme suivant montre la relation entre les éléments et les attributs dans une section d'un rapport.
Éléments de la section
Toutes les sections de rapport mentionnées ci-dessus sont facultatives. Mais tout modèle de rapport aura au moins une de ces sections. Chacune de ces sections contient un seul <band> élément comme seul sous-élément. Un <band> peut contenir zéro ou plusieurs sous-éléments suivants -
<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> ou <elementGroup>
Chacun de ces éléments doit contenir un seul <reportElement> comme premier élément (sauf elementGroup). Un <reportElement> détermine comment les données sont présentées pour cet élément particulier. Contrairement aux variables et aux paramètres, il n'est pas nécessaire que les éléments de rapport aient un nom, car normalement, vous n'avez pas besoin d'obtenir un élément individuel dans un modèle de rapport.
Le tableau ci-dessous résume les attributs de <reportElement> -
Attribut | La description | Valeurs valides |
---|---|---|
X | Spécifie la coordonnée x de l'élément de bande. | Une valeur entière indiquant la coordonnée x de l'élément en pixels. Cet attribut est obligatoire. |
y | Spécifie la coordonnée y de l'élément de bande. | Une valeur entière indiquant la coordonnée y de l'élément en pixels. Cet attribut est obligatoire. |
largeur | Spécifie la largeur de l'élément de bande. | Une valeur entière indiquant la largeur de l'élément en pixels. Cet attribut est obligatoire. |
la taille | Spécifie la hauteur de l'élément de bande. | Une valeur entière indiquant la hauteur de l'élément en pixels. Cet attribut est obligatoire. |
clé | Identificateur unique de l'élément de bande. | Une valeur de chaîne unique. |
stretchType | Spécifie comment l’élément s’étire lorsque la bande contenant s’étire | NoStretch (default) - L'élément ne s'étire pas. RelativeToTallestObject - L'élément s'étire pour accueillir l'objet le plus haut de son groupe. RelativeToBand - L'élément s'étire pour s'adapter à la hauteur du bracelet. |
type de position | Spécifie la position de l'élément lorsque la bande s'étire. | Float - L'élément se déplacera en fonction de la taille des éléments environnants. FixRelativeToTop (default) - L'élément conservera une position fixe par rapport au sommet du groupe. FixRelativeToBottom - L'élément maintiendra une position fixe par rapport au bas de la bande. |
isPrintRepeatedValues | Spécifie si des valeurs répétées sont imprimées. | true (default) - Les valeurs répétées seront imprimées. false - Les valeurs répétées ne seront pas imprimées. |
mode | Spécifie le mode d'arrière-plan de l'élément | Opaque, transparent |
isRemoveLineWhenBlank | Spécifie si l'élément doit être supprimé lorsqu'il est vide et qu'il n'y a pas d'autres éléments dans le même espace horizontal. | vrai faux |
isPrintInFirstWholeBand | Spécifie si l'élément doit être imprimé dans une bande entière, c'est-à-dire une bande qui n'est pas divisée entre les pages ou les colonnes du rapport. | vrai faux |
isPrintWhenDetailOverFlows | Spécifie si l'élément sera imprimé lorsque la bande déborde vers une nouvelle page ou colonne. | vrai faux |
printWhenGroupChanges | Spécifie que l'élément sera imprimé lorsque le groupe spécifié change. | Une valeur de chaîne. |
couleur de premier plan | Spécifie la couleur de premier plan de l'élément. | Soit une valeur RVB hexadécimale précédée du caractère #, soit l'une des valeurs prédéfinies suivantes: noir, bleu, cyan, gris foncé, gris, vert, gris clair, magenta, orange, rose, rouge, jaune, blanc. |
couleur de fond | Spécifie la couleur d'arrière-plan de l'élément. | Identique aux valeurs valides pour la couleur |
Attributs de section
Voici les attributs d'une section de rapport -
la taille
La hauteur de la section spécifie la hauteur en pixels de cette section particulière et est très importante dans la conception globale du rapport.
Imprimer lorsque l'expression
Expression booléenne qui détermine si la section doit être imprimée ou non.
Fractionnement autorisé
Un indicateur indiquant si la section est autorisée à se diviser lorsqu'elle ne tient pas dans la page en cours. Si c'est vrai, la section sera transférée à la page suivante. Notez que dans le cas où la section ne rentre pas sur la page suivante, la section sera divisée quelle que soit la valeur de l'indicateur. splitType peut prendre les valeurs suivantes -
splitType = "Stretch:" Divise le contenu étiré. Si la section s'étend sur la page actuelle (si l'espace disponible est inférieur à la hauteur déclarée), la région qui est ajoutée à la hauteur d'origine est autorisée à se diviser sur la page suivante.
splitType = "Prevent:" Empêche le fractionnement à la première tentative. Si la section ne rentre pas sur la page suivante, le fractionnement se produit normalement, car la prévention du fractionnement de bande n'est efficace qu'à la première tentative de fractionnement.
splitType = "Immediate:" Fractionner immédiatement. Le groupe est autorisé à se diviser n'importe où sauf au-dessus, son élément le plus haut.
Exemple
Pour illustrer chaque section, écrivons un modèle de rapport (jasper_report_template.jrxml). Enregistrez ce fichier dansC:\tools\jasperreports-5.0.1\testannuaire. Dans ce fichier, nous afficherions un texte dans chacune des sections (dont nous avons discuté ci-dessus). Le contenu du fichier est indiqué ci-dessous -
<?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>
Le code java pour remplir et générer le rapport est donné ci-dessous. Sauvegardons ce fichierJasperReportFill.java dans le répertoire 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();
}
}
}
Ici, nous utilisons une instance de JREmptyDataSource lors du remplissage des rapports pour simuler une source de données avec un enregistrement, mais avec tous les champs de cet enregistrement unique étant null.
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est comme ci-dessous.
Le fichier d'importation - baseBuild.xml est extrait du chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc"
classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme suit -
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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme dans l'écran ci-dessous -
Ici, nous pouvons voir dans chacune des sections un texte est imprimé. Il est à noter que comme JRXML contient un élément <lastPageFooter>, il sera affiché dans la dernière page du rapport au lieu de l'élément <pageFooter> affiché. Les éléments <columnHeader> et <columnFooter> ne seront affichés sur le rapport que s'il comporte plus d'une colonne.
Les groupes dans JasperReports aident à organiser les données du rapport de manière logique. Un groupe de rapports représente une séquence d'enregistrements consécutifs dans la source de données, qui ont quelque chose en commun, comme la valeur de certains champs de rapport. Un groupe de rapports est défini par l'élément <group>. Un rapport peut avoir n'importe quel nombre de groupes. Une fois déclarés, les groupes peuvent être référés tout au long du rapport.
Un groupe de rapports comprend trois éléments -
Expression de groupe - Ceci indique les données qui doivent changer pour démarrer un nouveau groupe de données.
Section d'en-tête de groupe - Aide à placer l'étiquette au début des données groupées.
Section de pied de page de groupe - Aide à placer l'étiquette à la fin des données groupées.
Pendant l'itération dans la source de données au moment du remplissage du rapport, si la valeur de l'expression de groupe change, une rupture de groupe se produit et les sections <groupFooter> et <groupHeader> correspondantes sont insérées dans le document résultant.
Le mécanisme de groupe de rapports n'effectue aucun tri sur les données fournies par la source de données. Le regroupement de données fonctionne comme prévu uniquement lorsque les enregistrements de la source de données sont déjà classés en fonction des expressions de groupe utilisées dans le rapport.
Attributs de groupe
L'élément <group> contient des attributs qui nous permettent de contrôler la disposition des données groupées. Les attributs sont résumés dans le tableau ci-dessous -
S.NON | Attribut et description |
---|---|
1 | name Ceci est obligatoire. Il fait référence au groupe dans les expressions de rapport par nom. Il suit les mêmes conventions de dénomination que celles que nous avons mentionnées pour les paramètres, les champs et les variables de rapport. Il peut être utilisé dans d'autres attributs JRXML lorsque vous souhaitez faire référence à un groupe de rapports particulier. |
2 | isStartNewColumn Lorsqu'il est défini sur true , chaque groupe de données commencera sur une nouvelle colonne. La valeur par défaut est false . |
3 | isStartNewPage Lorsqu'il est défini sur true , chaque groupe de données commencera sur une nouvelle page. La valeur par défaut est false . |
4 | isResetPageNumber Lorsqu'il est défini sur true , le numéro de page du rapport sera réinitialisé chaque fois qu'un nouveau groupe démarre. La valeur par défaut est false. |
5 | isReprintHeaderOnEachPage Lorsqu'il est défini sur true , l'en-tête du groupe sera réimprimé sur chaque page. La valeur par défaut est false . |
6 | minHeightToStartNewPage Définit la quantité minimale d'espace vertical nécessaire en bas de la colonne pour placer l'en-tête de groupe sur la colonne actuelle. Le montant est spécifié en unités de rapport. |
sept | footerPosition Rend la position du pied de page du groupe sur la page, ainsi que son comportement par rapport aux sections de rapport qui le suivent. Sa valeur peut être: Normal , StackAtBottom , ForceAtBottom et CollateAtBottom . La valeur par défaut est Normal . |
8 | keepTogether Lorsqu'il est défini sur true , empêche le groupe de se scinder lors de sa première tentative de rupture. |
Exemple
Ajoutons un groupe (CountryGroup) au modèle de rapport existant (Chapter Report Designs ). L'occurrence de chaque pays est comptée et le nombre est affiché comme pied de page du groupe. Dans l'en-tête de groupe, le nombre de chaque enregistrement est préfixé. Le modèle de rapport révisé (jasper_report_template.jrxml) est le suivant. Enregistrez-le dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test -
<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
"//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name = "jasper_report_template" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<sortField name = "country" order = "Descending"/>
<sortField name = "name"/>
<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>
Les codes java pour le remplissage des rapports restent inchangés. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sont comme indiqué ci-dessous -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource =
new JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme ci-dessous -
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;
}
}
Le contenu du fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme indiqué ci-dessous -
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;
}
}
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est comme ci-dessous.
Le fichier d'importation - baseBuild.xml est extrait du chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28: warning:
'includeantruntime' was not set, defaulting to build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme dans l'écran ci-dessous -
Ici, on voit que chaque pays est groupé et le décompte d'occurrence de chaque pays est affiché en pied de page de chaque groupe.
Un rapport contient des éléments de texte et chacun d'entre eux peut avoir ses propres paramètres de police. Ces paramètres peuvent être spécifiés à l'aide de la touche <font> balise disponible dans la balise <textElement>. Un rapport peut définir un certain nombre de polices. Une fois définis, ils peuvent être utilisés comme paramètres de police par défaut ou de base pour d'autres définitions de police dans tout le rapport.
Polices de rapport
Une police de rapport est un ensemble de paramètres de police, déclarés au niveau du rapport. Une police de rapport peut être réutilisée dans tout le modèle de rapport lors de la définition des propriétés de police des éléments de texte.
Les polices de rapport sont désormais obsolètes. N'utilisez pas les éléments <reportFont /> déclarés dans le document lui-même. Utilisez plutôt l'élément <style />.
Attributs de police
Le tableau ci-dessous résume les principaux attributs du <font> élément -
S.NON | Attribut et description |
---|---|
1 | fontName Le nom de police, qui peut être le nom d'une police physique, une police logique ou le nom d'une famille de polices à partir des extensions de police JasperReports enregistrées. |
2 | size La taille de la police mesurée en points. La valeur par défaut est 10. |
3 | isBold L'indicateur spécifiant si une police en gras est requise. La valeur par défaut est false. |
4 | isItalic L'indicateur spécifiant si une police italique est requise. La valeur par défaut est false. |
5 | isUnderline L'indicateur spécifiant si la décoration du texte souligné est requise. La valeur par défaut est false. |
6 | isStrikeThrough L'indicateur spécifiant si la décoration de texte barré est requise. La valeur par défaut est false. |
sept | pdfFontName Le nom d'une police PDF équivalente requise par la bibliothèque iText lors de l'exportation de documents au format PDF. |
8 | pdfEncoding L'encodage de caractères PDF équivalent, également requis par la bibliothèque iText. |
9 | isPdfEmbedded L'indicateur qui spécifie si la police doit être incorporée dans le document lui-même. La valeur par défaut est false. S'il est défini sur true, permet d'afficher le document PDF sans aucun problème. |
Types de polices
Dans JasperReports, les polices peuvent être classées comme suit:
Logical Fonts- Cinq types de polices, reconnus par la plate-forme Java depuis la version 1.0, sont appelés polices logiques. Ce sont -Serif, SansSerif, Monospaced, Dialog, and DialogInput. Ces polices logiques ne sont pas de véritables bibliothèques de polices installées n'importe où sur le système. Ce sont simplement des noms de type de police reconnus par le runtime Java. Ceux-ci doivent être mappés à une police physique installée sur le système.
Physical Fonts- Ces polices sont les bibliothèques de polices réelles constituées, par exemple, de polices TrueType ou PostScript Type 1. Les polices physiques peuvent être Arial, Time, Helvetica, Courier ou n'importe quel nombre d'autres polices, y compris les polices internationales.
Font Extensions- La bibliothèque JasperReports peut utiliser des polices enregistrées à la volée au moment de l'exécution, grâce à sa prise en charge intégrée des extensions de polices. Une liste de familles de polices peut être mise à la disposition des JasperReports en utilisant l'extension de police. Ceux-ci sont constitués de polices de caractères similaires et prennent en charge des paramètres régionaux spécifiques.
Comme décrit dans le tableau ci-dessus, nous devons spécifier dans l'attribut fontName le nom d'une police physique, le nom d'une police logique ou le nom d'une famille de polices à partir des extensions de police JasperReports enregistrées.
Nom de la police PDF
La bibliothèque JasperReports utilise la bibliothèque iText, lors de l'exportation de rapports au format PDF (Portable Document Format). Les fichiers PDF peuvent être visualisés sur différentes plates-formes et auront toujours le même aspect. C'est en partie parce que dans ce format, il existe une manière spéciale de traiter les polices. L' attribut fontName n'est d'aucune utilité lors de l'exportation au format PDF. L'attribut pdfFontName existe pour lequel nous devons spécifier les paramètres de police.
La bibliothèque iText sait comment gérer les polices intégrées et les fichiers TTF et reconnaît les noms de polices intégrés suivants -
- Courier
- Courier-Bold
- Courier-BoldOblique
- Courier-Oblique
- Helvetica
- Helvetica-Bold
- Helvetica-BoldOblique
- Helvetica-Oblique
- Symbol
- Times-Roman
- Times-Bold
- Times-BoldItalic
- Times-Italic
- ZapfDingbats
Conformément aux prérequis de la bibliothèque iText, pour travailler avec des polices, nous devons spécifier l'un des éléments suivants comme nom de police -
Un nom de police intégré dans la liste ci-dessus.
Le nom d'un fichier TTF (True Type Font), qu'il peut localiser sur le disque.
Le vrai nom de la police, à condition que le fichier TTF contenant la police ait été préalablement enregistré avec iText ou qu'un alias ait été défini lors de l'enregistrement de la police.
Sur la base des pré-requis ci-dessus, l' attribut pdfFontName peut contenir l'une des valeurs suivantes -
Le nom d'une police PDF intégrée dans la liste ci-dessus.
Le nom d'un fichier TTF qui peut être localisé sur le disque au moment de l'exécution lors de l'exportation au format PDF.
Le vrai nom d'une police enregistrée.
Le suffixe de la clé (la partie après net.sf.jasperreports.export.pdf.font ) pour une police enregistrée avec iText en tant que fichier de police.
Polices par défaut et héritage
Chaque élément de texte hérite des attributs de police et de style de son élément parent, qui hérite à son tour de ces attributs de son parent. Si aucun style et / ou police n'est défini pour les éléments, le style par défaut (et / ou police - mais il est désormais obsolète) déclaré dans l'élément racine <jasperReport /> sera appliqué.
La définition de styles ou de polices par défaut dans JasperReports n'est pas obligatoire. Si aucune police n'est définie pour un élément donné, le moteur recherche soit les attributs de police hérités, soit, si aucun attribut n'est trouvé de cette manière, il recherche la propriété net.sf.jasperreports.default.font.name dans le fichier / Fichier src / default.jasperreports.properties . Sa valeur définit le nom de la famille de polices à utiliser lorsque les propriétés de police ne sont pas explicitement définies pour un élément de texte ou héritées de son parent.
Les principales propriétés de police par défaut et leurs valeurs définies dans le fichier /src/default.jasperreports.properties sont dans le tableau ci-dessous -
Propriété | La description |
---|---|
net.sf.jasperreports.default.font.name = SansSerif | Le nom de police par défaut. |
net.sf.jasperreports.default.font.size = 10 | La taille de police par défaut. |
net.sf.jasperreports.default.pdf.font.name = Helvetica | La police PDF par défaut. |
net.sf.jasperreports.default.pdf.encoding = Cp1252 | Le codage de caractères PDF par défaut. |
net.sf.jasperreports.default.pdf.embedded = false | Par défaut, les polices PDF ne sont pas intégrées. |
Exemple
Pour démontrer l'utilisation des polices et des attributs de police afin d'obtenir une apparence de texte particulière, écrivons un nouveau modèle de rapport (jasper_report_template.jrxml). Le contenu du JRXML est comme ci-dessous. Enregistrez-le dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test. Ici, nous afficherons un texte dans le titre du rapport dans différents formats de police.
<?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>
Le code java pour remplir et générer le rapport est indiqué ci-dessous. Sauvegardons ce fichierJasperFontsReportFill.java dans le répertoire 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();
}
}
}
Ici, nous utilisons une instance de JREmptyDataSource lors du remplissage des rapports pour simuler une source de données avec un enregistrement, mais avec tous les champs étant nuls .
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.
Le fichier d'importation - baseBuild.xml est choisi dans le chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the report
stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperFontsReportFill (viewFullReport est la cible par défaut) comme -
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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -
Ici, nous pouvons voir que le texte "Bienvenue dans TutorialsPoint" est affiché dans différents formats de police.
Dans JasperReports, travailler avec des textes nécessite des outils dédiés pour traiter à la fois les représentations de caractères et les propriétés de mise en forme du texte. Tout texte peut être considéré comme une séquence de caractères avec une structure de représentation particulière. L'apparence du texte comprend à la fois les paramètres de mise en page (et de paragraphe) et de police. Mais si dans la plupart des cas, la mise en page du texte reste invariante, les paramètres de police peuvent changer lors de l'exécution du rapport dans différents paramètres régionaux.
Nous savons que différentes langues ont besoin de jeux de caractères différents en ce qui concerne la représentation de caractères spécifiques. Par conséquent, travailler avec des textes signifie travailler avec des polices. Cependant, une discussion détaillée sur l'utilisation des polices dans JasperReports est disponible dans le chapitre Polices de rapport .
L'une des principales caractéristiques concernant le contenu textuel d'un rapport donné est la possibilité de l'internationaliser. Cela signifie que nous pouvons exécuter le rapport dans différents environnements localisés, en utilisant différentes langues et d'autres paramètres de localisation sans aucune modification codée en dur. Le codage des caractères est une caractéristique importante lorsqu'un rapport est destiné à être internationalisé.
Encodage de caractère
Un caractère est la plus petite unité d'écriture véhiculant une information significative. C'est un concept abstrait, un personnage n'a pas d'apparence visuelle. «Majuscule Latin A» est un caractère différent de «Latin minuscule a» et de «A cyrillique majuscule» et «Alpha grec majuscule».
Une représentation visuelle d'un personnage est connue sous le nom de glyph. Un certain ensemble de glyphes est appelé unfont. «Latin A majuscule», «cyrillique A majuscule» et «alpha grec majuscule» peuvent avoir des glyphes identiques, mais ce sont des caractères différents. En même temps, les glyphes pour "majuscule Latin A" peuvent être très différents dans les chancelleries Times New Roman, Gill Sans et Poetica en italique, mais ils représentent toujours le même caractère.
L'ensemble des caractères disponibles est appelé un répertoire de caractères . L'emplacement (index) d'un caractère donné dans un répertoire est connu comme sa position de code, ou point de code. La méthode de représentation numérique d'un point de code dans un répertoire donné est appeléecharacter encoding.
Les codages sont normalement exprimés en octets. Un octet est un groupe de huit chiffres binaires, c'est-à-dire huit uns et zéros. Un octet peut exprimer une plage numérique entre 0 et 255, ou entre 0x00 et 0xFF, pour utiliser la notation hexadécimale.
Unicode
Un Unicode est un répertoire de caractères qui contient la plupart des caractères utilisés dans les langues du monde. Il peut accueillir des millions de caractères et en contient déjà des centaines de milliers. Unicode est divisé en "plans" de 64K caractères. Le seul utilisé dans la plupart des cas est le premier avion, connu sous le nom de plan multilingue de base, ou BMP.
UTF-8 est l'encodage recommandé. Il utilise un nombre variable d'octets pour représenter différents caractères.
Dans un fichier JRXML, l'attribut de codage est spécifié dans l'en-tête. Il est utilisé au moment de la compilation du rapport pour décoder le contenu XML. Par exemple, si le rapport contient uniquement des mots français et des caractères tels que ç, é, â, alors le codage ISO-8859-1 (aka Latin-1) est suffisant -
<?xml version = "1.0" encoding = "ISO-8859-1"?>
Comme vu ci-dessus, idéalement, nous pouvons choisir l'ajustement de l'encodage au jeu de caractères minimal, qui peut représenter correctement tous les caractères du document. Mais dans le cas de documents multilingues (c'est-à-dire des documents contenant des mots épelés en plusieurs langues), il faut choisir l'encodage adapté au jeu de caractères minimal, capable de représenter correctement tous les caractères du document, même s'ils appartiennent à des langues différentes. L'un des encodages de caractères capables de gérer des documents multilingues est leUTF-8, utilisée comme valeur de codage par défaut par JasperReports.
Les textes sont généralement conservés dans des fichiers de regroupement de ressources plutôt que dans le document lors de l'internationalisation. Ainsi, il y a des cas où le JRXML lui-même semble complètement compatible ASCII, mais les rapports générés à l'exécution contiennent des textes illisibles avec ASCII. Par conséquent, pour un certain type de formats d'exportation de documents (tels que CSV, HTML, XHTML, XML et texte), il faut également connaître le codage du document généré. Différentes langues sont prises en charge par différents encodages de caractères. Ainsi, à chaque fois, nous devons exécuter un rapport dans un environnement localisé. De plus, nous devons savoir quel est le codage de caractères le plus approprié pour la langue du document généré. Dans ce cas, la propriété de codage définie dans le fichier JRXML lui-même peut ne pas être plus utile.
Pour résoudre ce type de problèmes, nous pouvons utiliser une propriété de client d'exportation appelée net.sf.jasperreports.export.character.encoding . Cette propriété personnalisée d'exportation est par défaut UTF-8 et est présente dans JasperReports.
Cette valeur par défaut est définie dans le fichier default.jasperreports.properties . Pour des options plus spécifiques au moment de l'exportation, le paramètre d'exportation CHARACTER_ENCODING est également disponible.
Exemple
Pour démontrer l'utilisation du support Unicode dans Jasperreports, écrivons un nouveau modèle de rapport (jasper_report_template.jrxml). Save it to C:\tools\jasperreports-5.0.1\testannuaire. Ici, nous afficherons un texte dans différentes langues en utilisant les caractères Unicode (\ uXXXX). Tout caractère encodé avec UTF-8 peut être représenté en utilisant uniquement son code hexadécimal à 4 chiffres. Par exemple, la lettre grecque Γ peut être écrite comme \ u0393. Lorsqu'une telle notation est rencontrée, le moteur demande la représentation de caractère appropriée dans le jeu de caractères, et seul ce caractère particulier sera imprimé. Le contenu du JRXML est comme ci-dessous -
<?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>
Dans le fichier ci-dessus, nous pouvons voir la présence de l'encodage UTF-8. Les morceaux de texte Unicode localisés sont également stockés dans les paramètres du document.
Le code java pour remplir et générer le rapport est le suivant. Sauvegardons ce fichierJasperUnicodeReportFill.java dans le répertoire 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();
}
}
}
Ici, nous utilisons une instance de JREmptyDataSource lors du remplissage des rapports pour simuler une source de données avec un enregistrement, mais avec tous les champs de cet enregistrement unique étant null .
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est comme ci-dessous.
Le fichier d'importation - baseBuild.xml est choisi dans le chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the report
stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperUnicodeReportFill (viewFullReport est la cible par défaut) comme suit -
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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -
Ici, nous pouvons voir que le texte affiché est dans différentes langues. Nous voyons également que les langues sont regroupées sur la même page et également mélangées dans le même élément de texte.
JasperReports a une fonctionnalité <style> qui permet de contrôler les propriétés du texte dans un modèle de rapport. Cet élément est une collection de paramètres de style déclarés au niveau du rapport. Les propriétés telles que la couleur de premier plan, la couleur d'arrière-plan, que la police soit en gras, en italique ou normale, la taille de la police, une bordure pour la police et de nombreux autres attributs sont contrôlées par l'élément <style>. Les styles peuvent étendre d'autres styles et ajouter ou remplacer les propriétés du style parent.
Propriétés du style
Un élément <style> a de nombreux attributs. Certains des plus couramment utilisés sont répertoriés dans le tableau ci-dessous -
S.NON | Attribut et description |
---|---|
1 | name Est obligatoire. Il doit être unique car il fait référence au style de rapport correspondant dans tout le rapport. |
2 | isDefault Indique si ce style est le style par défaut du document. |
3 | style Est une référence au style parent. |
4 | mode Spécifie la transparence de l'élément. Les valeurs possibles sont Opaque et Transparent . |
5 | forecolor Est la couleur de premier plan de l'objet. |
6 | backcolor Est la couleur d'arrière-plan de l'objet. |
sept | fill Détermine le motif de remplissage utilisé pour remplir l'objet. Pour le moment, la valeur unique autorisée est Solid . |
6 | radius Spécifie le rayon de l'arc d'angle du rectangle. |
sept | scaleImage Spécifie l'échelle des images uniquement. Valeurs possibles: Clip, FillFrame, RetainShape, RealHeight et RealSize . |
8 | hAlign Spécifie l'alignement horizontal. Valeurs possibles: Left, Center, Right et Justified . |
9 | vAlign Spécifie l'alignement vertical. Valeurs possibles: Haut, Milieu et Bas . |
dix | rotation Spécifie la rotation de l'élément. Valeurs possibles: None, Left, Right et UpsideDown . |
11 | lineSpacing Spécifie l'espacement des lignes entre les lignes de texte. Valeurs possibles: Single, 1_1_2, Double . |
12 | markup Spécifie le style de balisage pour les textes stylisés. |
13 | fontName Spécifie le nom de la police. |
14 | fontSize Spécifie la taille de la police. |
15 | isBold Indique si le style de police est en gras. |
16 | isItalic Indique si le style de police est en italique. |
17 | isUnderline Indique si le style de police est souligné. |
18 | isStrikeThrough Indique si le style de police est barré. |
19 | pdfFontName Spécifie le nom de la police PDF associée. |
20 | pdfEncoding Spécifie le codage des caractères pour le format de sortie PDF. |
22 | isPdfEmbedded Indique si la police PDF est incorporée. |
23 | pattern Spécifie le modèle de format des textes formatés. |
24 | isBlankWhenNull Indique si une chaîne vide (espace) doit être affichée si l'expression est évaluée à null. |
Styles conditionnels
Dans certaines situations, un style ne doit être appliqué que lorsque certaines conditions sont remplies (par exemple, pour alterner les couleurs de ligne adjacentes dans une section de détail de rapport). Ceci peut être réalisé en utilisant des styles conditionnels.
Un style conditionnel comporte deux éléments -
- une expression de condition booléenne
- un style
Le style est utilisé uniquement si la condition est évaluée à vrai .
Application de styles aux éléments de rapport
Tout type d'élément de rapport peut référencer une définition de style de rapport à l'aide de l'attribut style. Par conséquent, toutes les propriétés de style déclarées par la définition de style qui sont applicables à l'élément actuel seront héritées. Pour remplacer les valeurs héritées, les propriétés de style spécifiées au niveau de l'élément de rapport peuvent être utilisées.
Modèles de style
Nous pouvons faire un ensemble de rapports avec un aspect commun en définissant le style à un endroit commun. Ce modèle de style commun peut ensuite être référencé par les modèles de rapport. Un modèle de style est un fichier XML qui contient une ou plusieurs définitions de style. Fichiers de modèle de style utilisés par convention*.jrtx extension, mais ce n'est pas obligatoire.
Un modèle de style contient les éléments suivants -
<jasperTemplate> - Il s'agit de l'élément racine d'un fichier de modèle de style.
<template> - Cet élément est utilisé pour inclure des références à d'autres fichiers de modèle. Le contenu de cet élément est interprété comme l'emplacement du fichier modèle référencé.
<style> - Cet élément est identique à l'élément portant le même nom des modèles de conception de rapport (fichiers JRXML), à l'exception du fait qu'un style dans un modèle de style ne peut pas contenir de styles conditionnels. Cette limitation est due au fait que les styles conditionnels impliquent des expressions de rapport et que les expressions ne peuvent être interprétées que dans le contexte d'une seule définition de rapport.
Les références aux modèles de style sont incluses dans les rapports JRXML en tant qu'éléments <template>. Les modèles de style sont chargés au moment du remplissage du rapport et les références de nom de style sont résolues une fois que tous les modèles ont été chargés. Lors du chargement des modèles de style et de la résolution des noms de style en styles, un arbre / graphique de modèles de style est créé, le haut de l'arborescence étant l'ensemble des styles définis dans le rapport. Dans cette arborescence, les références de nom de style sont résolues au dernier style qui correspond au nom dans un parcours en profondeur.
Exemple
Essayons les styles conditionnels et les modèles de style. Ajoutons le <style> élément alternateStyleà notre modèle de rapport existant (Chapter Report Designs ). En fonction de la condition, la couleur de la police passe au bleu pour un nombre égal. Nous avons également inclus un modèle de style"styles.jrtx". Le modèle de rapport révisé (jasper_report_template.jrxml) est le suivant. Enregistrez-le dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test -
<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
"//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name = "jasper_report_template" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
<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>
Le contenu du modèle de style styles.jrtxsont les suivants. Enregistrez-le dans le répertoire 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>
Les codes java pour le remplissage des rapports restent inchangés. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sont comme indiqué ci-dessous -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource = new
JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme ci-dessous -
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;
}
}
Le contenu du fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme ci-dessous -
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;
}
}
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.
Le fichier d'importation - baseBuild.xml est extrait du chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the
report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28: warning:
'includeantruntime' was not set, defaulting to build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes
compilereportdesing:
[jrc] Compiling 1 report design files.
[jrc] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[jrc] log4j:WARN Please initialize the log4j system properly.
[jrc] log4j:WARN See
http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
[echo] Runnin class : com.tutorialspoint.JasperReportFill
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -
Ici, nous pouvons voir que la couleur de la police est changée en bleu pour un nombre pair (dans le pays de la colonne). Dans le nom de la colonne, la couleur de la police devient verte (ce style est référencé à partir du modèle de style).
Nous l'avons vu dans nos chapitres précédents, les données affichées sur le rapport sont généralement extraites des paramètres du rapport et des champs du rapport. Ces données peuvent être traitées à l'aide des variables de rapport et de leurs expressions. Il existe des situations où une fonctionnalité complexe ne peut pas être obtenue facilement à l'aide d'expressions ou de variables de rapport. Des exemples de ceci peuvent être des manipulations complexes de chaînes, la construction de cartes ou des listes d'objets en mémoire ou des manipulations de dates à l'aide d'API Java tierces. Pour de telles situations, JasperReports nous fournit un moyen simple et puissant de le faire avecScriptlets.
Les scriptlets sont des séquences de code Java qui sont exécutées chaque fois qu'un événement de rapport se produit. Les valeurs des variables de rapport peuvent être affectées par les scriptlets.
Déclaration de scriptlet
Nous pouvons déclarer un scriptlet de deux manières -
En utilisant <scriptlet> élément. Cet élément a un attribut de nom et un attribut de classe . L' attribut class doit spécifier le nom de la classe, qui étend la classe JRAbstractScriptlet . La classe doit être disponible dans le classpath au moment du remplissage du rapport et doit avoir un constructeur vide, afin que le moteur puisse l'instancier à la volée.
Utilisation de l'attribut scriptletClass de l'élément <jasperReport>, dans le modèle de rapport (JRXML). En définissant cet attribut avec le nom complet du scriptlet (y compris le nom complet du package), nous indiquons que nous voulons utiliser un scriptlet. L'instance de scriptlet, créée avec cet attribut, agit comme le premier scriptlet de la liste des scriptlets et porte le nom prédéfini REPORT.
Classe de scriptlet
Un scriptlet est une classe java, qui doit étendre l'une des classes suivantes -
net.sf.jasperreports.engine.JRAbstractScriptlet- Cette classe contient un certain nombre de méthodes abstraites qui doivent être remplacées dans chaque implémentation. Ces méthodes sont appelées automatiquement par JasperReports au moment opportun. Le développeur doit implémenter toutes les méthodes abstraites.
net.sf.jasperreports.engine.JRDefaultScriptlet- Cette classe contient les implémentations vides par défaut de chaque méthode dans JRAbstractScriptlet. Un développeur n'est tenu de mettre en œuvre que les méthodes dont il a besoin pour son projet.
Le tableau suivant répertorie les méthodes de la classe ci-dessus. Ces méthodes seront appelées par le moteur de rapport au moment opportun, lors de la phase de remplissage du rapport.
S.NON | Méthode et description |
---|---|
1 | public void beforeReportInit() Appelé avant l'initialisation du rapport. |
2 | public void afterReportInit() Appelé après l'initialisation du rapport. |
3 | public void beforePageInit() Appelé avant l'initialisation de chaque page. |
4 | public void afterPageInit() Appelé après l'initialisation de chaque page. |
5 | public void beforeColumnInit() Appelé avant l'initialisation de chaque colonne. |
6 | public void afterColumnInit() Appelé après l'initialisation de chaque colonne. |
sept | public void beforeGroupInit(String groupName) Appelé avant que le groupe spécifié dans le paramètre ne soit initialisé. |
8 | public void afterGroupInit(String groupName) Appelé après l'initialisation du groupe spécifié dans le paramètre. |
9 | public void beforeDetailEval() Appelé avant que chaque enregistrement de la section Détail du rapport ne soit évalué. |
dix | public void afterDetailEval() Appelé après que chaque enregistrement dans la section de détail du rapport est évalué. |
N'importe quel nombre de scriptlets peut être spécifié par rapport. Si aucun scriptlet n'est spécifié pour un rapport, le moteur crée toujours une seule instance JRDefaultScriptlet et l'enregistre avec le paramètre REPORT_SCRIPTLET intégré.
Nous pouvons ajouter toutes les méthodes supplémentaires dont nous avons besoin à nos scriptlets. Les rapports peuvent appeler ces méthodes à l'aide du paramètre intégré REPORT_SCRIPTLET.
Scriptlets globaux
Nous pouvons associer des scriptlets d'une autre manière aux rapports, c'est-à-dire en déclarant les scriptlets globalement. Cela permet aux scriptlets de s'appliquer à tous les rapports en cours de remplissage dans le déploiement JasperReports donné. Ceci est rendu facile par le fait que des scriptlets peuvent être ajoutés à JasperReports en tant qu'extensions. Le point d'extension du scriptlet est représenté par l' interface net.sf.jasperreports.engine.scriptlets.ScriptletFactory . JasperReports chargera toutes les fabriques de scriptlets disponibles via les extensions au moment de l'exécution. Ensuite, il demandera à chacun d'entre eux la liste des instances de scriptlets qu'ils souhaitent appliquer au rapport en cours d'exécution. Lorsqu'il demande la liste des instances de scriptlet, le moteur donne des informations de contexte que l'usine pourrait utiliser pour décider quels scriptlets s'appliquent réellement au rapport actuel.
Gouverneurs du rapport
Les gouverneurs ne sont qu'une extension de scriptlets globaux qui nous permettent de résoudre un problème de moteur de rapport entrant en boucle infinie lors de l'exécution, tout en générant des rapports. Les modèles de rapport non valides ne peuvent pas être détectés au moment de la conception, car la plupart du temps, les conditions de saisie des boucles infinies dépendent des données réelles qui sont introduites dans le moteur au moment de l'exécution. Les gouverneurs de rapports aident à décider si un certain rapport est entré dans une boucle infinie et ils peuvent l'arrêter. Cela empêche l'épuisement des ressources pour la machine qui exécute le rapport.
JasperReports a deux gouverneurs de rapport simples qui arrêteraient l'exécution d'un rapport en fonction d'un nombre maximal de pages spécifié ou d'un intervalle de délai spécifié. Ils sont -
net.sf.jasperreports.governors.MaxPagesGovernor- Il s'agit d'un scriptlet global qui recherche deux propriétés de configuration pour décider s'il s'applique ou non au rapport en cours d'exécution. Les propriétés de configuration sont -
net.sf.jasperreports.governor.max.pages.enabled=[true|false]
net.sf.jasperreports.governor.max.pages=[integer]
net.sf.jasperreports.governors.TimeoutGovernor- Il s'agit également d'un scriptlet global qui recherche les deux propriétés de configuration suivantes pour décider s'il s'applique ou non.
Les propriétés de configuration sont -
net.sf.jasperreports.governor.timeout.enabled=[true|false]
net.sf.jasperreports.governor.timeout=[milliseconds]
Les propriétés des deux gouverneurs peuvent être définies globalement, dans le fichier jasperreports.properties, ou au niveau du rapport, en tant que propriétés de rapport personnalisées. Ceci est utile car différents rapports peuvent avoir une taille estimée ou des limites de délai d'expiration différentes et aussi parce que vous pouvez activer les gouverneurs pour tous les rapports, tout en les désactivant pour certains, ou vice-versa.
Exemple
Écrivons une classe de scriptlet (MyScriptlet). Le contenu du fichier C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ MyScriptlet.java est le suivant -
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.";
}
}
Les détails de la classe de scriptlet ci-dessus sont les suivants -
Dans la méthode afterReportInit , nous définissons une valeur sur la variable"someVar" this.setVariableValue ("someVar", new String ("Cette valeur de variable a été modifiée par le scriptlet.")).
À la fin du cours, une méthode supplémentaire appelée 'hello'a été défini. Voici un exemple de méthode qui peut être ajoutée au scriptlet qui renvoie en fait une valeur, plutôt que de définir une variable.
Ensuite, nous ajouterons la référence de classe de scriptlet dans notre modèle de rapport existant (Chapter Report Designs ). Le modèle de rapport révisé (jasper_report_template.jrxml) est le suivant. Enregistrez-le dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test -
<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
"//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name = "jasper_report_template" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50"
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>
Les détails du modèle de rapport révisé sont donnés ci-dessous -
Nous avons référencé la classe MyScriptlet dans l'attribut scriptletClass de l'élément <jasperReport>.
Les scriptlets peuvent uniquement accéder aux champs et paramètres du rapport, mais pas les modifier. Cependant, les scriptlets peuvent modifier les valeurs des variables de rapport. Cela peut être accompli en appelant la méthode setVariableValue (). Cette méthode est définie dans la classe JRAbstractScriptlet, qui est toujours la classe parente de tout scriptlet. Ici, nous avons défini une variable someVar , qui sera modifiée par le MyScriptlet pour avoir la valeur Cette valeur a été modifiée par le scriptlet .
Le modèle de rapport ci-dessus a un appel de méthode dans la bande Résumé qui illustre comment écrire de nouvelles méthodes (dans des scriptlets) et les utiliser dans le modèle de rapport. ($P{REPORT_SCRIPTLET}.hello())
Les codes java pour le remplissage des rapports restent inchangés. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sont comme indiqué ci-dessous -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource = new
JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme indiqué ci-dessous -
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;
}
}
Le contenu du fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme indiqué ci-dessous -
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;
}
}
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.
Le fichier d'importation - baseBuild.xml est extrait du chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
warning: 'includeantruntime' was not set, defaulting to 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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -
Ici, nous voyons que deux messages sont affichés à partir de la classe MyScriptlet -
- Dans la section titre - Cette valeur de variable a été modifiée par le scriptlet
- En bas - Bonjour! Je suis l'objet scriptlet du rapport.
Les sous-rapports sont l'une des fonctionnalités intéressantes des JasperReports. Cette fonction permet d'incorporer un rapport dans un autre rapport, c'est-à-dire qu'un rapport peut être un sous-rapport d'un autre. Les sous-rapports nous aident à simplifier la conception des rapports, car nous pouvons créer de nombreux rapports simples et les encapsuler dans un rapport principal. Les sous-rapports sont compilés et remplis comme des rapports normaux. Tout modèle de rapport peut être utilisé comme sous-rapport lorsqu'il est incorporé dans un autre modèle de rapport, sans que rien ne change à l'intérieur (du modèle de rapport).
Les sous-rapports sont comme des modèles de rapport normaux. Ce sont en fait des objets net.sf.jasperreports.engine.JasperReport , qui sont obtenus après la compilation d'un objet net.sf.jasperreports.engine.design.JasperDesign .
Élément <subreport>
Un élément <subreport> est utilisé lors de l'introduction de sous-rapports dans les rapports maîtres. Voici la liste des sous-éléments de l'élément <subreport> JRXML.
<reportElement>
<parametersMapExpression> - Ceci est utilisé pour transmettre une carte contenant des paramètres de rapport au sous-rapport. La mappe est généralement obtenue à partir d'un paramètre dans le rapport principal ou à l'aide du paramètre REPORTS_PARAMETERS_MAP intégré pour transmettre les paramètres du rapport parent au sous-rapport. Cette expression doit toujours renvoyer un objet java.util.Map dans lequel les clés sont les noms de paramètres.
<subreportParameter> - Cet élément est utilisé pour transmettre des paramètres au sous-rapport. Il a un nom d' attribut , qui est obligatoire.
<connectionExpression> - Ceci est utilisé pour passer un java.sql.Connection au sous-rapport. Il est utilisé uniquement lorsque le modèle de sous-rapport nécessite une connexion à la base de données pendant la phase de remplissage du rapport.
<dataSourceExpression> - Ceci est utilisé pour transmettre une source de données au sous-rapport. Cette source de données est généralement obtenue à partir d'un paramètre du rapport principal ou à l'aide du paramètre REPORT_DATA_SOURCE intégré pour transmettre la source de données du rapport parent au sous-rapport.
Les éléments ( connectionExpression et dataSourceExpression ) ne peuvent pas être présents en même temps dans une déclaration d'élément <subreport>. En effet, nous ne pouvons pas fournir à la fois une source de données et une connexion au sous-rapport. Nous devons choisir l'un d'entre eux et nous y tenir.
<returnValue> - Ceci est utilisé pour affecter la valeur de l'une des variables du sous-rapport à l'une des variables du rapport principal. Ce sous-élément a les attributs suivants -
subreportVariable - Cet attribut spécifie le nom de la variable de sous-rapport dont la valeur doit être renvoyée.
toVariable - Cet attribut spécifie le nom de la variable de rapport parent dont la valeur doit être copiée / incrémentée avec la valeur du sous-rapport.
calcul - Cet attribut peut prendre des valeurs: Nothing, Count, DistinctCount, Sum, Average, Minimum, Maximum, StandardDeviation, Variance. La valeur par défaut pour le calcul des attributs est "Rien".
incrementerFactoryClass - Cet attribut spécifie la classe de fabrique pour créer l'instance de l'incrémenteur.
<subreportExpression> - Ceci indique où trouver le modèle de rapport compilé pour le sous-rapport. Cet élément a unclassattribut. L' attribut class peut prendre l'une de ces valeurs: java.lang.String, java.io.File, java.net.URL, java.io.InputStream, net.sf.jasperreports.engine.JasperReport. La valeur par défaut est java.lang.String .
isUsingCache - Ceci est un attribut de l'élément <subreport>. Il s'agit d'une valeur booléenne. Lorsqu'elle est définie sur true , le moteur de création de rapports essaie de reconnaître les objets de modèle de sous-rapport précédemment chargés, en utilisant leur source spécifiée. Cette fonctionnalité de mise en cache est disponible uniquement pour les éléments de sous-rapport qui ont des expressions renvoyant des objets java.lang.String comme source de modèle de sous-rapport, représentant des noms de fichier, des URL ou des ressources de chemin de classe.
Exemple
Prenons un exemple simple pour illustrer la création de sous-rapports à l'aide de JRDataSource. Commençons par écrire deux nouveaux modèles de rapport, l'un étant le sous-rapport et l'autre le rapport principal. Le contenu du modèle de sous-rapport (address_report_template.jrxml) est indiqué ci-dessous. Enregistrez-le dans le répertoire 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>
Comme nous utilisons une source de données, nous devons écrire un fichier POJO correspondant SubReportBean.java comme indiqué ci-dessous. Enregistrez-le dans le répertoire 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;
}
}
Ici, nous avons déclaré deux champs 'city' et 'street' et les méthodes getter et setter respectives sont définies.
Maintenant, mettons à jour notre existant DataBeanfichier. Nous allons ajouter un nouveau champ subReportBeanList , qui est un java.util.List. Ce champ contiendra la liste des objets SubReportBean. Le contenu du fichier DataBean est comme ci-dessous. Enregistrez-le dans le répertoire 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;
}
}
Mettons maintenant à jour le fichier C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \DataBeanList.java. Le contenu de ce fichier est comme -
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;
}
}
Dans la méthode produire () dans le fichier ci-dessus, nous définissons la liste de SubReportBean.
Maintenant, écrivons un nouveau modèle de rapport principal (jasper_report_template.jrxml). Enregistrez ce fichier dans le répertoireC:\tools\jasperreports-5.0.1\test. Le contenu de ce fichier est comme ci-dessous -
<?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>
Dans le modèle ci-dessus, nous avons défini un nouveau paramètre "SUBREPORT_DIR", qui définit le chemin du sous-rapport. Nous avons défini un champ subReportBeanList de type java.util.List, qui correspond à property dans le fichier DataBean. L'élément <subreport> a un sous-élément <dataSourceExpression>. Nous avons mis la liste subReportBeanList dans une instance de JRBeanCollectionDataSource. Dans le sous-élément <subreportExpression />, nous avons donné le nom du sous-rapport (AddressReport.jasper).
Maintenant, écrivons une nouvelle classe CreateReportpour compiler et exécuter notre modèle de rapport. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\CreateReport.java sont comme indiqué ci-dessous -
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!!! ...");
}
}
Ici, nous voyons que nous compilons les modèles de rapport principal et secondaire et que nous transmettons le fichier de rapport principal (.jasper) pour le remplissage du rapport.
Génération de rapports
Maintenant, tous nos fichiers sont prêts, compilons-les et exécutons-les en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.
Le fichier d'importation - baseBuild.xml est extrait du chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the
report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.CreateReport (viewFullReport est la cible par défaut) comme suit -
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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -
Ici, nous pouvons voir que les attributs Nom, Pays et Adresse sont affichés.
Auparavant, les utilisateurs devaient s'appuyer sur des scriptlets pour collecter les données du graphique et rendre le graphique à l'aide d'un élément d'image dans le modèle de rapport. JasperReports simplifie désormais les choses, car il a un support intégré pour les graphiques utilisant le nouveau composant de graphique.
À l'aide d'un nouveau composant de graphique, l'utilisateur doit appliquer uniquement les paramètres visuels et définir des expressions qui aideront à créer le jeu de données du graphique. JasperReports utilise JFreeChart comme bibliothèque de graphiques sous-jacente. Lors de la configuration d'un nouveau composant de graphique, les trois composants suivants sont impliqués:
Le composant graphique global.
Le jeu de données du graphique (qui regroupe les paramètres liés aux données du graphique).
Le tracé du graphique (qui regroupe les paramètres visuels liés à la façon dont les éléments du graphique sont rendus).
JasperReports prend actuellement en charge les types de graphiques suivants: Pie, Pie 3D, Bar, Bar 3D, XY Bar, Stacked Bar, Stacked Bar 3D, Line, XY Line, Area, XY Area, Stacked Area, Scatter, Bubble, Time Series, High -Low-Open-Close, chandelier, axes multiples, mètre, thermomètre et Gantt.
Propriétés du graphique
Les graphiques sont des éléments de rapport normaux, ils partagent donc certaines de leurs propriétés avec tous les autres éléments de rapport. Il existe un élément JRXML appelé <chart>, utilisé pour créer tous types de graphiques. Cet élément regroupe des paramètres spécifiques aux graphiques qui s'appliquent à tous les types de graphiques.
Sous-éléments du graphique
Les sous-éléments de l'élément <chart> sont -
<reportElement> - Ce sont des objets affichables tels que des textes statiques, des champs de texte, des images, des lignes et des rectangles que vous placez dans vos sections de modèle de rapport.
<Box> - Cet élément est utilisé pour entourer les graphiques d'une bordure personnalisable de chaque côté.
<chartTitle>- Cet élément sert à placer le titre du graphique. L' attribut position décide de la position du titre du graphique dans le rapport. Cet élément a des attributs -Position(Les valeurs peuvent être Top , Bottom , Left , Right . La valeur Deafult est Top ),color. <chartTitle> a font et titleExpression comme sous-éléments.
<chartSubtitle>- Cet élément sert à placer le sous-titre du graphique. Cet élément a l'attribut -color. <chartSubtitle> a font et subtitleExpression comme sous-éléments.
<chartLegend>- L'élément peut contrôler les propriétés liées à la police ainsi que la couleur du texte et la couleur d'arrière-plan de la légende du graphique à l'aide de cet élément. Cet élément a des attributs -textColor et backgroundColor.
<anchorNameExpression> - Cet élément crée la cible de l'ancre.
<hyperlinkReferenceExpression> - Cet élément contient une expression de rapport indiquant le nom de la ressource externe (généralement une URL).
<hyperlinkAnchorExpression> - L'hyperlien pointe vers une ancre dans une ressource externe.
<hyperlinkPageExpression> - Le lien hypertexte pointe vers une page du rapport actuel.
<hyperlinkTooltipExpression>- Cet élément contrôle l'info-bulle du lien hypertexte. Le type de l'expression doit être java.lang.String .
<hyperlinkParameter> - Cet élément lorsqu'il est présent génère un hyperlien final en fonction des valeurs des paramètres.
Attributs du graphique
Les attributs de l'élément <chart> disponibles pour tous les types de graphiques sont -
isShowLegend- Cet attribut est utilisé pour déterminer si une légende de graphique sera affichée sur le rapport. Les valeurs peuvent être vraies ou fausses . La valeur par défaut est true .
evaluationTime- Détermine quand l'expression du graphique sera évaluée. Les valeurs peuvent être Now , Report , Page , Column , Group , Band . La valeur par défaut est maintenant .
evaluationGroup- Cet attribut détermine le nom du groupe à utiliser pour évaluer les expressions du graphique. La valeur de cet attribut doit correspondre au nom du groupe que nous aimerions utiliser comme groupe d'évaluation du graphique.
hyperlinkType- Cet attribut peut contenir n'importe quelle valeur de texte. La valeur par défaut est Aucun . Cela signifie que ni les champs de texte ni les images ne représentent des hyperliens, même si les expressions d'hyperliens spéciales sont présentes.
hyperlinkTarget- Cet attribut permet de personnaliser le comportement du lien spécifié lorsque l'utilisateur clique dessus dans le visualiseur. Les valeurs peuvent être Self ou Blank . La valeur par défaut est Self .
bookmarkLevel- Cet attribut, lorsqu'il est défini sur un entier positif, génère des signets dans les rapports exportés au format PDF. La valeur par défaut est 0 .
customizerClass- C'est le nom d'une classe (facultatif) qui peut être utilisée pour personnaliser le graphique. La valeur de cet élément doit être une chaîne contenant le nom d'une classe de personnalisation.
Personnalisation du graphique
Comme mentionné ci-dessus, JasperReports utilise JFreeChart comme bibliothèque de graphiques sous-jacente. JFreeChart contient des fonctionnalités qui ne sont directement pas prises en charge par JasperReports. Nous pouvons tirer parti de ces fonctionnalités en fournissant une classe de personnalisation via l' attribut customizerClass dans l'élément <chart>. Une classe de personnalisation n'est rien, mais une implémentation de l' interface net.sf.jasperreports.engine.JRChartCustomizer . Le moyen le plus simple d'implémenter cette interface est d'étendre la classe net.sf.jasperreports.engine.JRAbstractChartCustomizer et d'avoir ainsi accès aux paramètres, champs et variables pour une personnalisation plus flexible des graphiques en fonction des données du rapport.
Ensembles de données de graphique
L'une des propriétés communes à tous les types de graphiques est <dataset> élément. Les ensembles de données de graphique aident à mapper les données de rapport et à récupérer les données de graphique au moment de l'exécution. Chaque type de graphique contient différents sous-éléments pour définir les expressions du graphique. Ces expressions définissent les données utilisées pour générer le graphique. Tous ces sous-éléments contiennent un élément <dataset> qui définit quand les expressions du graphique sont évaluées et réinitialisées.
Plusieurs types d'ensembles de données de graphique sont disponibles dans JasperReports car chaque type de graphique fonctionne avec certains ensembles de données: Pie, Category, XY, Time Series, Time Period, XYZ et High-Low. Chacun de ces types de jeux de données implémente l' interface net.sf.jasperreports.engine.JRChartDataset qui définit les jeux de données de graphiques. Tous les jeux de données de graphique s'initialisent et s'incrémentent de la même manière; cependant, ils ne diffèrent que par le type de données ou de séries de données qu'ils mappent.
Propriétés du jeu de données
Le tableau ci-dessous résume les attributs de l'élément <dataset> -
Attribut | La description | Valeurs |
---|---|---|
resetType | Cet attribut détermine quand la valeur de l'expression de graphique doit être réinitialisée. | Aucun, rapport, page, colonne, groupe. La valeur par défaut estReport. |
resetGroup | Cet attribut détermine le nom du groupe auquel la valeur de l'expression de graphique est réinitialisée. | La valeur de cet attribut doit correspondre au nom de tout groupe déclaré dans le modèle de rapport JRXML. |
incrementType | Cet attribut détermine quand recalculer la valeur de l'expression de graphique. | Aucun, rapport, page, colonne, groupe. La valeur par défaut est"None". |
incrementGroup | Cet attribut détermine le nom du groupe dans lequel l'expression de graphique est recalculée. | La valeur de cet attribut doit correspondre au nom d'un groupe déclaré dans le modèle de rapport JRXML. |
Le tableau suivant résume les sous-éléments de l'élément <dataset> -
Sous-élément | La description |
---|---|
<incrémentWhenExpression> | La façon dont un jeu de données de graphique est incrémenté peut être personnalisée en filtrant les données indésirables grâce à l'utilisation de ce sous-élément. |
<datasetRun> | Il contient les informations requises pour instancier un sous-ensemble de données de rapport. |
Types de jeux de données
Les types d'ensembles de données spécifiques sont expliqués ci-dessous -
Ensemble de données à secteurs
Un jeu de données à secteurs est caractérisé par les expressions suivantes -
<keyExpression> - représente les catégories qui constitueront les tranches du graphique à secteurs. Cette expression peut renvoyer n'importe quel objet java.lang.Comparable.
<valueExpression> - produit les valeurs qui correspondent à chaque catégorie / clé de l'ensemble de données. Les valeurs sont toujours des objets java.lang.Number.
<labelExpression> - si cette expression est manquante, le graphique affichera les étiquettes par défaut pour chaque tranche du graphique à secteurs. Utilisez cette expression, qui renvoie les valeurs java.lang.String, pour personnaliser les étiquettes d'élément du graphique à secteurs.
<sectionHyperlink> - définit les hyperliens associés aux sections à secteurs.
Jeu de données de catégorie
Un jeu de données de catégorie est caractérisé par l'élément <categorySeries>, qui contient -
<seriesExpression> - indique le nom de la série. Cette expression peut renvoyer n'importe quel objet java.lang.Comparable.
<categoryExpression> - renvoie le nom de la catégorie pour chaque valeur à l'intérieur de la série spécifiée par l'expression de série. Les catégories sont des objets java.lang.Comparable.
<valueExpression> - produit les valeurs qui correspondent à chaque catégorie de l'ensemble de données. Les valeurs sont toujours des objets java.lang.Number.
<labelExpression> - si cette expression est manquante, le graphique affichera les étiquettes par défaut pour chaque élément du graphique. Utilisez cette expression, qui renvoie les valeurs java.lang.String, pour personnaliser les étiquettes d'élément du graphique.
<itemHyperlink> - définit les hyperliens associés aux éléments du graphique.
Ensemble de données XY
Un ensemble de données XY est caractérisé par l'élément <xySeries>, qui contient -
<seriesExpression> - indique le nom de la série. Cette expression peut renvoyer n'importe quel objet java.lang.Comparable.
<xValueExpression> - renvoie la valeur java.lang.Number représentant la valeur X de la paire (x, y) qui sera ajoutée à la série de données actuelle.
<yValueExpression> - renvoie la valeur java.lang.Number représentant la valeur Y de la paire (x, y) qui sera ajoutée à la série de données actuelle.
<labelExpression> - si cette expression est manquante, le graphique affichera les étiquettes par défaut pour chaque élément du graphique. Utilisez cette expression, qui renvoie les valeurs java.lang.String, pour personnaliser les étiquettes d'élément du graphique.
<itemHyperlink> - définit les hyperliens associés aux éléments du graphique.
Ensemble de données XYZ
Un ensemble de données XYZ est caractérisé par l'élément <xyzSeries>, qui contient -
<seriesExpression> - indique le nom de la série. Cette expression peut renvoyer n'importe quel objet java.lang.Comparable.
<xValueExpression> - renvoie la valeur java.lang.Number représentant la valeur X de l'élément (x, y, z) qui sera ajoutée à la série de données actuelle.
<yValueExpression> - renvoie la valeur java.lang.Number représentant la valeur Y de l'élément (x, y, z) qui sera ajouté à la série de données actuelle.
<zValueExpression> - renvoie la valeur java.lang.Number représentant la valeur Z de l'élément (x, y, z) qui sera ajouté à la série de données actuelle.
<labelExpression> - si cette expression est manquante, le graphique affichera les étiquettes par défaut pour chaque élément du graphique. Utilisez cette expression, qui renvoie les valeurs java.lang.String, pour personnaliser les étiquettes d'élément du graphique.
<itemHyperlink> - définit les hyperliens associés aux éléments du graphique.
Ensemble de données de séries temporelles
Un ensemble de données de séries chronologiques est caractérisé par l'attribut timePeriod et l'élément <timeSeries>. L'attribut timePeriod spécifie le type de la série de données à l'intérieur de l'ensemble de données. Les séries temporelles peuvent contenir des valeurs numériques associées à des jours, des mois, des années ou d'autres périodes prédéfinies. Les valeurs possibles sont: Année, Trimestre, Mois, Semaine, Jour - il s'agit de la valeur par défaut, Heure, Minute, Seconde, Milliseconde.
L'élément <timeSeries> contient -
<seriesExpression> - indique le nom de la série. Cette expression peut renvoyer n'importe quel objet java.lang.Comparable.
<timePeriodExpression> - renvoie une valeur java.util.Date à partir de laquelle le moteur extraira la période correspondante en fonction de la valeur définie pour l'attribut timePeriod mentionné ci-dessus.
<valueExpression> - renvoie la valeur java.lang.Number à associer à la valeur de période correspondante lors de l'incrémentation de la série actuelle de l'ensemble de données.
<labelExpression> - si cette expression est manquante, le graphique affichera les étiquettes par défaut pour chaque élément du graphique. Utilisez cette expression, qui renvoie les valeurs java.lang.String, pour personnaliser les étiquettes d'élément du graphique.
<itemHyperlink> - définit les hyperliens associés aux éléments du graphique.
Ensemble de données de période
Un ensemble de données de période est caractérisé par l'élément <timePeriodSeries>, qui contient -
<seriesExpression> - indique le nom de la série. Cette expression peut renvoyer n'importe quel objet java.lang.Comparable.
<startDateExpression> - spécifie le début de l'intervalle de dates auquel la valeur numérique sera associée lorsqu'elle est ajoutée à la série de périodes.
<endDateExpression> - spécifie la fin de l'intervalle de dates à laquelle la valeur numérique sera associée lorsqu'elle est ajoutée à la série de périodes.
<valueExpression> - renvoie la valeur java.lang.Number à associer à l'intervalle de dates actuel spécifié par les expressions de date de début et de date de fin.
<labelExpression> - si cette expression est manquante, le graphique affichera les étiquettes par défaut pour chaque élément du graphique. Utilisez cette expression, qui renvoie les valeurs java.lang.String, pour personnaliser les étiquettes d'élément du graphique.
<itemHyperlink> - définit les hyperliens associés aux éléments du graphique.
Ensemble de données haut bas
Un jeu de données très bas est caractérisé par les expressions suivantes -
<seriesExpression> - actuellement, une seule série est prise en charge dans un graphique High-Low ou Candlestick. Cependant, cette seule série doit être identifiée par une valeur java.lang.Comparable renvoyée par cette expression et elle doit également être utilisée comme nom de série dans la légende du graphique.
<dateExpression> - renvoie la date à laquelle se réfère l'élément actuel (haut, bas, ouvert, fermé, volume).
<highExpression> - renvoie une valeur java.lang.Number, qui fera partie de l'élément de données ajouté à la série lorsque l'ensemble de données est incrémenté.
<lowExpression> - renvoie une valeur java.lang.Number, qui fera partie de l'élément de données ajouté à la série lorsque l'ensemble de données est incrémenté.
<openExpression> - renvoie une valeur java.lang.Number, qui fera partie de l'élément de données ajouté à la série lorsque l'ensemble de données est incrémenté.
<closeExpression> - renvoie une valeur java.lang.Number, qui fera partie de l'élément de données ajouté à la série lorsque l'ensemble de données est incrémenté.
<volumeExpression> - une expression numérique qui renvoie la valeur de volume à utiliser pour l'élément de données actuel. Il n'est utilisé que pour les graphiques en chandeliers.
<itemHyperlink> - définit les hyperliens associés aux éléments du graphique.
Ensemble de données de valeur
Il s'agit d'une implémentation de jeu de données de graphique spécial qui contient une valeur unique et est utilisée pour le rendu des graphiques Meter et Thermometer. La valeur est collectée à l'aide de l'expression <valueExpression>.
Graphiques
Un autre élément JRXML courant dans tous les types de graphiques est le <plot> élément. Cela nous permet de définir plusieurs caractéristiques du graphique comme l'orientation et la couleur d'arrière-plan. Les graphiques diffèrent en fonction du type de graphique.
Attribut de tracé
Le tableau ci-dessous résume les attributs de l'élément <plot> -
Attribut | La description | Valeurs |
---|---|---|
couleur de fond | Cet attribut définit la couleur d'arrière-plan du graphique. | Toute valeur hexadécimale à six chiffres est une valeur valide pour cet attribut. La valeur hexadécimale doit être précédée d'un #. |
orientation | Cet attribut définit l'orientation du graphique. | Horizontal, Vertical La valeur par défaut est "Vertical" |
fondAlpha | Cet attribut définit la transparence de la couleur d'arrière-plan du graphique. | Les valeurs valides pour cet attribut incluent tout nombre décimal compris entre 0 et 1 inclus. Plus le nombre est élevé, moins l'arrière-plan sera transparent. La valeur par défaut est "1". |
premier planAlpha | Cet attribut définit la transparence des couleurs de premier plan du graphique. | Les valeurs valides pour cet attribut incluent tout nombre décimal compris entre 0 et 1 inclus. Plus le nombre est élevé, moins l'arrière-plan sera transparent. La valeur par défaut est "1". |
labelRotation | Cet attribut permet de faire pivoter les étiquettes de texte sur l'axe des x dans le sens horaire ou antihoraire. Cet attribut s'applique uniquement aux graphiques pour lesquels l'axe des x n'est pas numérique ou n'affiche pas de dates. | La valeur par défaut est "0,0". |
L'élément <plot> a un sous-élément <seriesColor> dont les attributs sont: seriesOrder et color . Cet élément personnalise les couleurs des séries et leur position dans la séquence de couleurs.
Paramètres spécifiques pour les graphiques
piePlot - Il n'a pas de paramètres spécifiques
pie3DPlot- Contient l' attribut depthFactor , une valeur numérique comprise entre 0 et 1 qui représente la profondeur du graphique en pourcentage de la hauteur de la zone de traçage.
barPlot - On peut afficher ou masquer les étiquettes de graduation, les marques de graduation ou les étiquettes d'élément, et fournit des paramètres pour les deux axes.
bar3DPlot - Fournit les mêmes paramètres que le barPlot et génère un effet 3D à l'aide des attributs xOffset et yOffset.
linePlot - On peut afficher ou masquer les lignes reliant les points d'éléments, afficher ou masquer les formes associées aux points d'éléments et fournir des paramètres pour les deux axes.
scatterPlot - Semblable au linePlot, il peut afficher ou masquer les lignes reliant les points d'éléments, afficher ou masquer les formes associées aux points d'éléments et fournir des paramètres pour les deux axes.
areaPlot - Fournit des paramètres pour les deux axes.
bubblePlot - On peut définir les dimensions de la bulle en définissant l'attribut scaleType et fournir des paramètres pour les deux axes.
timeSeriesPlot - On peut afficher ou masquer les lignes reliant les points d'éléments, afficher ou masquer les formes associées aux points d'éléments et fournir des paramètres pour les deux axes.
highLowPlot - On peut afficher ou masquer les graduations ouvertes, afficher ou masquer les graduations fermées et fournir des paramètres pour les deux axes.
candlestickPlot - On peut afficher ou masquer le volume, et fournit des paramètres pour les deux axes.
meterPlot - Contient des paramètres spécifiques pour la forme du cadran, l'angle d'échelle, les unités de mesure, l'intervalle de graduation, la couleur du cadran, la couleur de l'aiguille, la couleur de la graduation, la police d'affichage des valeurs, le modèle de couleur et de format, la plage de données et les intervalles de mesure.
thermometerPlot - Contient des paramètres spécifiques pour l'emplacement de la valeur, la couleur du mercure, afficher / masquer les lignes de valeur, la police d'affichage des valeurs, le modèle de couleur et de format, la plage de données, la plage basse, la plage moyenne et la plage haute.
multiAxisChart - Contient des paramètres spécifiques pour l'axe inclus dans le tracé.
Types de graphiques
JasperReports offre une prise en charge intégrée de plusieurs types de graphiques. Ils sont listés ci-dessous -
pieChart - Une combinaison d'un jeu de données Pie et d'un graphique Pie.
pie3DChart - Regroupe un jeu de données Pie et un graphique Pie 3D.
barChart - Une combinaison de base d'un jeu de données de catégorie et d'un diagramme à barres.
bar3DChart - Enveloppe un jeu de données de catégorie et un graphique à barres 3D.
xyBarChart - Prend en charge les jeux de données de période, les jeux de données de séries chronologiques et les jeux de données XY, et utilise un diagramme à barres pour rendre l'axe et les éléments.
stackedBarChart - Utilise les données d'un jeu de données de catégorie et rend son contenu à l'aide d'un diagramme à barres.
stackedBar3DChart - Utilise les données d'un jeu de données de catégorie et rend son contenu à l'aide d'un tracé Bar 3D.
lineChart - Regroupe un jeu de données de catégorie et un graphique linéaire.
xyLineChart - Regroupe un jeu de données XY et un graphique linéaire.
areaChart - Les éléments d'un jeu de données de catégorie sont rendus à l'aide d'un graphique d'aire.
stackedAreaChart - Les éléments d'un jeu de données de catégorie sont rendus à l'aide d'un graphique d'aire.
xyAreaChart - Utilise les données d'un ensemble de données XY et les restitue via un tracé de zone.
scatterChart - Enveloppe un jeu de données XY avec un nuage de points.
bubbleChart - Combine un jeu de données XYZ avec un graphique à bulles.
timeSeriesChart - Regroupe un jeu de données de série chronologique et un graphique de série chronologique
highLowChart - Une combinaison d'un jeu de données High-Low et d'un graphique High-Low.
candlestickChart - Utilise les données d'un jeu de données High-Low mais avec un tracé en chandelier spécial.
meterChart - Affiche une valeur unique d'un jeu de données Value sur un cadran, en utilisant les options de rendu d'un graphique Meter.
thermometerChart - Affiche la valeur unique dans un jeu de données Value à l'aide des options de rendu d'un tracé Thermomètre.
multiAxisChart - Contient plusieurs axes de plage, tous partageant un axe de domaine commun.
Exemple
Pour illustrer les graphiques, écrivons un nouveau modèle de rapport (jasper_report_template.jrxml). Ici, nous allons ajouter le <barChart> à la section <pageHeader> et <pieChart> à la section <summary>. Nous afficherions dans des graphiques les notes obtenues pour chaque sujet. Enregistrez-le dans le répertoireC:\tools\jasperreports-5.0.1\test. Le contenu du fichier est indiqué ci-dessous -
<?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>
Les détails du fichier ci-dessus sont indiqués ci-dessous -
L'élément JRXML utilisé pour créer un graphique à barres est </barChart> dans le <pageHeader>. Il contient un sous-élément </chart>, qui contient un sous-élément <reportElement> définissant les dimensions et la position du graphique.
L'élément <dataset> dans un graphique à barres doit être placé entre les éléments JRXML <categoryDataset> et </categoryDataset>.
<categoryDataset> doit contenir un élément <categorySeries>. Cet élément définit quel élément de données les barres représenteront (noms de sujet, dans cet exemple).
<categoryDataset> doit également contenir un élément, qui définit la manière dont les données seront séparées en catégories pour comparaison. Ici, les données sont séparées par des noms de sujet.
L'élément <valueExpression> définit quelle expression est utilisée pour déterminer la valeur de chaque barre du graphique. Ici, nous utilisons des «marques».
Pour le graphique à secteurs, nous avons utilisé l'élément <pieChart> dans la section <summary>. Il contient un sous-élément </chart>.
Le sous-élément contient une expression de rapport indiquant ce qu'il faut utiliser comme clé dans le graphique. Ici, nous avons utilisé subjectName.
Le sous-élément contient une expression utilisée pour calculer la valeur de la clé. Ici, nous avons utilisé des marques.
Les codes java pour le remplissage des rapports restent inchangés. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sont comme indiqué ci-dessous -
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();
}
}
}
Comme nous afficherions les notes obtenues pour chaque sujet, POJO doit être changé. Le fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java le contenu est indiqué ci-dessous -
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;
}
}
Même le contenu du fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java doivent être mis à jour comme indiqué ci-dessous -
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;
}
}
Génération de rapports
Ensuite, compilons et exécutons les fichiers ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.
Le fichier d'importation - baseBuild.xml est extrait du chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the
report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme suit -
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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme dans l'écran ci-dessous -
Ici, nous voyons que le graphique à barres est créé dans l'en-tête de page et le graphique à secteurs est créé dans les sections de résumé.
Les rapports de tableau croisé (tabulation croisée) sont les rapports contenant des tableaux qui organisent les données sur des lignes et des colonnes sous forme de tableau. L'objet de tableau croisé est utilisé pour insérer un rapport de tableau croisé dans le rapport principal. Les tableaux croisés peuvent être utilisés avec n'importe quel niveau de données (nominal, ordinal, intervalle ou rapport) et affichent généralement les données résumées, contenues dans les variables du rapport, sous la forme d'un tableau dynamique. Les variables sont utilisées pour afficher des données agrégées telles que des sommes, des nombres, des valeurs moyennes.
Propriétés du tableau croisé
Élément JRXML <crosstab> est utilisé pour insérer un tableau croisé dans un rapport.
Attribut
Voici une liste d'attributs d'un <crosstab> élément -
isRepeatColumnHeaders- Indique si les en-têtes de colonne doivent être réimprimés après un saut de page. La valeur par défaut est true .
isRepeatRowHeaders- Indique si les en-têtes de ligne doivent être réimprimés après un saut de colonne de tableau croisé. La valeur par défaut est true .
columnBreakOffset- Lorsqu'un saut de colonne se produit, indique la quantité d'espace vertical, mesurée en pixels, avant le morceau de tableau croisé suivant à placer sous le précédent sur la même page. La valeur par défaut est 10.
runDirection- Indique si les données du tableau croisé doivent être remplies de gauche à droite (LTR) ou de droite à gauche (RTL). La valeur par défaut est LTR.
ignoreWidth- Indique si le tableau croisé s'étendra au-delà de la limite de largeur initiale du tableau croisé et ne générera pas de sauts de colonne. Sinon, il arrêtera le rendu des colonnes dans la limite de largeur du tableau croisé et continuera avec les colonnes restantes seulement après que toutes les lignes aient commencé le rendu. La valeur par défaut est false .
Sous-éléments
Un élément <crosstab> a les sous-éléments suivants -
<reportElement>- Cet élément définit la position, la largeur et la hauteur du tableau croisé dans son cadre. Les attributs de cet élément incluent tous les attributs <reportElement> standard.
<crosstabParameter>- Cet élément est utilisé pour accéder aux variables et paramètres du rapport à partir du tableau croisé. Les attributs de cet élément incluent -
name - Ceci définit le nom du paramètre.
class - Ceci indique la classe de paramètre.
<parametersMapExpression>- Cet élément est utilisé pour transmettre une variable de rapport ou un paramètre contenant une instance de java.util.Map , en tant qu'ensemble de paramètres pour le tableau croisé. Cet élément ne contient aucun attribut.
<crosstabDataset>- Cet élément définit l'ensemble de données à utiliser pour remplir le tableau croisé (voir la section suivante pour une explication détaillée). Les attributs de cet élément incluent -
isDataPreSorted - Ceci indique si les données de l'ensemble de données sont pré-triées. La valeur par défaut est false .
<crosstabHeaderCell>- Cet élément définit le contenu de la région trouvée dans le coin supérieur gauche du tableau croisé où les en-têtes de colonne et les en-têtes de ligne se rencontrent. La taille de cette cellule est calculée automatiquement en fonction des largeurs et hauteurs de ligne et de colonne définies.
<rowGroup>- Cet élément définit un groupe utilisé pour diviser les données en lignes. Les attributs de cet élément incluent -
name - Ceci définit le nom du groupe de lignes.
width - Ceci définit la largeur du groupe de lignes.
headerPosition - Ceci définit la position du contenu de l'en-tête (haut, milieu, bas, étirer).
totalPosition - Ceci définit la position de la colonne entière (Début, Fin, Aucun).
Cet élément contient les sous-éléments suivants -
<bucket>
<crosstabRowHeader>
<crosstabTotalRowHeader>
<columnGroup>- Cet élément définit un groupe utilisé pour diviser les données en colonnes. Les attributs de cet élément incluent -
name - Ceci définit le nom du groupe de colonnes.
height - Ceci définit la hauteur de l'en-tête du groupe de colonnes.
headerPosition - Ceci définit la position du contenu de l'en-tête ( Droite, Gauche, Centre, Étirer ).
totalPosition - Ceci définit la position de la colonne entière ( Début, Fin, Aucun ).
Cet élément contient les sous-éléments suivants -
<bucket>
<crosstabColumnHeader>
<crosstabTotalColumnHeader>
<measure>- Cet élément définit le calcul à effectuer sur les lignes et les colonnes. Les attributs de cet élément incluent -
name - Ceci définit le nom de la mesure.
class - Ceci indique la classe de mesure.
calcul - Ceci indique le calcul à effectuer entre les valeurs de cellule du tableau croisé. Ses valeurs peuvent être l'une de ces valeurs: Nothing, Count, DistinctCount, Sum, Average, Minimum, Maximum, StandardDeviation, Variance et First . La valeur par défaut estNothing.
<crosstabCell>- Cet élément définit la manière dont les données des cellules sans en-tête seront présentées. Les attributs de cet élément incluent -
columnTotalGroup - Ceci indique le groupe à utiliser pour calculer le total de la colonne.
height - Ceci définit la hauteur de la cellule.
rowTotalGroup - Ceci indique le groupe à utiliser pour calculer le total des lignes.
width - Ceci définit la largeur de la cellule.
<whenNoDataCell>- Cet élément définit ce qu'il faut afficher sur une cellule de tableau croisé vide. Cet élément ne contient aucun attribut.
Regroupement de données dans le tableau croisé
Le moteur de calcul de tableau croisé agrège les données en effectuant une itération dans les enregistrements de l'ensemble de données associés. Afin d'agréger les données, il faut d'abord les regrouper. Dans un tableau croisé, les lignes et les colonnes sont basées sur des éléments de groupe spécifiques, appelésbuckets. Une définition de compartiment doit contenir -
bucketExpression - Expression à évaluer pour obtenir des éléments de groupe de données.
comparatorExpression - Nécessaire dans le cas où l'ordre naturel des valeurs n'est pas le meilleur choix.
orderByExpression - Indique la valeur utilisée pour trier les données.
Les groupes de lignes et de colonnes (définis ci-dessus) dans un tableau croisé reposent sur buckets.
Variables totales du tableau croisé intégré
Vous trouverez ci-dessous une liste de la valeur actuelle de la mesure et des totaux des différents niveaux correspondant à la cellule accessibles via des variables nommées selon le schéma suivant -
La valeur actuelle d'un calcul de mesure est stockée dans une variable portant le même nom que la mesure.
<Mesure> _ <Groupe de colonnes> _ALL - Cela donne le total de toutes les entrées du groupe de colonnes de la même ligne.
<Mesure> _ <Groupe de lignes> _ALL - Cela donne le total de toutes les entrées du groupe de lignes de la même colonne.
<Mesure> _ <Groupe de lignes> _ <Groupe de colonnes> _ALL - Cela donne le total combiné correspondant à toutes les entrées dans les groupes de lignes et de colonnes.
Exemple
Pour illustrer les tableaux croisés, écrivons un nouveau modèle de rapport (jasper_report_template.jrxml). Ici, nous allons ajouter le tableau croisé à la section récapitulative. Enregistrez-le dans le répertoireC:\tools\jasperreports-5.0.1\test. Le contenu du fichier est indiqué ci-dessous -
<?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>
Les détails du fichier ci-dessus sont les suivants -
Le tableau croisé est défini par l'élément <crosstab>.
L'élément <rowGroup> définit un groupe pour diviser les données en lignes. Ici, chaque ligne affichera des données pour un nom différent.
Les éléments <bucket> et <bucketExpression> définissent l'expression de rapport à utiliser comme délimiteur de groupe pour <rowGroup>. Ici, nous avons utilisé le champ de nom comme délimiteur, afin de diviser les lignes par nom.
L'élément <crosstabRowHeader> définit l'expression à utiliser comme en-tête de ligne. Il contient un seul sous-élément, à savoir <cellContents>, qui agit comme une bande interne dans le tableau croisé. Au lieu de définir le nom de la variable pour le champ de texte dans <crosstabRowHeader>, nous avons assigné le nom à <rowGroup> (via son attribut name), d'où il crée une variable implicite. L'élément <crosstabRowHeader> définit le contenu de la cellule d'en-tête pour la ligne entière. Il prend un seul élément <cellContents> comme seul sous-élément.
L'élément <columnGroup> ainsi que ses sous-éléments sont analogues à l'élément <rowGroup>, sauf qu'il influence les colonnes au lieu des lignes.
L'élément <measure> définit le calcul à effectuer sur les lignes et les colonnes. L' attribut de calcul est défini sur Count .
L'élément <crosstabCell> définit la façon dont les données des cellules sans en-tête seront disposées. Cet élément contient également un seul élément <crosstabCell> comme seul sous-élément.
Les codes java pour le remplissage des rapports restent inchangés. Le contenu du fichierC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sont comme indiqué ci-dessous -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource =
new JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Le contenu du fichier POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sont comme suit -
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;
}
}
Le contenu du fichier C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sont comme suit -
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;
}
}
Génération de rapports
Ensuite, compilons et exécutons les fichiers ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.
Le fichier d'importation - baseBuild.xml est extrait du chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the
report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport est la cible par défaut) comme suit -
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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -
Ici, nous voyons que chaque pays et nom sont tabulés.
Parfois, nous avons besoin de rapports dans différentes langues. Ecrire le même rapport pour chaque langue différente implique beaucoup de travail redondant. Seuls les morceaux de texte différant d'une langue à l'autre doivent être écrits séparément et chargés dans des éléments de texte au moment de l'exécution, en fonction des paramètres régionaux. C'est le but de l'internationalisation du rapport. Les rapports internationalisés, une fois rédigés, peuvent être exécutés partout.
Dans les étapes suivantes, nous avons répertorié comment générer un rapport dans différentes langues ainsi que certaines autres fonctionnalités de l'internationalisation des rapports -
Associez un ensemble de ressources java.util.ResourceBundle au modèle de rapport. Il existe deux façons d'associer l'objet java.util.ResourceBundle au modèle de rapport.
Au moment de la conception, en définissant l' attribut resourceBundle de l'objet de modèle de rapport sur le nom de base du groupe de ressources cible.
Une association dynamique / d'exécution peut être effectuée en fournissant un objet java.util.ResourceBundle comme valeur du paramètre REPORT_RESOURCE_BUNDLE au moment du remplissage du rapport.
Si le rapport doit être généré dans un environnement local différent de celui en cours, le paramètre intégré REPORT_LOCALE peut être utilisé pour spécifier les paramètres régionaux d'exécution lors du remplissage du rapport.
Pour faciliter l'internationalisation des rapports, une syntaxe spéciale $R{}est disponible dans les expressions de rapport pour référencer les ressources java.lang.String placées dans un objet java.util.ResourceBundle associé au rapport. le$R{} la syntaxe de caractères extrait la ressource spécifique à la langue du groupe de ressources en fonction de la clé qui doit être placée entre les crochets -
<textFieldExpression>
$R{report.title}
</textFieldExpression>
Le champ de texte ci-dessus affiche le titre du rapport en extrayant la valeur de chaîne du groupe de ressources associé au modèle de rapport en fonction des paramètres régionaux d'exécution fournis et de la clé report.title .
Pour formater les messages dans différentes langues en fonction des paramètres régionaux du rapport, il existe une méthode intégrée dans les rapports net.sf.jasperreports.engine.fill.JRCalculator . Cette méthode offre des fonctionnalités similaires à la classe java.text.MessageFormat . Cette méthode, msg (), a trois signatures pratiques qui vous permettent d'utiliser jusqu'à trois paramètres de message dans les messages.
Une méthode str () intégrée (l'équivalent de la syntaxe $ R {} à l'intérieur des expressions de rapport), qui donne accès au contenu de l'ensemble de ressources en fonction des paramètres régionaux du rapport.
Pour le formatage de la date et de l'heure, le paramètre intégré REPORT_TIME_ZONE peut être utilisé pour garantir des transformations d'heure appropriées.
Dans la sortie générée, la bibliothèque conserve des informations sur la direction d'exécution du texte afin que les documents générés dans des langues qui ont une écriture de droite à gauche (comme l'arabe et l'hébreu) puissent être rendus correctement.
Si une application s'appuie sur le visualiseur Swing intégré pour afficher les rapports générés, elle doit être internationalisée en adaptant le bouton Info-bulles ou d'autres textes affichés. C'est très facile à faire car le visualiseur s'appuie sur un ensemble de ressources prédéfini pour extraire des informations spécifiques aux paramètres régionaux. Le nom de base de cet ensemble de ressources est net.sf.jasperreports.view.viewer.
Exemple
Pour démontrer l'internationalisation, écrivons un nouveau modèle de rapport (jasper_report_template.jrxml). Le contenu du JRXML est indiqué ci-dessous. Enregistrez-le dans le répertoire 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>
Dans le fichier ci-dessus, l' attribut resourceBundle de l'élément <jasperReport> indique à JasperReports où obtenir les chaînes localisées à utiliser pour le rapport. Nous devons créer un fichier de propriétés avec un nom racine correspondant à la valeur de l'attribut. Ce fichier doit exister n'importe où dans le CLASSPATH lors du remplissage du rapport. Dans cet exemple, le fichier de propriétéslocalizationdemo.properties est enregistré sous le répertoire C:\tools\jasperreports-5.0.1\test. Le contenu de ce fichier est le suivant -
localization.text1 = This is English text.
Pour utiliser une langue différente, le nom du fichier doit être localizationdemo [locale] .properties. Ici, nous allons écrire un fichier pour les paramètres régionaux espagnols. Enregistrez ce fichier sous -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. Le contenu de ce fichier est le suivant -
localization.text1 = Este texto es en Español.
La syntaxe pour obtenir la valeur des propriétés resourceBundle est $ R {key}.
Pour permettre à JasperReports de savoir quels paramètres régionaux nous souhaitons utiliser, nous devons attribuer une valeur à un paramètre intégré. Le nom de ce paramètre est défini comme une constante appelée REPORT_LOCALE, et cette constante est définie dans la classe net.sf.jasperreports.engine.JRParameter . La valeur de la constante doit être une instance de java.util.Locale . Cette logique est incorporée au code java pour remplir et générer le rapport. Sauvegardons ce fichierJasperReportFillI18.javadans le répertoire C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. Le contenu du fichier est le suivant -
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();
}
}
}
Génération de rapports
Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.
Le fichier d'importation - baseBuild.xml est extrait du chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the report stored
in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid="classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport est la cible par défaut) comme suit -
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
À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -