Comment ouvrir une feuille d’un tableur Calc avec les actions de QGIS ?

Il y a peu de temps, un de mes collègues a eu besoin d’aide. Voici le problème qu’il m’a exposé :

« J’ai une couche vecteur sur QGIS, avec des points qui représentent le centre de mes stations de plantes invasives ; et j’ai un tableur qui reprend toutes ces stations + des précisions concernant les espèces, le niveau d’atteinte des milieux, les actions de gestion, etc, etc.

Chaque station (géométrie) correspond à une feuille dans le tableur.

Marie, j’ai besoin de toi pour faire ceci : je voudrais pouvoir cliquer sur mes polygones de station (dans l’interface de QGIS), et après avoir cliqué, je voudrais que mon tableur s’ouvre sur la feuille correspondant à la station sur laquelle j’ai cliqué ».

Ce à quoi j’ai naturellement répondu : « Challenge accepted ! »*

*en français ça donne : j’accepte le défi !

Créer une interraction avec les géométries dans QGIS

Donc en clair, il faut que mon tableur de données s’ouvre automatiquement sur une feuille bien spécifique quand je clique sur une géométrie particulière dans QGIS, c’est-à-dire sur la géométrie qui correspond à ladite feuille du tableur.

Je vais maintenant vous expliquer la procédure à suivre, si, comme mon collègue, vous voulez ouvrir un tableur sur une feuille particulière (ou juste un tableur) simplement en cliquant sur une des géométries de votre couche vecteur grâce à QGIS !

Pour réussir cette manipulation, vous aurez besoin : de QGIS (j’utilise ici la version 2.18), d’un tableur de données (LibreOffice Calc ou OpenOffice Calc, ce sera pareil) comprenant plusieurs feuilles, et d’un fichier shapefile avec des géométries. Ce sera aussi plus simple si vous savez vous repérer dans l’interface de QGIS

Attention : ici je parle du cas de LibreOffice. Ces manip‘ sont transposables sans trop de problèmes à OpenOffice, mais pas à Excel. 

Comment ouvrir un tableur dans QGIS ? Avec les actions !

Vous avez dit action ?

Une action, c’est un événement qui arrive lorsqu’on clique sur une entité (un polygone par exemple). Cela rajoute des fonctionnalités à votre carte, comme par exemple :

  • ouvrir un document PDF ou une image ;
  • lancer une recherche sur internet ;
  • ou encore… ouvrir un tableur sur une feuille en particulier !

Donc aujourd’hui, on souhaite que QGIS lance une action qui « ouvre un tableur sur la feuille que l’on souhaite » lorsque l’on clique sur une géométrie.

Commandes pour ouvrir un tableur Calc

On va commencer par une action plus simple : ouvrir le logiciel de tableur. En fait, lorsqu’on paramètre cette commande, cette action, QGIS lance la commande d’ouverture du tableur.

Voici les commandes d’ouverture de LibreOffice :

Ubuntu et LibreOffice

 '/usr/lib/libreoffice/program/soffice.bin'

OU

soffice

Windows et LibreOffice :

"C:\Program Files\LibreOffice 5\program\scalc.exe"

C’est cette même commande qui est lancée lorsque vous cliquez sur l’icône du raccourci de votre logiciel de tableur sur le bureau de votre pc.

Idem pour ouvrir un fichier de tableur en particulier : l’action QGIS correspond au lancement de la commande qui ouvre le fichier avec votre logiciel de tableur. 

L’action QGIS sera alors le lancement de la commande {MON LOGICIEL} {MON TABLEUR}.

Voici les commandes d’ouverture d’un fichier tableur avec LibreOffice (Calc) :

Ubuntu et LibreOffice

 '/usr/lib/libreoffice/program/soffice.bin' '/le/chemin/vers/MonTableur.ods'

OU

soffice /le/chemin/vers/MonTableur.ods

Windows et LibreOffice :

"C:\Program Files\LibreOffice 5\program\scalc.exe" "C:\Chemin\Vers\MonTableur.xlsx"

Et je peux les lancer où ces commandes ?

