JasperReports - Remplir des rapports

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 moment du remplissage du rapport au moteur. 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 .

La sortie générée 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 deuxième 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 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é dans C: \ tools \ jasperreports-5.0.1 \ test).