Accueil / Blog / Métier / 2014 / Tutorial Talend: Créer des Rapports avec Jasper iReport Designer et Talend

Tutorial Talend: Créer des Rapports avec Jasper iReport Designer et Talend

Par Gaël Pegliasco publié 24/12/2014
iReport Designer est un logiciel WYSIWYG permettant de créer des rapports pour JasperReport. TOS for Data Integration propose un plugin permettant de générer des rapports directement à partir des fichiers .JRXML créés par iReport.

Introduction

L'intérêt de cette démarche est non seulement d'utiliser Talend pour alimenter les données de vos rapports mais aussi de générer automatiquement ces derniers grâce aux jobs Talend.

Malheureusement le composant Talend JasperOutput date quelque peu et son utilisation avec des versions récentes de iReport en devient délicate sans quelques ajustements bien ciblés.

Ce tutorial vous présente comment contourner les erreurs actuelles que vous pouvez être amenés à rencontrer.

iReport peut être téléchargé à cette URL

Création du rapport avec iReport

Si vous êtes déjà aguerri au logiciel iReport Designer et disposez déjà de vos propres rapports nous vous proposons de passer directement à la section suivante présentant leur utilisation dans TOS.

Nous avons utilisé pour ce tutorial la version 5.6 de iReport qui est la dernière version disponible du logiciel au moment de sa rédaction.

Dans notre exemple nous nous basons sur le modèle « Flower Landscape » proposé par iReport.

L'idée de cette première partie consiste à valider le rapport généré sous iReport avant de l'utiliser dans Talend.

Nous disposons de 2 tables issues d'une base MySQL à partir desquelles nous allons générer un premier rapport.

mysql> desc client; 
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| ID | int(10) | NO | PRI | NULL | auto_increment |
| NOM | varchar(255) | NO | | NULL | |
| ADRESSE | varchar(255) | NO | | NULL | |
| CODE_CLIENT | int(10) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
 mysql> desc commande; 
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| ID | int(10) | NO | PRI | NULL | auto_increment |
| ID_AGENCE | int(10) | NO | | NULL | |
| ID_CLIENT | int(10) | NO | | NULL | |
| ANNEE_COMMANDE | int(5) | NO | | NULL | |
| SOMME_COMMANDE | double(12,0) | NO | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

La requête que nous utiliserons sous iReport est celle-ci :

mysql>  select c.nom, c.code_client, co.id_agence, co.annee_commande, co.somme_commande 
from client c, commande co where co.id_client = c.id order by co.id_agence, co.annee_commande, c.nom;

+-----------+-------------+-----------+----------------+----------------+
| nom | code_client | id_agence | annee_commande | somme_commande |
+-----------+-------------+-----------+----------------+----------------+
| Aupré | 1112 | 1 | 2008 | 3071 |
| Aupré | 1112 | 1 | 2009 | 5228 |
| Croisement| 1312 | 1 | 2010 | 9682 |
| Croisement| 1312 | 1 | 2011 | 8680 |
| Croisement| 1356 | 1 | 2009 | 7570 |
| Lenet | 1346 | 1 | 2007 | 1613 |
| Lenet | 1346 | 1 | 2013 | 8011 |
| Sidexi | 1457 | 1 | 2011 | 7962 |
| Sidexi | 1457 | 1 | 2012 | 8934 |
+-----------+-------------+-----------+----------------+----------------+

 Une fois iReport démarré, dans la fenêtre de bienvenue, choisissez l'étape 1 « Créer une connexion à une base de données ». Sélectionnez « Database JDBC connection ».

 ireport-cnx.png

Cliquez sur suivant et paramétrez votre base :

 ireport-cnx2.png

N'oubliez pas d'indiquer le nom de votre base dans la zone « JDBC URL ».
Celle utilisée dans ce tutorial s'appelle « entrepot ». Testez votre connexion puis sauvegardez là.

 Puis passez à la seconde étape : « Créer un nouveau rapport ». Nous vous proposons de choisir le modèle « Fleur paysage » :

 ireport-flower.png

 Puis cliquez sur « Exécuter l'assistant » :

 ireport-wizard.png