C’est vrai que QGIS peut les lancer à votre place à travers les actions… Les commandes sont aussi exécutées en double-cliquant sur une icône du bureau par exemple… Mais vous pouvez également les lancer vous même dans ce qu’on appelle une « console » ou encore dans un « terminal » (un terminal, c’est l’émulation d’une console dans une petite fenêtre si vous voulez vraiment avoir tous les détails…). Et qu’elle est cette chose au nom étrange ? Rien d’autre qu’un écran noir – à la Matrix – qui attend vos instructions, c’est-à-dire vos commandes ! 🙂

Et pour ouvrir une feuille d’un tableur ?

A l’ouverture d’un fichier tableur, par défaut, le tableur s’ouvre sur la feuille qui était active lors du dernier enregistrement du fichier.

En gros, si vous êtes en train de regarder la feuille numéro 3 et que vous enregistrez, si vous fermez puis ré-ouvrez votre fichier, le tableur s’ouvrira sur la feuille numéro 3 même si vous avez regardé d’autres feuilles avant de fermer votre fichier.

Pour ouvrir automatiquement un tableur sur une feuille particulière, il faut dire au tableur quelle feuille nous intéresse dès son ouverture. 

Et on peut faire ça à l’aide de ce qu’on appelle une macro !

Comment ouvrir une feuille d’un tableur ? Grâce aux macros !

Macro, quésaco ?

Une macro est une suite d’instructions que l’on peut lancer. Pour lancer une macro, il faut l’appeler, et pour cela on utilise son nom (qui ne doit contenir ni accent ni espace).

Les macros sont très utiles quand on a besoin de répéter des actions identiques de façon répétitive. Et on peut imaginer toutes sortes de macros, des plus simples comme par exemple des commandes qui mettent du texte en gras, qui ajoutent ou suppriment du texte dans une case du tableur… et des macros plus complexes qui ouvrent des formulaires ou bien qui font des calculs statistiques.

Vous l’aurez compris, pour notre cas, nous avons besoin de créer une macro qui ouvre le tableur sur la feuille que l’on veut.

Où sont les macros ?

Les macros sont enregistrées dans un emplacement, un dossier spécifique qui dépend de votre système d’exploitation. On ne va pas entrer dans les détails ici, mais sachez qu’elles ne sont pas liées à un fichier spécifique.

Conséquences : vous pouvez utilisez vos macros dans n’importe quels fichiers que vous ouvrirez sur votre ordinateur… mais vos macros ne seront pas partagées en même temps que votre fichier. Cela veut dire que vous ne pourrez pas les utiliser sur un autre ordinateur si vous copier-coller uniquement votre tableur sans importer le dossier de vos macros.

Les présentations faites avec les actions et les macros, rentrons dans le vif du sujet !

Pour rappel, on cherche à créer une action de QGIS qui, au clic sur une géométrie, va lancer des commandes pour ouvrir un tableur sur une feuille particulière.

Tutoriel : ouvrir une feuille d’un tableur Calc automatiquement en cliquant sur une géométrie avec les actions de QGIS (pour Windows et Ubuntu !)

Voici le tableau. Nous avons un projet QGIS, avec notamment une couche de vecteurs (géométries de type polygones ici), représentant des parcelles sur lesquelles ont été trouvées des espèces exotiques envahissantes.

Exemple fictif de stations d’espèces exotiques envahissantes cartographiées grâce à une couche vecteur et QGIS.

Nous avons également un tableur, composé de plusieurs feuilles : une feuille par parcelle d’EEE. 

Exemple fictif d’un tableur concernant des stations d’espèces exotiques envahissantes, comportant 3 feuilles.

Et qu’est-ce que nous voulons ? Ouvrir le tableur sur la feuille qui correspond à la parcelle (la géométrie) sur laquelle on vient de cliquer dans QGIS !

En clair, si je clique sur le polygone de la parcelle 1, je veux que mon tableur s’ouvre sur la feuille de la parcelle 1, idem pour la parcelle 2, pour la parcelle 3, etc.

Afin d’arriver à nos fins, et bien comprendre comment y arriver, nous allons procéder en trois étapes :

1) Création des actions QGIS pour ouvrir un tableur

Nous allons créer l’action QGIS qui permet d’ouvrir un tableur. C’est-à-dire que l’on va demander à QGIS de lancer la commande ouverture du tableur. Cette commande dépend du système d’exploitation de l’ordinateur et du logiciel de tableur.

Créons tout de suite l’action QGIS.

Allez dans les propriétés de votre couche vecteurs (dans le panneau Couches, faites un clic droit sur votre couche puis cliquez sur Propriétés). Ensuite, rendez-vous dans l’onglet Actions. C’est là que sont listées toutes les actions de la couche.

Comme vous pouvez le voir sur l’illustration, si vous n’avez créé aucune action, la liste sera totalement… vide ! 

Propriétés d’une couche QGIS, onglet Actions.

Pour ajouter une action, cliquez sur la petite croix verte. Cela ouvrira un formulaire pour ajouter une nouvelle action. (Le formulaire d’ajout d’action est déjà ouvert en dessous de la zone de liste selon la version de QGIS, la version 2.14 par exemple.)

Pour ajouter l’action d’ouverture d’un tableur, sélectionnez le type générique, donnez lui un nom / une description, et enfin, écrivez les commandes de l’action dans la zone « Texte de l’action ».

 

Commandes pour l’action, en fonction de votre système d’exploitation :

Ubuntu et LibreOffice

soffice Documents/naturagis/parcelle_EEE.ods

Note : pas besoin de spécifier /home/monuser, QGIS est déjà chez vous !

Windows et LibreOffice

"C:\Program Files(x86)\LibreOffice 5\program\scalc.exe"  "C:\Users\MonNom\Desktop\MonTableur.ods"

Exemple d’ajout d’une action d’ouverture d’un tableur Calc pour d’une couche QGIS, dans un environnement Ubuntu.

 Cliquez sur ok pour ajouter l’action, qui devrait maintenant se retrouver dans la liste des actions de votre couche !

Tester les actions QGIS

Maintenant, c’est l’heure du test !

Sélectionnez votre couche de géométries correspondant à vos parcelles d’EEE dans le panneau Couches (cliquez sur le nom de votre couche).

Dans la barre d’outils de QGIS, dans la Barre d’outils des Attributs, c’est la petite roue crantée qui est l’outil d’exécution des actions (elle est juste à côté de l’outil pour identifier les entité (le i).

Cliquez sur la petite flèche à droite de la roue crantée. Vous allez alors voir la liste des actions disponibles pour votre couche vecteur (toutes celles ajoutées dans les propriétés de la couche !). Sélectionnez l’action qui vous intéresse ; si vous êtes toujours avec moi, ce devrait être l’action Ouvrir un tableur qui devrait retenir votre attention. 😉

Maintenant que vous avez sélectionné l’action, tester là en cliquant sur une des géométrie… TADAM ! Le tableur s’ouvre !

Et c’est maintenant que les choses vont se corser afin d’ouvrir le tableur sur la bonne feuille… à l’aide de macros.

2) création des macros pour le tableur

Créons maintenant les macros nécessaires pour ouvrir une feuille en particulier de notre tableur. Dans le menu principal de LibreOffice cliquez sur : Outils > Macros > Gérer les macros > LibreOffice Basic…

Ou alors, utilisez le raccourci clavier, qui est beaucoup plus rapide : Alt + F11

Fenêtre de gestion des macros de LibreOffice.

Si vous n’y êtes pas par défaut, allez sur Mes macros > Standard > _Modules1, et cliquez sur le bouton Éditer.

Nous voilà alors dans une fenêtre qui va nous permettre d’écrire et modifier le code de nos macros. 

Fenêtre d’édition des macros de LibreOffice.

Pour le moment, il n’y a qu’une fonction : elle a un début Sub, et un nom Main, puis une fin End Sub. Et entre le début et la fin : rien. Cette fonction ne fait donc… absolument rien.

A la place de cette fonction inutile, nous allons écrire les fonctions qui vont permettre d’ouvrir les différentes feuilles de notre tableur.

Création des fonctions (macros)

Voici une fonction pour ouvrir la première de nos feuilles :

Sub ActivateFeuille1
ThisComponent.getcurrentController.setActiveSheet(ThisComponent.getSheets().getByIndex(0))
End Sub

Je sais que vous en mourrez d’envie, alors oui, on va encore la regarder d’un plus près !

Cette fonction a un début et un nom : Sub ActivateFeuille1.

Son nom est donc ActivateFeuille1 (vous pouvez l’appeler Toto ou Titi si vous préférez ! Le nom est libre, mais restons quand même sur quelque chose de compréhensible tongue-out)

Et bien entendu, elle a une fin : End Sub.

