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
import xlrd # ouverture du fichier Excel wb = xlrd.open_workbook('testxy.xls') # feuilles dans le classeur print wb.sheet_names() [u'Feuil1', u'Feuil2', u'Feuil3'] # lecture des données dans la première feuille sh = wb.sheet_by_name(u'Feuil1') for rownum in range(sh.nrows): print sh.row_values(rownum) [u'id', u'x', u'y', u'test'] [1.0, 235.0, 424.0, u'a'] [2.0, 245.0, 444.0, u'b'] [3.0, 255.0, 464.0, u'c'] [4.0, 265.0, 484.0, u'd'] [5.0, 275.0, 504.0, u'e'] [6.0, 285.0, 524.0, u'f'] [7.0, 295.0, 544.0, u'g'] # lecture par colonne colonne1 = sh.col_values(0) print colonne1 [u'id', 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0] colonne2=sh.col_values(1) print colonne2 [u'x', 235.0, 245.0, 255.0, 265.0, 275.0, 285.0, 295.0] # extraction d'un élément particulier print colonne1[1],colonne2[1] 1.0 235.0 etc...
- 5835 lectures
création d'un fichier Excel
from xlwt import Workbook # création book = Workbook() # création de la feuille 1 feuil1 = book.add_sheet('feuille 1') # ajout des en-têtes feuil1.write(0,0,'id') feuil1.write(0,1,'x') feuil1.write(0,2,'y') feuil1.write(0,3,'test') # ajout des valeurs dans la ligne suivante ligne1 = feuil1.row(1) ligne1.write(0,'1') ligne1.write(1,'235.0') ligne1.write(2,'424.0') ligne1.write(3,'a') etc... # ajustement éventuel de la largeur d'une colonne feuil1.col(0).width = 10000 # éventuellement ajout d'une autre feuille 2 feuil2 = book.add_sheet('feuille 2') etc... # création matérielle du fichier résultant book.save('monsimple.xls')
- 5767 lectures
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
import xlrd from PyQt4.QtCore import * # lecture du fichier Excel, avec id,x,y,test [lecture des lignes] # création d'une couche memory dans Quantum GIS vl = QgsVectorLayer("Point", "test", "memory") # ajout des attributs pr = vl.dataProvider() pr.addAttributes( { "id" : "int" } ) pr.addAttributes( { "test" : "str" } ) # création du premier point : fet = QgsFeature() # traitement de la première ligne fet.setGeometry(QgsGeometry.fromPoint(QgsPoint(x1,y1))) fet.setAttributeMap( { 0 : QVariant("id1"), 1 : QVariant("test1")} ) vl.updateExtents() [suite des insertions] vl.updateExtents() vl.commitChanges() # ajout de la couche dans Quantum GIS QgsMapLayerRegistry.instance().addMapLayer(vl)
- 4791 lectures
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
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique Commerciale 2.0 France
Commentaires
demande d'aide
ce tuto sert a creer un fichier exel qui n'est pas enregistré sur le disque pouvez vous m'aider?
merci d'avance
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:
Donc le script correct est:
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 ?
Martin avait poursuivit sur
Martin avait poursuivit sur le forumsig http://www.forumsig.org/showthread.php/32962-Enfin-plugin-pour-lire-et-%...
Précisant l'existance d'un plugin
http://plugins.qgis.org/plugins/xytools/
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