QGis: jointures avec des tables Excel

Le sujet abordé ici n’est qu’un rappel car la possibilité de charger et joindre directement des tables Excel date de la version 1.8 de QGis.
Comme on ne suit pas la logique générale, pour les nouveaux utilisateurs ce n’est pas évident de trouver la réponse. Alors voyons, pas à pas, comment effectuer une jointure entre une couche spatiale (on prendra ici un exemple avec un fichier shapefile) et une table non spatiale de type Excel (avec ou sans champs X Y).

Pour charger une table Excel dans QGis il n’est pas nécessaire de passer par un plugin (XY Tools, MMQGIS,…). Vous utiliserez XY Tools si vous voulez transformer la table Excel avec des champs X et Y en couche spatiale de points.

Par contre si ce que vous souhaitez c’est de joindre la table Excel à une couche spatiale existante à travers une clé (N° de parcelle, nom du propriétaire, …) c’est simple et rapide.

1- Chargez la table Excel dans QGis

C’est là le piège. Pour faire cela, vous allez utiliser le bouton Charger une couche vecteur.

bouton ajouter une couche vecteur

Eh oui! Il faut le savoir, car la table Excel n’est pas une couche vecteur.

Vérifiez que l’option « Tous le fichiers » est bien sélectionnée, si non vous ne verrez pas les fichiers Excel.

sélection du fichier excel à charger

La table Excel apparaît alors dans la liste des couches. Vous pouvez ouvrir la table de la même manière que les autres tables des couches spatiales chargées dans QGis. Vous pouvez aussi basculer en mode édition, éditer la table et la sauvegarder. Vous aurez les mises à jour de votre table Excel, de la même manière que si vous les aviez effectuées avec Excel.

table excel chargée en tant que couche dans qgis

2- Chargez la couche spatiale

Chargez maintenant la couche spatiale à laquelle vous voulez joindre l’information contenue par la table Excel.

Pour notre exemple nous allons charger un shapefile avec des Établissements ostréicoles.

table d'un shapefile chargée dans qgis

Nous allons maintenant joindre la table Excel en utilisant le champ ZTABISSEM de la couche shapefile et le champ STATION de la table Excel

Jointure shapefile – Excel

Double-cliquez sur la couche shapefile dans le panneau Couches
La fenêtre de propriétés de la couche s’ouvre. Sélectionnez l’onglet Jointures et cliquez sur la croix verte pour ajouter une jointure

onglet jointure des propriétés de la couche

La fenêtre de définition de jointure s’ouvre

dialogue ajouter une jointure vecftorielle

  • Dans Joindre la couche sélectionnez la table Excel
  • Dans champ de jointure dans la couche jointe sélectionnez le champ clé de votre table Excel
  • Dans Champ de jointure dans la couche cible sélectionnez la clé de votre shapefile
  • Cliquez sur OK pour fermer la fenêtre de définition de jointure
  • Cliquez sur OK pour fermer la fenêtre de Propriétés de la couche

Si vous ouvrez maintenant la table de la couche shapefile, vous verrez que les champs de la table Excel apparaissent à la suite des champs qui étaient déjà présents.

résultat de la jointure excel-shapefile

Si vous sauvegardez maintenant votre projet, vous pouvez continuer à mettre à jour votre table Excel, sans QGis, mais quand vous ouvrirez le projet à nouveau vous retrouverez toutes les modifications apportées à la table Excel. La jointure est un lien dynamique et la table jointe est calculée à la volée à chaque ouverture.

Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