Fonction pour ouvrir une feuille d’un tableur

Tout ce qu’il y a entre le début et la fin, sera ce que la fonction fait. On a donc écrit ici de quoi ouvrir une feuille en particulier :

ThisComponent.getcurrentController.setActiveSheet(ThisComponent.getSheets().getByIndex(0))

Cette petite phrase récupère la feuille qui est en index 0. Notez bien que la numérotation pour accéder aux feuilles commence à partir de 0. La première feuille a donc la position 0, la deuxième feuille a la position 1, la troisième feuille a la position 2, etc.

La fonction nommée ActivateFeuille1 nous permet donc d’aller sur la première feuille… Nous allons donc ensuite devoir créer une fonction par feuille à ouvrir. Et ces fonctions, nous les mettons les unes à la suite des autres dans le fichier _Module1, ce qui donne :

Sub ActivateFeuille1
ThisComponent.getcurrentController.setActiveSheet(ThisComponent.getSheets().getByIndex(0))
End Sub

Sub ActivateFeuille2
ThisComponent.getcurrentController.setActiveSheet(ThisComponent.getSheets().getByIndex(1))
End Sub

Sub ActivateFeuille3
ThisComponent.getcurrentController.setActiveSheet(ThisComponent.getSheets().getByIndex(2))
End Sub
 
Etc.

Répétez autant de fois que vous avez de feuilles à ouvrir ! Si vous avez 15 feuilles, écrivez 15 fonctions pour ouvrir les feuilles une à une ! Et si vous avez bien suivi, l’index de la quinzième feuille est le numéro 14 !

Exemple de macros LibreOffice pour activer les feuilles d’un tableur.

Testons maintenant nos macros !

Dans le menu principal de LibreOffice, cliquez sur Outils > Macros > Exécuter la macro… S’ouvre alors une fenêtre listant toutes les macros disponibles.

Fenêtre de gestion des macros de LibreOffice, avec nos nouvelles macros.

Cliquez sur le nom d’une des macros (une correspondant sur une des feuilles qui n’est pas encore ouverte de préférence, pour le test ce sera mieux).

Cliquez sur Exécuter. N’ayez pas peur, cela ne va pas lui couper la tête, mais lancer les commandes ! :p

Et BAM, le tableur change de feuille !

C’est pas beau ça ?! Allez ne me dîtes pas que vous n’êtes pas enthousiasmé !

Maintenant, dernière étape, il faut que le tableur s’ouvre ET que la bonne macro s’exécute (pour qu’on se retrouver sur une feuille en particulier) juste après avoir cliqué sur une géométrie dans QGIS.

3) modifier les actions QGIS pour lancer les macros

Dernière étape ! Nous allons modifier nos actions QGIS (celles créées au point 1). Jusque là, elles ouvrent bien notre tableur, mais pas sur la feuille dont a besoin, c’est-à-dire la feuille correspondant à notre géométrie/notre parcelle.

Dans cet exemple, nous avons une feuille du tableur par station de plantes exotiques envahissantes. Nous souhaitons donc lier les géométries de notre fichier shapefile, qui représentent les stations de plantes sur le terrain, avec la feuille du tableur qui leur correspond.

Pour rappel, de façon schématique, l’action QGIS ici est le lancement de la commande {MON LOGICIEL} {MON TABLEUR}. On aimerait donc ajouter {MA MACRO} à cette ligne de commandes !

Mais voilà… Il y a une macro différente par géométrie…

Le principe ici va être simple. Nous allons ajouter un nouvel attribut de type texte à notre couche vecteur, attribut que l’on nommera « macro » dans cet exemple. Ce nouvel attribut va nous permettre d’assigner une valeur spécifique, à savoir un nom de macro à chaque entité de notre couche.

Ensuite, nous allons récupérer ce nom de macro – qui correspond à l’attribut nommé « macro » si vous m’avez suivi jusque là – dans la commande de l’action.

Astuce

Et pour récupérer un attribut dans une commande QGIS, on l’écrit comme cela : [% « NOM DE MON ATTRIBUT » %]. 

Cela donne ici : [% « macro » %] 

Le plus important, c’est de comprendre ce que l’on fait sur le moment… et aussi de toujours comprendre ce qu’on a fait même 6 mois plus tard quand on reviendra ouvrir notre projet QGIS, ses couches de parcelles d’EEE, ses actions et ses feuilles de tableurs !