Cliquez sur suivant et sélectionnez votre connexion MySQL puis copiez/collez la requête SQL précédente :

 ireport-wizard2.png

 Transférez tous les champs de la requête dans la liste des champs utilisés pour le rapport.

ireport-wizard3.png 

Puis groupez les champs comme indiqué ci-dessous :

ireport-wizard4.png

Ajustez le rapport comme vous le souhaitez :

ireport-designer.png

Pour ma part j'ai retouché l'affichage comme ci-dessus en ajoutant le champ « somme commande »

 Testez votre rapport avec l'option preview puis enregistrez-le.

Génération du rapport avec Talend

Une fois que votre rapport vous convient, créez un nouveau Job dans Talend Data Integration utilisant 2 composants :

  • Un tRowGenerator

  • Un tJasperOutput

talend-job.png

Paramétrez le tRowGenerator comme suit :

talend-generator1.png

Puis le composant tJasperOutput :

talend-jasper.png

Le champ iReport contient le chemin vers l'exécutable ireport, sous Windows ce sera iReport.exe.

Puis exécutez le job !

Quoi mais c'est si simple... Pourquoi en faire un tutorial ?

Parce qu'il génère quelques erreurs...

Exception in component tJasperOutput_1
net.sf.jasperreports.engine.JRException: org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: Attribute 'uuid' is not allowed to appear in element 'jasperReport'.

Une brève recherche sur Internet montre que cet attribut uuid a été introduit dans les versions postérieures à iReport 4.1.
Une solution de contournement consiste à éditer les options du rapport via le menu Outils/Options puis de sélectionner la version 4.1.3 dans les paramètres de compatibilité.

 compatibility

N'oubliez pas de sauvegarder le rapport en confirmant de conserver la compatibilité 4.1.3

 compatibility.png

Exécutez de nouveau le job.
L'erreur précédente à disparu, mais une nouvelle erreur s'affiche :

Exception in component tJasperOutput_1
net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. Cannot cast from Integer to String
value = (java.lang.String)(((java.lang.Integer)field_id_agence.getValue())); //$JR_EXPR_ID=17$
<----------------------------------------------------------------->
2. Cannot cast from Integer to String
value = (java.lang.String)(((java.lang.Integer)field_annee_commande.getValue())); //$JR_EXPR_ID=19$
<---------------------------------------------------------------------->
3. Cannot cast from Double to String
value = (java.lang.String)(((java.lang.Double)field_somme_commande.getValue())); //$JR_EXPR_ID=32$
[…]

 Cette fois le composant n'arrive pas à convertir correctement les champs utilisés dans le rapport en chaines de caractères :