34 thoughts on “QGis: jointures avec des tables Excel

  1. Bonjour,
    Merci pour cet article très clair et intéressant.
    Pour ma part je cherche une façon d’avoir une jointure non dynamique. En effet, cela peut poser problème quand on modifie parfois son tableau excel mais qu’on ne souhaitait pas altérer la carte.
    Sous Mapinfo j’ouvrais simplement mon fichier excel. Un .tab était alors créé. Je pouvais ensuite faire une sélection sql qui me permettait de créer un .tab contenant à la fois les donner de mon fond carto (contours des communes d’un département par exemple) et les données de mon fichier excel (par exemple population par commune). Je n’avais ensuite plus qu’à sauvegarder la table issue de cette requête sql. Je pouvais travailler ensuite sereinement sur cette table contenant mes données statistiques et mes données géographiques, sachant que mon excel d’origine pouvait être modifié sans altérer ma carte.
    Malheureusement j’ai beau chercher je n’ai à ce jour pas trouvé d’équivalent sous QGIS pourtant bien plus pratique que Mapinfo.
    Auriez-vous une piste à me donner ?
    Merci beaucoup par avance.

    1. Bonjour
      Si vous ne voulez pas que la jointure soit dynamique, c’est que vous voulez figer l’état actuel de la table Excel,n’est-ce pas? Le plus simple qui me vient à l’esprit est, une fois chargée dans QGis la table Excel, sauvegarder la couche sous forme de shapefile ou autre, et réaliser la jointure avec cette nouvelle couche et non la table d’origine. Ceci va faire que votre jointure, qui n’existe que dans ce document QGis, soit statique. Toute modification de la table Excel d’origine ne sera pas répercutée sur la jointure.
      Mais si je comprends bien ce que vous faisiez avec MapInfo, vous dites que vous sauvegardiez la table jointe. Si vous faites la même chose: jointure de la table excel avec une couche shapefile, puis sauvegarde de la couche jointe sous forme de shapefile, le shapefile produit n’est plus lié à la table Excel d’origine.

      1. Bonjour,
        Merci de votre réponse très rapide.
        J’ai essayé de sauvegarder la coupe shapefile. Mais deux choses me chiffonnent encore :
        – le manque de contrôle rapide de la fusion pour vérifier que tout s’est bien passé et qu’on retrouve le bon nombre d’objets. Par exemple dans MapInfo je pouvais voir instantanément le nombre d’enregistrements de ma table et voir sur le fond carto le nombre d’objets sélectionnés (donc qui avaient fusionnés). Je pouvais ainsi m’assurer de la bonne jointure.
        – le plus qu’apportait la sélection sql aussi était que cela ne me gardait que les éléments ayant pu fusionner. Par exemple j’ai des données sur un département et des communes alentours (pour ne pas avoir une « ile »). Je le fusionne avec le fond des communes de France. La sélection sql sort un fond carto ne contenant que les communes ayant des données (ie département et alentours) qu’actuellement sauf si je me suis trompée en le faisant : qgis garde tous les objets quitte à mettre « null » dans la colonne de données lorsqu’il ne trouve pas d’identifiant et informations à ajouter.
        Je ne sais pas si je suis très claire ?

        1. Désolé, mais la dernière fois que j’ai utilisé Mapinfo c’était dans une vie antérieure. Vous n’aviez pas mentionné SQL. Si ce que vous voulez c’est utiliser une requête SQL pour faire la jointure (puis après sauvegarder la table jointe), dans QGis vous devez utiliser les « couches virtuelles ». Voici le lien sur un article qui traite des couches virtuelles : http://www.sigterritoires.fr/index.php/jointures-1-n-dans-qgis-les-couches-virtuelles/

  2. Bien le Bonjour.
    Article très intéressant. moi je voudrais faire une jointure dynamique. de façon à ce que toute modification dans mon fichier Excel se répercute immédiatement dans le shapefile (même après avoir fermé l’interface Qgis) comment puis je procéder?

    1. Dans cet article la jointure est un lien virtuel entre une table excel et un shapefile. Le résultat de la jointure est une couche virtuelle, sans existence physique sur le disque. Pour qu’elle existe, il faut que QGis soit lancé. C’est lui qui lit les deux sources de données et crée, en mémoire, la couche virtuelle. Dans votre question il me semble que vous voulez quelque chose comme un lien dynamique entre documents, où un document est intégré à l’intérieur d’un autre (un graphique excel dans un document word, par exemple). Ce n’est pas du tout comme ça que marchent les jointures. Votre table excel n’est pas incluse dans le shapefile. Si vous modifiez la table excel, ce qui sera modifié c’est la couche virtuelle, si elle est affichée dans QGis). Si vous convertissez en permanente la couche virtuelle (enregistrer sous…) sur votre disque, on ne peut pas garder un lien avec les fichiers source (shapefile et excel). Si ceux là sont modifiés à posteriori, on ne pourra pas voir ces modifications apparaître dans la couche enregistrée.

      1. Je vais reformuler ma préoccupation.
        je voudrais créer une jointure ou mieux un lien entre un fichier Excel et une couche shapefile. de façon à ce que toute éventuelle modification (ajout ou retrait) répercute dans le Shapefile.
        je sais que c’est possible en créant une source de donnée ODBC. je bloque au niveau des procédures !!

        1. Désolé, mais le format shapefile n’est pas compatible ODBC. C’est un format qui date des années 60. Vous pouvez créer une source ODBC excel, mais vous ne pouvez pas l’inclure dans un shapefile.

  3. Bonjour, je rencontre un petit soucis, lorsque je charge mon fichier excel il m’est impossible de passer en mode édition et de modifier les données, et lorsque j’essaie de joindre les fichiers les données du fichier excel n’apparaissent pas.
    Merci de vos réponses

  4. Bonjour,
    Merci beaucoup pour cet article.
    J’aimerais savoir s’il es possible de lier un fichier excel à plusieurs couches shapefile. J’ai crée une couche pour chaque mètre carré sur un plan (sachant que le plan est une image) et je voudrais associer les données excel (qui sont les quantités de matériel par m²) à chacune de mes couches pour ensuite faire une carte de densité de répartition des vestiges.
    Je ne sais pas si c’est clair, et si c’est possible?
    Merci d’avance si vous pouvez m’aider

    1. J’ai pas très bien compris mais vous pouvez joindre la même table excel à plusieurs couches. Le problème c’est que ça peut être long et ennuyeux…
      Ce que je ne vois pas c’est pourquoi créer une couche indépendante pour chaque m². Sûrement vous avez des raisons, ais si le but est une répartition des vestiges par m², le plus logique à première vue c’est que chaque m² soit un enregistrement d’une couche et pas une couche en soi. Mais bon , vous pouvez joindre le même tableau excel à autant de couches que vous voulez.

      1. Merci beaucoup pour votre réponse rapide!
        En fait je ne maîtrise pas très bien le logiciel et j’ai fait ça parce que je ne savais pas faire autrement, mais si c’est possible alors oui ça semble beaucoup plus simple en effet!
        merci encore

  5. Bonjour ,
    Merci bien pour cet article ,
    j’ ai un petit problème , la jointure marche bien ( j’ ai le champs ajouté dans la table attributaire) mais le problème lorsque je recharge encore une fois le shp je trouve pas le champs ajouté à partir de la jointure , je trouve le shp initial
    Merci par avance

    1. Les jointures sont stockées au niveau du projet QGis, pas au niveau du fichier shp. Une fois définie, elle restera active dans ce projet et pour cette couche(pas pour le fichier shp). Si vous rechargez le fichier shp une deuxième fois dans la liste des couches il n’y aura pas de jointure. Vous pourrez ainsi avoir une couche jointe et une couche non jointe au niveau de votre projet.
      Si vous voulez rendre permanente la jointure des valeurs, vous devez enregistrer la couche jointe sous forme de nouveau shp (ou autre format). Mais Les mises à jours faites sur les fichiers d’origine ne seront pas reportées automatiquement sur le fichier créé.

  6. Bonjour, votre réponse sur la jointure est claire, et si il y a des entités doublantes dans le fichier excel, comment dois je faire ?

    1. Si un enregistrement de la table source a plus d’une correspondance dans la tale cible, il est impossible de passe par une jointure. Les solutions dépendent de ce que vous vouez faire et des moyens à votre disposition. En tout cas, toutes les solutions (qui me viennent à l’esprit) impliquent passer la table excel dans un autre format. Pour vous donner une idée, si vous aviez les deux tables dans une base Postgresql vous pourriez faire la jointure en prenant la deuxième table comme source et la première comme cible. Vous obtiendrez ainsi un enregistrement par enregistrent de votre ex-table excel avec la jointure qui lui apporte le chap géométrie.

  7. Bonjour chers tous !
    J’ai une préoccupation,
    Je voudrais savoir comment lire les informations (table d’attribut) d’un fichier raster sans passer par la digitalisation.

  8. Bonjour,

    Je suppose que cette jointure dynamique fonctionne aussi avec un tableur extension .ODS?
    Merci pour votre blog très riche en ressources!

    Bien à vous,
    SIL

  9. Bonjour,

    Je suppose que cette jointure dynamique fonctionne aussi avec un tableur extension .ODS?
    Merci pour votre blog très riche en ressources!

    Bien à vous,
    SIL

  10. Bonjour,

    Ma question se rapproche beaucoup de celle de BODJRENOU René. Que faire si ma table source (mon fichier .shp) présente plusieurs occurrences de l’attribut commun qu’il a avec la table cible ? J’aimerais que la jointure créer automatiquement de nouvelles lignes dans le fichier .shp mais je ne parviens pas à trouver une option pour faire ainsi.

      1. Plus précisément, ma couche .shp est le découpage communal des communes de France fourni par l’IGN, et l’attribut qui me permet de relier à ma table est le code INSEE de chaque commune.
        Je n’ai pas vraiment le choix de travailler avec le format shp car c’est sous ce format qu’est fourni le code communal.
        Peut-être pourriez vous m’aider malgré tout ?

        1. Peut-être il y a d’autres solutions que je n’utilise pas, mais quand j’ai été confronté à ce type de problème une solution a été de passer au format geopackage ou spatialite le format shape, ajouter la table cible et utiliser une requête sql pour créer une jointure droite(right join). J’espère ne pas me tromper, au fait je ne travaille plus qu’en postgresql/postgis.

          1. Ca a marché !! (avec un LEFT JOIN car le RIGHT JOIN n’était pas supporté)
            Merci infiniment, ça fait plaisir de trouver des réponses si précises et rapides sur ce site.

  11. Lorsque je charge et joint le fichier Excel, le champ choisi apparait effectivement dans la table d’attribut. Cependant, les chiffres n’apparaissent pas et en plus, il n’est pas éditable

    1. Il y a deux problèmes différents.
      Si les valeurs du champ joint n’apparaissent pas, c’est qu’il y a un problème de clé de jointure. Le fichier shape doit être complété par les valeurs trouvées pour chaque clé correspondante. Si il est vide c’est qu’il n’y a pas de correspondance.
      Pour ce qui est d’éditer les valeurs, vous ne pouvez pas éditer un tableau excel à partir de QGis. Vous pouvez éditer les champs du shapefile avec QGis et le tableau excel avec Excel. Pour pouvoir éditer les champs en provenance du tableau excel il faut enregistrer la couche jointe (shapefile + excel) dans un format QGis (shapefile, geopackage,…), mais là vous perdez la jointure dynamique. C’est un choix en fonction des mises à jour que vous prévoyez.

      1. Merci pour votre réponse.
        J’ai crée le fichier Excel à partir de l’extension .dbf pour avoir les même clé mais les valeurs n’apparaissent toujours pas.

        1. Désolé, mais sans avoir les fichiers c’est compliqué de trouver l’erreur.
          Vérifiez déjà que le champ créé par jointure à partir d’excel est bien de même type (entier, réel, texte) que la clé du fichier shp.

  12. Bonjour,
    Je vous remercie pour cet article qui me permet de creuser dans la bonne direction.
    J’ai encore 2/3 détails que je n’arrive pas à réaliser malgré vos explications.
    J’ai un polygone divisé en maille, chacune avec un indicateur. J’ai ensuite un fichier excel avec 50 colonnes et chaque colonne représente une commune avec plus ou moins un nombre élevé d’indicateur en fonction de la taille de la commune. Le but final est de créer une typologie en fonction de chaque commune.
    J’ai donc essayé votre méthode et mes communes s’affichent bien dans la table attributaire de mon polygone. Mais, c’est là que je coince, les indicateurs de mes communes ne correspondent pas aux indicateurs de l’autre table. Dois je créer un fichier excel par commune en copiant/collant la colonne de ma commune « x » dans un fichier excel « commune x » distinct et donc refaire la méthodo, ou existe t-il un point que je n’ai pas pris en compte ? Merci d’avance pour votre réponse

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *