Jaspersoft Studio – Générer un sommaire au début du rapport

Générer un rapport dans Jasperreport n’est pas simple. Jasperreport compilant de façon séquentielle, il n’est pas facile de stocker les numéros des pages générées pour ensuite les afficher sur la première page du rapport.
Christophe DUPONTMis à jour le 18 Nov 2013

Générer un rapport dans Jasperreport n’est pas simple. Jasperreport compilant de façon séquentielle, il n’est pas facile de stocker les numéros des pages générées pour ensuite les afficher sur la première page du rapport.

Une des solutions possibles consiste à stocker dans une variable les numéros de page, et d’afficher cette variable où on le souhaite dans le rapport, en paramétrant le temps d’évuation à « Rapport ». 

Pour réaliser cela, il faut mixer scriptlet et affichage HTMLHTML (HyperText Markup Language) est un langage permettant de décrire le découpage d'une page web. : on va générer le sommaire sous forme de tableau HTML qui sera interprété par le composant HTML de Jasperreport, en paramétrant le  temps d’évaluation à « Rapport ». Ainsi le sommaire ne sera généré qu’une fois toutes les pages du rapport générés.

Voici les étapes pour réaliser ce sommaire :

Créer un projet Java et importer le jar .jasperreport

(disponible ici : http://community.jaspersoft.com/project/jasperreports-library/releases)  .

Pour importer un jar : Copier coller le jar dans votre projet JavaLangage de développement très populaire ! => Clic droit sur le projet => Propriétés => Option « Java Build Path » => Importer Jar : choisir le Jar à importer

Ecrire une classe pour l’objet qui va représenter chaque entrée dans l’index.

Dans notre exemple il s’agira d’un objet « Index », composé d’un titre, d’un numéro de page et d’un type:

package axopen.jasper.generer.sommaire;

public class Index {

       private String nomIndex = null;
       private Integer numPageIndex = null;
       private String typeIndex = null;
       
       public Index(
               String nomIndex,
               Integer numPageIndex,
               String typeIndex
               )
       {
          this.nomIndex = nomIndex;
          this.numPageIndex = numPageIndex;
          this.typeIndex = typeIndex;
       }

       public String getNomIndex()
       {
          return this.nomIndex;
       }

       public Integer getNumPageIndex()
       {
          return this.numPageIndex;
       }
       
       public String getTypeIndex()
       {
          return this.typeIndex;
       }       
}

Ecrire une classe contenant deux méthodes

  • Une pour alimenter une liste d’objet LigneSommaire (ici : addTocEntry()). Elle sera appelée à chaque fois qu’on souhaitera ajouter une entrée dans le sommaire.
  • Une seconde pour générer le sommaire depuis cette liste (ici : generateHTMLSommaire()). Elle sera appelée à la fin du rapport pour générer le rapport au format HTML.

Remarque :

  • Il faut que cette classe hérite de Abstract.
package axopen.jasper.generer.sommaire;

import java.util.ArrayList;
import java.util.Collection;

import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;

public class GenererSommaire extends JRDefaultScriptlet{
        
public String addTocEntry(String pSectionName, Integer pPageNumber,
                            String pTypeSection) 
                            throws JRScriptletException{
    
  ArrayList toc = (ArrayList)this.getVariableValue("SOMMAIRE");
  String lSectionName = pSectionName;
  Integer lPageNumber = pPageNumber;
  String lTypeSection = pTypeSection; 
  
  try{
    toc.add(new axopen.jasper.generer.sommaire
    .Index(lSectionName, lPageNumber, lTypeSection));
  }catch (Exception e){
    System.out.println(e);
  }   
  
  return "";
}

public String generateHTMLSommaire(ArrayList pListIndex){
    
    String lSommaireHTML = new String();
    String lBgColor = new String();
    String lCurrentNomIndex = new String();
    String lSautDeLigne = new String();
    String lMargeGauche = new String();
    String lNouvelleColonne = new String();
    
    lBgColor = "#FFFFFF";
    lSautDeLigne = "  ";
    lNouvelleColonne = "";
    
    lSommaireHTML = ""
    
    for (int i = 0; i < pListIndex.size(); i++)
    { if(i<2){ lBgColor = "#FFFFFF"; } 
    if( pListIndex.get(i).getTypeIndex().equals("titre") ){
        lCurrentNomIndex = pListIndex.get(i)
                            .getNomIndex().toUpperCase();
        lMargeGauche =  "" ;
    } else 
    { 
        lCurrentNomIndex = pListIndex.get(i)
                            .getNomIndex().toLowerCase();
        lMargeGauche =  "" ;
    } 
    lSommaireHTML += " ";
    lSommaireHTML += " ";
    lSommaireHTML += " ";
    lSommaireHTML += " ";
    if(i==1) {
        lSommaireHTML += lSautDeLigne; 
    } else if(i==24 || i==50) {
        lSommaireHTML += lNouvelleColonne;
    } else if(i>75) {
        break; 
    } 
    lBgColor = (lBgColor.equals("#FFFFFF")) ? 
                    "#CCCCCC" : "#FFFFFF"; } 
    lSommaireHTML += lMargeGauche 
                    + lCurrentNomIndex + pListIndex.get(i)
                                    .getNumPageIndex() ;
    lSommaireHTML.replace(« null », «  »);
    return lSommaireHTML; 
    } }

Exporter les deux classes sous forme de jar.

Puis copier le jar dans le projet Jasper et l’importer dans le java build path. Enfin paraméter le rapport Jasper pour qu’il utilise ce scriptlet (=ce jar), via la propriété « Scriplet Class » (=[Nom du package].[Nom du Jar]. Dans notre exemple : axopen.jasper.generer.sommaire.GenererSommaire).

Créer dans le rapport une variable

(Ici : SOMMAIRE) de type java.util.ArrayList. Attention cette variable doit avoir le même nom que celle appelée dans le script (via la commande : (ArrayList)this.getVariableValue(NomVariable).

Paramétrez la ainsi :

  • Calcul : Système
  • Expression valeur initiale : new java.util.ArrayList()
  • Type d’incrémentation : Rapport
  • Type de réinitialisation : Rapport

Positionner un élément HTML à l’endroit du rapport où vous souhaitez afficher le sommaire. 

Paramétrer cet élément ainsi :

  • Temps d’évaluation : Rapport
  • Expression du contenu HTML : $P{REPORT_SCRIPTLET}.Nom de la méthode qui génère le sommaire($V{Nom de la variable qui stocke les entrées dans l’index}). Dans notre exemple : $P{REPORT_SCRIPTLET}.generateHTMLSommaire($V{SOMMAIRE}) 
    JasperReportAjouterHTML.jpg

Remarque : il n’est pas possible de placer le sommaire dans un sous-rapport, ceux-ci n’ayant pas l’attribut Temps d’Evaluation.

Partout où vous souhaitez indiquer une entrée dans le sommaire, appeler la méthode add hoc dans le scriptlet, via un élément « Champ de texte ».

Paramétrez le ainsi :

  • Expression : $P{REPORT_SCRIPTLET}.

Nom de la méthode pour ajouter une entrée(« Texte libre »,$V{PAGE_NUMBER}, »type (texte libre »). Dans notre exemple : $P{REPORT_SCRIPTLET}.addTocEntry(« Présentation des fournisseurs »,$V{PAGE_NUMBER}, »titre »)

  • Temps d’évalution : Now Vous pouvez maintenant générer un rapport sous cette forme : 
    SommaireJasper.jpg

=> En savoir plus sur les solutions BI