Skip to Content

Nous adressons toutes nos pensées à la famille de notre ami Jérôme !

http://www.forumsig.org/showthread.php/43488-Disparition-de-Phoenix

Python : lire et écrire des fichiers Microsoft Excel, application à Quantum GIS

Niveau Intermédiaire
Logiciels utilisés Python
xlrd
xlwt
Plateforme Windows | Mac | Linux | FreeBSD

S'il y a une question récurrente sur les forums SIG, c'est comment traiter des données contenues dans des fichiers Microsoft Excel dans des SIGs comme Quantum GIS et autres (voir par exemple www.forumsig.org/showthread.php)

Jusqu'à peu, les utilisateurs de Windows étaient favorisés car le module Pywin (qui utilise com) pouvait être utilisé pour cette tâche (voir  « Python for Windows, Ressources and examples »,  par exemple). Rien pour les autres...

Heureusement, deux modules « universels » sont sortis , xlrd pour lire les données et xlwt pour écrire des données (classeur, feuilles etc.).

lecture d'un fichier Excel

  1. import xlrd
  2. # ouverture du fichier Excel
  3. wb = xlrd.open_workbook('testxy.xls')
  4.  
  5. # feuilles dans le classeur
  6. print wb.sheet_names()
  7. [u'Feuil1', u'Feuil2', u'Feuil3']
  8.  
  9. # lecture des données dans la première feuille
  10. sh = wb.sheet_by_name(u'Feuil1')
  11. for rownum in range(sh.nrows):
  12. print sh.row_values(rownum)
  13. [u'id', u'x', u'y', u'test']
  14. [1.0, 235.0, 424.0, u'a']
  15. [2.0, 245.0, 444.0, u'b']
  16. [3.0, 255.0, 464.0, u'c']
  17. [4.0, 265.0, 484.0, u'd']
  18. [5.0, 275.0, 504.0, u'e']
  19. [6.0, 285.0, 524.0, u'f']
  20. [7.0, 295.0, 544.0, u'g']
  21.  
  22. # lecture par colonne
  23. colonne1 = sh.col_values(0)
  24. print colonne1
  25. [u'id', 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
  26.  
  27. colonne2=sh.col_values(1)
  28. print colonne2
  29. [u'x', 235.0, 245.0, 255.0, 265.0, 275.0, 285.0, 295.0]
  30.  
  31. # extraction d'un élément particulier
  32. print colonne1[1],colonne2[1]
  33. 1.0 235.0
  34.  
  35. etc...

création d'un fichier Excel

  1. from xlwt import Workbook
  2.  
  3. # création
  4. book = Workbook()
  5.  
  6. # création de la feuille 1
  7. feuil1 = book.add_sheet('feuille 1')
  8.  
  9. # ajout des en-têtes
  10. feuil1.write(0,0,'id')
  11. feuil1.write(0,1,'x')
  12. feuil1.write(0,2,'y')
  13. feuil1.write(0,3,'test')
  14.  
  15. # ajout des valeurs dans la ligne suivante
  16. ligne1 = feuil1.row(1)
  17. ligne1.write(0,'1')
  18. ligne1.write(1,'235.0')
  19. ligne1.write(2,'424.0')
  20. ligne1.write(3,'a')
  21. etc...
  22.  
  23. # ajustement éventuel de la largeur d'une colonne
  24. feuil1.col(0).width = 10000
  25.  
  26. # éventuellement ajout d'une autre feuille 2
  27. feuil2 = book.add_sheet('feuille 2')
  28.  
  29. etc...
  30.  
  31.  
  32. # création matérielle du fichier résultant
  33. book.save('monsimple.xls')

Principes

Les modules sont basés sur la documentation d'OpenOffice sur le format des fichiers Microsoft Excel ( sc.openoffice.org/excelfileformat.pdf ) et sont écrits en pur Python, c'est-à-dire disponibles pour toutes les plateformes. Ils ne peuvent traiter que les fichiers de type .xls. Pour traiter les fichiers de type .xlsx, il existe le module tablib, « Format agnostic tabular data library (XLS, JSON, YAML, CSV) » (pypi.python.org/pypi/tablib/).

 

Pour aller plus loin

Le site www.python-excel.org/ fournit tous les éléments pour aller plus loin, en particulier un tutoriel détaillé (python-excel.googlegroups.com/web/python-excel.pdf, toutes les possibilités d'OpenOffice/Libre Office sont quasi disponibles). Un module offrant des fonctions supplémentaires est aussi disponible, xlutils. Il permet de copier, de modifier et/ou de filtrer des fichiers .xls existants.

avec Quantum Gis

Il est donc possible  d'importer des fichiers Excel dans la console Python de Quantum GIS et de créer une couche points à partir des éléments x y d'un fichier (voir « Memory Provider » dans www.qgis.org/pyqgis-cookbook/vector.html)

couche Excel dans Quantum GIS

  1. import xlrd
  2. from PyQt4.QtCore import *
  3.  
  4. # lecture du fichier Excel, avec id,x,y,test
  5.  
  6. [lecture des lignes]
  7.  
  8. # création d'une couche memory dans Quantum GIS
  9. vl = QgsVectorLayer("Point", "test", "memory")
  10.  
  11. # ajout des attributs
  12. pr = vl.dataProvider()
  13. pr.addAttributes( { "id" : "int" } )
  14. pr.addAttributes( { "test" : "str" } )
  15.  
  16. # création du premier point :
  17. fet = QgsFeature()
  18.  
  19. # traitement de la première ligne
  20. fet.setGeometry(QgsGeometry.fromPoint(QgsPoint(x1,y1)))
  21. fet.setAttributeMap( { 0 : QVariant("id1"), 1 : QVariant("test1")} )
  22. vl.updateExtents()
  23.  
  24. [suite des insertions]
  25.  
  26. vl.updateExtents()
  27. vl.commitChanges()
  28.  
  29. # ajout de la couche dans Quantum GIS
  30. QgsMapLayerRegistry.instance().addMapLayer(vl)

L'étape suivante serait éventuellement la création d'un plugin, mais je n'ai pas beaucoup le temps.

Tous les traitements ont été effectués sur Mac OS X avec Python 2.6.1.

Site officiel : Python for Windows, Ressources and examples


Creative Commons License
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique Commerciale 2.0 France

Commentaires

erreur dans le code:

il y a une erreur lors de la creation du fichier excel :

# création
test = Workbook()
je remplacerais par 'book'

Pareil pour la fin : book.save

Lorsque vous créer les feuilles dans le fichier vous appelez bien :
'book.xxxx'

il faut que tout les objets correspondent.

Cordialement

merci pour signaler une

merci de signaler une erreur mais elle n'est pas où vous le soulignez:

  • la fonction = workbook() est obligatoire pour créer un classeur
  • ensuite vous ajoutez une feuille au classeur avec la fonction .add_sheet()

Donc le script correct est:

# création du classeur book
book = Workbook()
# ajout d'une feuille au classeur book
feuil1 = book.add_sheet('feuille 1')

 

 

Bonjour, Python dev a

Bonjour,
Python dev a exactement raison, il ya une erreur. Je crois qu'il ne s'est pas bien expliqué.
A la ligne 4 vous mettez 'book = Workbook()' et à la ligne 33 vous mettez 'test.save('monsimple.xls')' et non 'book.save('monsimple.xls')'.

suite

merci, cela vient de la correction demandée par Python dev (book à la place de test) et d'un oubli de ma part pour la seconde correction.

Plugin

Contribution très intéressante. En effet, pour les habitués à ArcGIS, ouvrir un fichier Excel comme n'importe quel fichier texte et créer des couches de formes avec son contenu est une opération très simple. Un petit plus qui manque cruellement quand on passe à QGIS.

N'étant pas expert en Python, c'est effectivement le plugin qui serait le plus intéressant pour moi. Je ne pense pas être le seul, d'ailleurs. Je me réjouissais donc du lien publié le 06/10/2011. Malheureusement, la page web n'existe plus. Où pourrait-on le trouver ?

suite

J'ai placé une version permettant de créer des shapefiles à partir des fichiers Excel sur le nouveau site des plugins QGIS

plugins.qgis.org/snippets/3/

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.