Installer ReportLab et utiliser des curseurs d’ArcPy pour extraire des données sous forme de tableau. Les différents essais et leurs résultats (2/2).

La semaine dernière nous avons vu comment installer ReportLab dans ArcGIS Pro 2.0 et comment utiliser la librairie platypus pour faire des tableaux, et le SearchCursor de ArcPy pour filtrer les données d’une table attributaire et les extraire dans le tableau. Le résultat était satisfaisant mais pas complètement fini. Cette semaine, pour cette deuxième et dernière partie, nous allons voir comment modifier le code pour insérer:

  • Un titre de rapport, avec le groupe date/heure,
  • Prendre en compte les marges,
  • Ajouter un logo

3. Améliorer le style du tableau et du rapport

Les derniers essais faits avec ReportLab portaient sur comment ajouter :

  • Un titre de rapport, avec la date et l’heure de l’écriture du rapport, en prenant compte des marges

Dans les librairies importées en début de code, j’ai ajouté : import datetime

Puis dans le code :

mydate = datetime.datetime.today()

#Header Titre du rapport avec date et heure

header = Paragraph(‘Récapitulatif des bâtiments et de leurs hauteurs. Commune de Meyrin. {}’.format(mydate.strftime(‘%c’)) * 1, styles[‘title’])

w, h = header.wrap(doc.width, doc.topMargin)

header.drawOn(canvas, doc.leftMargin, doc.height + doc.topMargin h)

  • Une adaptation de la taille des colonnes en fonction de la longueur de mon texte

table = Table(data, colWidths=[2*cm, 3*cm, 3*cm, 5*cm, 5*cm], repeatRows=1)

  • J’ai trié les données en fonction des niveaux hors-sol en utilisant une clause SQL attachée au SearchCursor

data = [tuple(headers)]for f in arcpy.da.SearchCursor(fc, fields, sql_clause=(None, ‘ORDER BY NIVEAUX_HORSOL ASC’)):

data.append((x for x in f))

  • J’ai répété le titre du rapport sur toutes les pages

#Construire le rapport en répétant le titre sur toutes les pages

doc.build(elements, onFirstPage=_header, onLaterPages=_header)

Voir le code en entier ci-dessous :

Mon rapport est très long, car il contient tous les bâtiments de la commune de Meyrin. Mais le résultat, somme toute très simple, permet d’avoir un template de tableau qui utilise ReportLab et ArcPy dans l’environnement d’ArcGIS Pro 2.0 et qui permet de répondre à certains besoins en attendant l’arrivée des outils natifs de reporting, ou si les outils ne répondent pas entièrement à vos besoins.

Le modèle de code proposé ici peut être adapté très facilement. Nous avons fait des essais avec de multiples tableaux dans une page, avec des tailles de polices différentes, ajouter un logo etc.

Le logo de la société est visible sur la première page du rapport dans cet exemple. Le code a été modifié ainsi :

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Frame, Spacer, Image

elements=[]

logo = r’C:\Users\Melanie\Documents\ArcGIS\Projects\Test_evaluation\ITISGIS_verysmall.png’

im = Image(logo, 3*cm, 3*cm)

elements.append(im)

Conclusion

En dehors des tableaux de récapitulatifs (la tâche qui nous était assignée par le client), ReportLab permet aussi de faire des calculs, des statistiques, des dessins, des graphiques, des formulaires etc. Une fois la difficulté de se plonger dans python et ArcPy passée (sans parler des frustrations liées à la documentation parfois lacunaire), ReportLab se révèle être un outil flexible, complet et très utile.

Références

http://www.reportlab.com/docs/reportlab-userguide.pdf
https://www.blog.pythonlibrary.org/2010/09/21/reportlab-tables-creating-tables-in-pdfs-with-python/
https://opendata.swiss/fr/organization/sitg-systeme-dinformation-du-territoire-a-geneve
https://pro.arcgis.com/fr/pro-app/arcpy/functions/searchcursor.htm
https://www.programiz.com/python-programming/tuple