FAQ Jasper/iReportConsultez toutes les FAQ
Nombre d'auteurs : 22, nombre de questions : 65, dernière mise à jour : 4 août 2014 Ajouter une question
Cette faq a été réalisée à partir des questions fréquemment posées sur les forums de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette faq ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette faq ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci .
Sur ce, nous vous souhaitons une bonne lecture.
L'équipe Business Inteligence.
- A quoi servent les subdatasets?
- Comment ajouter un Driver d'une base de données?
- Exemple de génération d'un rapport JasperReports à partir d'une source CSV ?
- Comment créer et utiliser des scriptlets sous iReport ?
- Utilisation d'un Bean complexe comme source de donnée d'un Report et Utilisation de report et sous-report pour afficher tout le bean
- Afficher une liste de bean complexe dans un rapport (avec sous-rapports)
- Comment créer une Multi Select Query sous JasperServer ?
Un subdataset est un concept à mi-chemin entre la source de données et le sous-rapport: ils permettent au programme de parcourir un certain nombre d'enregistrements (comme une datasource) mais ils permettent aussi l'utilisation de calculs et de paramètres (comme un sous-rapport).
Aller dans : Options Classpath
Cliquer sur Ajouter JAR
et sélectionner votre JAR.
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | // Exemple de génération de rapport JasperReports à partir d'une source CSV // (validé avec jasperreports-1.2.6.jar - LY 09/2006) // // Exemple de fichier CSV utilisé en entrée : // => ne pas oublier le caractère séparateur en fin de ligne ! // // animal;mange;couleur; // sanglier;glands;beige; // vache;herbe;blanche; // chat;souris;gris; // import java.io.*; // import de la classe "HashMap" pour l'envoi de paramètres à un rapport import java.util.HashMap; // import du moteur de la librairie JasperReports import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.JRCsvDataSource; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.engine.design.JRDesignField; //import net.sf.jasperreports.engine.export.JRCsvExporter; //import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.xml.JRXmlLoader; public class generatepdffromcsv { public static void main(String[] args) { HashMap params = new HashMap(); //String[] nomCols = {"animal", "mange", "couleur"}; // <- si on n'utilise pas 'setUseFirstRowAsHeader' ** try { System.out.println("Et c'est parti..."); // Passage de paramètres (facultatif) //params.put("", ""); // Chargement et compilation du rapport System.out.print("+ chargement et compilation du rapport JRXML"); JasperDesign jasperDesign = JRXmlLoader.load("essai11.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); System.out.println(" : OK"); // Déclaration de la source de données System.out.print("+ déclaration de la source de données CSV"); File sourceFile = new File("essai1.csv"); JRCsvDataSource source = new JRCsvDataSource(sourceFile); source.setFieldDelimiter(';'); //source.setColumnNames(nomCols); // <- si on n'utilise pas 'setUseFirstRowAsHeader' ** source.setUseFirstRowAsHeader(true); System.out.println(" : OK"); // Export du rapport au format temporaire 'jasperPrint' System.out.print("+ export du rapport au format intermédiaire 'jasperPrint'"); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, source); //équivalent à JasperPrint jasperPrint = JasperFillManager.fillReport("essai1.jasper", params, source); System.out.println(" : OK"); // puis export du rapport au format cible JasperExportManager exporter = new JasperExportManager(); System.out.print("+ conversion au format cible PDF"); exporter.exportReportToPdfFile(jasperPrint, "essai1.pdf"); System.out.println(" : OK"); System.out.print("+ conversion au format cible HTML"); exporter.exportReportToHtmlFile(jasperPrint, "essai1.html"); System.out.println(" : OK"); System.out.print("+ conversion au format cible XML"); exporter.exportReportToXmlFile(jasperPrint, "essai1.xml", false); System.out.println(" : OK"); System.out.println("That's all folks !"); } catch (Exception e) { System.out.println(e.getMessage()); } } } |
Code java : | Sélectionner tout |
1 2 3 4 5 | private static final String CTE_S_CRLF_UNIX = "\n";//retour à la ligne Unix private static final String CTE_S_CRLF_DOS = "\r\n"; //retour à la ligne Dos/Windows private static final String CTE_S_CRLF_MAC = "\r"; //retour à la ligne Mac source.setRecordDelimiter(sCRLF); |
Pour utiliser les Scriptlets, il faut tout d'abord, dans les propriétés du document mettre à scriptlet -> Utiliser le support de Scriptlet interne iReport.
Ensuite, pour ouvrir l'éditeur de scriptlet : modifier -> editeur de scriptlets.
L'éditeur va alors s'ouvrir, il ne reste plus qu'à écrire son scriptlet. On peut soit l'écrire dans Imports et declarations globale où là le scriptlet ne sera utilisé que lorsqu'il sera appeler ou soit utiliser les fonctions préexistantes telless que par exemple beforePageInit(), afterPageInit(), etc... qui sont des fonctions prévues pour s'exécuter à des moments bien précis lors de la génération du rapport.
Une fois votre scriptlet écrit, il ne faut pas oublier de cliquer sur enregistrer puis ensuite de compiler Créer -> compiler.
Cela aura pour effet de créer (s'il n'y a pas d'erreur) deux fichiers avec pour nom : nomFichierScriptlet.java et nomFichierScriptlet.class dans le repertoire du chemin d'instalaltion de iReport.
L'appel de la fonction se fait avec cette syntaxe :
Code java : | Sélectionner tout |
$P{REPORT_SCRIPTLET}.nomFonction()
Pour que les scriptlets fonctionnent, il est nécessaire de rajouter l'archive tools.jar dans les chemins de classes. Cela peut-très bien être celui qui est intégré à iReport ou celui de JDK.
Exemple de chemin de classe : C:\Program Files\Java\jdk1.6.0_11\lib\tools.jar
Problème rencontré :
Si lorsque vous modifiez une fonction de votre scriptlet et que vous vous apercevez que les modifications ne sont pas prises en compte tant que vous ne relancez pas iReport, il peut s'agir du fait qu'il faut placer tout les fichiers dans le repertoire iReport.
j'ai un bean (Client) complexe : de nombreuses informations unitaire (nom/prenom/age) mais également des listes d'informations (les adresses/les numéros de téléphones). Je dois sans attaquer ma base de donnée afficher le contenu du Bean dans Report afin de sortir une fiche cliente.
Exemple avec 3 classes :
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 | public Class client{ private String nom; private String prenom; private String age; private List<Telephone> listeDesTelephone; private List<Adresses> listeDesAdresses; } |
Code java : | Sélectionner tout |
1 2 3 4 | public Class Telephone{ private String numero; private Boolean actif; } |
Code java : | Sélectionner tout |
1 2 3 4 5 | public Class Adresses{ private String rue; private String cp; private String ville; } |
Code java : | Sélectionner tout |
1 2 | map.put("nom", objetClient.getNom()); map.put("prenom", objetClient.getPrenom()); |
Code java : | Sélectionner tout |
1 2 | map.put("listeTelephone", objetClient.getListeTelephone()); map.put("listeAdresse", objetClient.getListeAdresse()); |
Code java : | Sélectionner tout |
JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(file), map);
Code java : | Sélectionner tout |
File file = new File("chemin/de/mon/report.jasper");
Dans le Report principal créez la liste des Paramètres necessaires : nom / prenom / age / listeTelephone (de type Collection) / listeAdresse (Collection)
Dans la bande Title insérer un sous report en plus des champs qui afficherons le nom / prenom / age
Le wizard de création vous permet entre autre de spécifier la source de donnée du sous-rapport. Lui sélectionner l'option : utiliser l'expression de la source de donnée et y taper :
Code java : | Sélectionner tout |
new JRBeanCollectionDataSource($P{listeTelephone})
Créez dans le sous-report les entête de colonne dans sa bande title (par exemple et simplement "numero" et un autre "actif". Dans la partie détail, créez deux TextField nommés "numeroDeTelephone" (String) et un second "actif" (boolean).
N'Oubliez pas de créer les deux valeurs de Champs en renseignant ET le "nom du champs" ET la "description" par "numeroDeTelephone" et par "actif" ce qui permet au report de faire la liaison entre l'objet de la ligne X, sa propriété "numeroDeTelephone" et le champs du report "numeroDeTelephone"
Voilà, enregistrez vous, et exécutez, le sous rapport ferra une itération sur la liste des numéros. Avec un second sous rapport lié aux liste d'adresse vous complèterez le rapport final.
Dernier point : pensez à spécifier l'attribut flottant à tous les champs situés sous une entrée de sous-rapport afin d'éviter les chevauchement : Type de position : flottant
On veut afficher une liste de personnes qui ont chacune une liste de téléphones et une liste d'adresses :
on passe par une collection :
Code java : | Sélectionner tout |
JasperPrint jp = JasperFillManager.fillReport(getTemplateRepositoryPath() + JASPER_FILE, params, new JRBeanCollectionDataSource(personnes))
- "nom", nom(String)
- "prenom", prenom(String)
- "age", age(int)
- "telephones", liste des numéros de téléphones de la personne (ArrayList<HashMap<String, Object>>)
- "adresses", liste des adresses de la personne (ArrayList<HashMap<String, Object>>)
Ainsi, dans les Champs sous iReport, dans le rapport principal (ou rapport père), vous avez :
- nom
- prenom
- age
- telephones
- adresses
La partie détail est composée des champs nom, prénom, age et de 2 sous rapports, un pour les téléphones, et un pour les adresses !
Pour passer les valeurs aux sous rapports (ou rapport secondaires) et ainsi qu'il répètent tout seul les lignes selon la quantité de données présentes, il faut renseigner, dans le rapport père :
dans les propriétés du sous rapport des téléphones
- expression de source de données :
Code java : | Sélectionner tout |
new JRBeanCollectionDataSource((Collection)$F{telephones}))
Code java : | Sélectionner tout |
$P{path_complet_sub_report_telephones}
- expression de source de données :
Code java : | Sélectionner tout |
new JRBeanCollectionDataSource((Collection)$F{adresses}))
Code java : | Sélectionner tout |
$P{path_complet_sub_report_adresses}
Code java : | Sélectionner tout |
params.put("path_subReport", getTemplateRepositoryPath() + SUB_JASPER_FILE);
Les rapports secondaires contiennent donc des champs qui ont des noms identiques aux clés des HashMap, comme par exemple pour les téléphones :
- domicile
- portable_prive
- portable_pro
- ...
Au final, les personnes se répètent autant de fois qu'il en existe, et pour chaque personnes, les téléphones et adresses se répètent également selon les text-fields que vous avez créés !
Il faut que la requête ramène 2 valeurs : une valeur affichée et une autre qui va servir de critère dans ta clause where.
Exemple dans le cas où l'on souhaite afficher un ou plusieurs fournisseurs :
Etape 1 : Création du Paramètre :
- Créer un paramètre nommé Fournisseur
- Identifier ce paramètre comme une classe collection
- Implanter comme valeur d'expression par défaut dans Fournisseur : P${Fournisseur}
Etape 2 : Dans la Requête :
- Ecrire dans la requête principale :
Code sql : | Sélectionner tout |
...where $X{IN,id_fournisseur,Fournisseur
Il faut extraire tous les champs avant d'écrire cette syntaxe (qui est reconnue par JAVA mais pas par iReport). |
- Créer une requête telle que :
Code sql : | Sélectionner tout |
Select li_raison_sociale,id_fournisseur From tbl_Fournisseur
- Nommer le du même nom que le paramètre en question
- Le définir en multi select query
- Appeller la précédente requête
- Insèrer li_raison_sociale comme Visible Query Column et id_fournisseur comme value column
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.