« Cannot cast from Double to String value = (java.lang.String(((java.lang.Double)field_somme_commande.getValue())); »

Le typage Java est généralement très sévère.
La solution proposée pour contourner cette erreur est de modifier le type des champs directement dans iReport, éditez chacun des champs et changez son type en String, comme illustré dans cet exemple :

ireport-changetype.png

Sauvegardez votre rapport et relancez le Job.
Une nouvelle erreur apparaît :

Exception in component tJasperOutput_1
net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. Cannot cast from Date to String

value = (java.lang.String)(new java.util.Date()); //$JR_EXPR_ID=35$
<-------------------------------------->

Il s'agit de la date insérée dans le pied de page par iReport, elle aussi nécessite une conversion explicite en String.
Retournez dans iReport et éditez les propriétés de l'expression date du Page Footer pour la remplacer par new java.util.Date().toString()

ireport-changedate.png 

Sauvegardez le rapport et ré-exécutez le job.

Une nouvelle erreur se produit...
Vous êtes en droit de vous demander si ce tutorial va un jour aboutir... Mais en cette période de Noël les miracles arrivent parfois, il faut garder la foi, suivez le guide...

Exception in component tJasperOutput_1
net.sf.jasperreports.engine.JRException: Unknown column name : nom

Cette fois l'erreur est de notre fait : nous avons nommé nos colonnes en MAJUSCULES dans le tRowGenerator alors que dans le rapport la requête SQL utilise des lettres minuscules.

Editez le tRowGenerator et changez la casse des champs.
Puis relancer le job.

Et la magie de Noël opère :

Démarrage du job Jasper_Report a 15:58 24/12/2014.
[statistics] connecting to socket on port 3884
[statistics] connected
[statistics] disconnected
Job Jasper_Report terminé à 15:58 24/12/2014. [Code sortie=0]

 Le job s'exécute et génère un beau fichier PDF :

 talend-rapport.png

Autres erreurs que vous pourriez rencontrer

Si le chemin temporaire ou de destination spécifié dans le composant tJasperOutput n'est pas celui ou vous avez déjà généré votre rapport avec iReport, le composant Jasper pourrait se plaindre de ne pas trouver les éléments nécessaires à sa génération, comme les images :

Exception in component tJasperOutput_1
net.sf.jasperreports.engine.JRException: Byte data not found at location : flower1.png
at net.sf.jasperreports.engine.util.JRLoader.loadBytesFromLocation(JRLoader.java:477)

Dans ce cas repérez ou sont stockées ces éléments dans l'installation d'iReport et copiez-les dans votre dossier destination.

Sur les machines Linux l'utilisation de la fonte « Times New Roman » peut s'avérer bloquante :

Exception in component tJasperOutput_1
net.sf.jasperreports.engine.util.JRFontNotFoundException: Font 'Times New Roman' is not available to the JVM.
See the Javadoc for more details.
at net.sf.jasperreports.engine.util.JRFontUtil.checkAwtFont(JRFontUtil.java:358)

Dans ce cas installez les polices Microsoft comme indiqué dans ce tutorial

Ou via la ligne de commande et le paquet « ttf-mscorefonts-installer » pour les distributions basées sur Debian/Ubuntu :

sudo apt-get install ttf-mscorefonts-installer 

Pour aller plus loin

Il existe aussi un composant tJasperOutputExec qui peut vous intéresser si vous utilisez des données issues de fichiers CSV/Excel en entrée.

Enfin, l'idéal serait de reprendre le code du composant tJasperOutput pour le rendre compatible avec les nouvelles versions de Talend et iReport Designer.

Ce tutorial vous a plu ? N'hésitez pas à consulter nos autres tutoriaux sur Talend et venez suivre nos formations Talend Open Studio for Data Integration à Nantes et Toulouse...

La forge Talend propose un composant tJasperReportExec qui semble contourner tous les problèmes soulevés par le composant tJasperOutput et offrir un paramétrage bien plus riche... Merci à Jan Lolling de me l'avoir signalé.

Remerciements

Je tiens à remercier l'un de mes derniers stagiaires qui a résolu nombre des erreurs présentes dans ce tutorial et m'a ainsi permis de vous le proposer aujourd'hui.

 

ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Makina Corpus devient partenaire Gold de Talend Makina Corpus devient partenaire Gold de Talend 12/05/2009

Talend Tutoriel : comprendre les connexions iterate 20/12/2013

Le lien iterate est décrit assez succinctement dans le manuel utilisateur de Talend (User Guide). ...

Préparez votre agenda de formation pour la rentrée ! Préparez votre agenda de formation pour la rentrée ! 21/12/2015

Drupal8, PostgreSQL, Python scientifique... Découvrez nos nouvelles formations et les dernières ...

Geocoder avec Talend Open Studio 22/05/2014

Mettre en place un job de geocodage d'adresses (depuis un fichier XLS) dans l'ETL Talend Open ...

Makina Corpus participe à la conférence mondiale sur OpenStreetMap Makina Corpus participe à la conférence mondiale sur OpenStreetMap 09/09/2019

Du 21 au 23 septembre se tient à Heidelberg, en Allemagne, la douzième conférence annuelle sur ...