Il n’y a pas de bonne ou mauvaise façon de procéder. Pour faire au plus simple, remplissez cet attribut « macro »avec des valeurs compréhensibles pour vous.

Personnellement, j’ai choisi d’utiliser le nom des macros : ActivateFeuilleX, le X étant à changer en fonction du numéro de feuille !

Exemple d’une table attributaire, avec un attribut spécial récupéré pour une action QGIS.

Remplissez l’attribut macro de votre couche avec le nom de la macro correspondant à votre entité, c’est-à-dire le nom de la macro ouvrant la feuille qui correspond à la géométrie de votre entité « parcelle d’EEE ».

Ensuite, retournez dans les propriétés de votre couche vecteur, à l’onglet Actions. Afin de prendre en compte la macro dans les commandes, modifiez le texte de l’action d’ouverture du tableur par les commandes suivantes.

Commandes des actions QGIS

Ubuntu et LibreOffice

soffice Documents/naturagis/parcelle_EEE.ods "macro:///Standard.Module1.[% "macro" %]"

Windows et LibreOffice

"C:\Program Files\LibreOffice 5\program\scalc.exe" "C:\Users\Utilisateur\Documents\naturagis\parcelle_EEE.ods" "macro:///Standard.Module1.[% "macro" %]"

Allez, comme vous êtes sympa et que vous m’avez suivi jusqu’ici, je vous donne un petit bonus. Voici un exemple de commandes pour OpenOffice dans un environnement Windows ! Comme vous pouvez le constater, et comme je le disais en introduction, le cas de LibreOffice est facilement transposable à OpenOffice…

Windows et OpenOffice

"C:\Program Files (x86)\OpenOffice 4\program\scalc.exe" "C:\Users\Utilisateur\Documents\naturagis\parcelle_EEE.ods" "macro:///Standard.Module1.[% "macro" %]"

Après avoir enregistré les modifications de l’action QGIS, je vous laisse l’immense joie de tester cette action, et de constater l’ouverture de la bonne feuille de votre tableur juste en cliquant sur une géométrie !

Pour résumer : les commandes des actions QGIS et des macros LibreOffice

Et pour tous les pressés de ce monde, voici la version (très) courte de ce tutoriel…

D’abord, il faut créer une macro par feuille à ouvrir : dans cet exemple, remplacez le X de ActivateFeuilleX par le numéro de la feuille dans le nom de la macro et dans sa définition (son code).

Pour nous faciliter le travail de création des actions QGIS, il faut créer un attribut supplémentaire dans notre shapefile, ici nommé macro, qui correspondra à la macro ouvrant la feuille liée à l’entité.

LibreOffice

Macro d’ouverture du tableur sur une feuille en particulier :

Sub ActivateFeuille1
ThisComponent.getcurrentController.setActiveSheet(ThisComponent.getSheets().getByIndex(0))
End Sub

Ubuntu

Commande d’ouverture d’un fichier tableur :

soffice Documents/naturagis/parcelle_EEE.ods

Commande d’ouverture d’un fichier tableur + la macro pour ouvrir une feuille :

Action :

soffice Documents/naturagis/parcelle_EEE.ods "macro:///Standard.Module1.[% "macro" %]"

Attribut « macro » :

ActivateFeuilleX

Windows

Commande d’ouverture d’un fichier tableur :

"C:\Program Files(x86)\LibreOffice 5\program\scalc.exe" "C:\Users\MonNom\Desktop\MonTableur.ods"

Commande d’ouverture du tableur + macro pour ouvrir une feuille :

Action :

"C:\Program Files\LibreOffice 5\program\scalc.exe" "C:\Users\MonNom\Desktop\MonTableur.ods" "macro:///Standard.Module1.[% "macro" %]"

Attribut « macro » :

ActivateFeuilleX

Voilà, maintenant vous savez tout pour ouvrir une feuille d’un tableur en cliquant sur une géométrie dans QGIS ! Et vous, vous utilisez QGIS ? Ce genre de fonctionnalité peut vous être utile pour vos cartes ?

Un petit coup de pouce ?

Cet article vous a plu et vous pensez qu’il pourrait être utile à quelqu’un d’autre ? Partagez le sur vos réseaux grâce aux boutons juste en dessous ! Merci !