anchor.diff:  JXLS
   ====
   
  -Quand on parle Excel dans le monde Java, on pense tout de suite à l'acteur historique Apache POI. POI permet depuis depuis de nombreuses années de manipuler les formats Microsoft Office au sein de l'écosystème Java. Le gros avantage de POI quand on veut manipuler le format XLS par exemple est son extrême richesse ; pour autant, cette richesse en terme d'API se fait au détriment la clarté du code : ceux qui ont déjà créé from scratch un fichier Excel via POI savent que le code nécessaire à la génération de ce dernier est extrêmement verbeux.
  +Quand on parle Excel dans le monde Java, on pense tout de suite à l'acteur historique https://poi.apache.org/[Apache POI]. POI permet depuis depuis de nombreuses années de manipuler les formats Microsoft Office au sein de l'écosystème Java. Le gros avantage de POI quand on veut manipuler le format XLS par exemple est son extrême richesse ; pour autant, cette richesse en terme d'API se fait au détriment la clarté du code : ceux qui ont déjà créé from scratch un fichier Excel via POI savent que le code nécessaire à la génération de ce dernier est extrêmement verbeux.
   
  -C'est là que JXLS vient à la rescousse. En effet, JXLS n'a pas pour objectif de founir une nouvelle API Java MS Office (au contraire même puisqu'il utilise POI en interne) mais de fournir un outil qui va simplifier la création de rapport Excel en partant de fichiers templates, en se concentrant uniquement sur les données et le remplissage du fichier à l'aide de plusieurs raccourcis syntaxiques extrêmement concis.
  +C'est là que http://jxls.sourceforge.net/index.html[JXLS] vient à la rescousse. En effet, JXLS n'a pas pour objectif de founir une nouvelle API Java MS Office (au contraire même puisqu'il utilise POI en interne) mais de fournir un outil qui va simplifier la création de rapport Excel en partant de fichiers templates, en se concentrant uniquement sur les données et le remplissage du fichier à l'aide de plusieurs raccourcis syntaxiques extrêmement puissants.
   
   D'abord, le jeu de données
   ==========================
   
  -Pour remplir notre premier fichier via JXLS, nous utiliserons un jeu de données publiques fournis par le site date.gouv.fr : la base publique de médicaments. Cette base permet au grand public et aux professionnels de santé d'accéder à des données et documents de référence sur les médicaments commercialisés ou ayant été commercialisés durant les deux dernières années en France. Et là où cette base se prête bien à l'exercice de reporting Excel, c'est qu'elle est actuellement fournie au format CSV et donc peu lisible et non exploitable en l'état.
  +Pour remplir notre premier fichier via JXLS, nous utiliserons un jeu de données publiques fournis par le site data.gouv.fr[data.gouv.fr] : la base publique de médicaments. Cette https://www.data.gouv.fr/fr/datasets/base-de-donnees-publique-des-medicaments-base-officielle/[base de données] permet au grand public et aux professionnels de santé d'accéder à des données et documents de référence sur les médicaments commercialisés ou ayant été commercialisés durant les deux dernières années en France. Et là où cette base se prête bien à l'exercice de reporting Excel, c'est qu'elle est actuellement fournie au format CSV et donc peu lisible et non exploitable en l'état.
   
  -Dans le cadre de ce post, nous nous concentrerons sur le fichier principal de cette base contenant l'ensemble des médicaments et leurs informations principales (nom, voies d'administration, laboratoire ...) : le fichier CIS_bdpm.txt.
  +Dans le cadre de ce post, nous nous concentrerons sur le fichier principal de cette base contenant l'ensemble des médicaments et leurs informations principales (nom, voies d'administration, laboratoire ...) : le fichier *CIS_bdpm.txt*.
   
  -La première étape va être de transformer chaque ligne du fichier CSV en un objet Java. Pour cela, nous utiliserons la librairie Jackson CSV car oui, Jackson sait aussi faire ça (en plus de JSON bien sûr).
  +La première étape va être de transformer chaque ligne du fichier CSV en un objet Java. Pour cela, nous utiliserons la librairie *Jackson CSV* car oui, Jackson sait aussi faire ça (en plus de JSON bien sûr).
   
  -Tout d'abord, définissons un objet Medicament qui portera les données CSV
  +Tout d'abord, définissons un objet *Medicament* qui portera les données CSV.
   
   [source,java]
   ----
  
positive.code: evaluator.getJexlEngine().setFunctions(functionMap);
  ----
  
  Pour utiliser notre fonction, il nous suffit alors de modifier par exemple pour la liste des titulaires, le contenu de la cellule correspondante de ${medicament.titulaires} à ${joiner:join(medicament.titulaires)}.
  
  Et si nous relançons la génération du rapport, cette fois-ci, ça passe sans problème :
  
  Conclusion
  ==========
  
negative.code:     ...
  ----
  
  Maintenant, il ne nous reste plus qu'à lire le fichier CSV et à indiquer à Jackson les informations de mapping pour récupérer la liste complète des médicaments :
  
  [source,java]
  ----
  