< Insérer ici vous-même troll sur Microsoft et LibreOffice et les formats >
Puis, une fois cette corvée administrative remplie, faites un pip install:
pip install xlutils |
Ceci va installer deux lib dont on va avoir besoin : xlrd pour la lecture, et xlwt pour l’écriture.
Ensuite c’est très simple…
Pour écrire dans un fichier Excel :
import xlrd from xlwt import Workbook, Formula path = r"C:\chemin\vers\fichier.xls" # On créer un "classeur" classeur = Workbook() # On ajoute une feuille au classeur feuille = classeur.add_sheet("OCB") # Ecrire "1" dans la cellule à la ligne 0 et la colonne 0 feuille.write(0, 0, 1) # Ecrire "2" dans la cellule à la ligne 0 et la colonne 1 feuille.write(0, 1, 2) # Ecrire une formule dans la cellule à la ligne 0 et la colonne 2 # qui va additioner les deux autres cellules feuille.write(0, 2, Formula('A1+B1')) # Ecriture du classeur sur le disque classeur.save(path) print u"Fichier créé: {}".format(path) ## Fichier créé: C:\chemin\vers\fichier.xls |
Ce qui nous pond un truc comme ça.
Et pour lire ce même fichier :
import xlrd # Réouverture du classeur classeur = xlrd.open_workbook(path) # Récupération du nom de toutes les feuilles sous forme de liste nom_des_feuilles = classeur.sheet_names() # Récupération de la première feuille feuille = classeur.sheet_by_name(nom_des_feuilles[0]) print u"Lecture des cellules:" print "A1: {}".format(feuille.cell_value(0, 0)) print "B1: {}".format(feuille.cell_value(0, 1)) # On ne peut pas lire les les valeurs des cellules avec formules print "C1: {}".format(feuille.cell_value(0, 2)) ## Lecture des cellules: ## A1: 1.0 ## B1: 2.0 ## C1: |
Comme vous pouvez le voir à la dernière ligne, lire une cellule avec une formule ne revoit rien. L’auteur de la lib explique en effet que les formules sont stockées sous forme de bytecode et qu’il faudrait les décompiler pour obtenir le texte original.
Il existe d’autres manières d’accéder à des fichiers XLS, puis puissantes mais aussi beaucoup plus contraignantes :
- Manipuler Office directement via l’API COM: Windows uniquement, et nécessite d’avoir le logiciel installé.
- Manipuler Open Office via l’API UNO, qui demande aussi d’avoir la suite bureautique installée.
C’est rigolo qu’on puisse écrire les formules mais pas les lire !
Pour les scientifiques (ou les autres, je suis pas ségrégationniste) qui chargent des données depuis des fichiers xls (ou csv, ou texte, ou hdf5, ou…), je vous conseille plus que fortement d’utiliser la librairie pandas. Ça sort directement des tableaux numpy avec les noms des entêtes, ça gère les points manquants, c’est magique. Et ça utilise xlrd en backend, bien entendu. C’est “plus puissant mais aussi beaucoup plus contraignant”. J’ai découvert ça après avoir parsé des fichiers à la main, la différence est radicale !
http://pandas.pydata.org/
http://pandas.pydata.org/pandas-docs/stable/io.html#excel-files
Mouais, il faut avoir Bac+12 pour comprendre l’API UNO.
Il manque à cet article un paragraphe sur le format “.xlsx” (le format “ouvert” de Microsoft):
Depuis récemment (?), le module xlrd sait lire un fichier Excel 2010, mais son jumeau xlwt ne sait pas encore écrire dans ce format.
Pour cà, il existe la librairie openpyxl, le peu que j’en ai testé c’est qu’elle est moins réactive pour lire un fichier (la faute au format, XML compressé), mais elle semble stable et complète.
La librairie Pandas utilise d’ailleurs ces 3 modules en interne selon le format Excel utilisé.
Pour écrire du xls ou xlsx, tablib fait du très bon boulot (xlwt en backend). Par contre il n’a pas l’air de pouvoir les lire.
Salut,
@sil : +1000 sur windows tu peux ajouter 5 ans d’études supplémentaires
@Poulet 2.0 : il y a également Python-docx qui se base sur le puissant lxml.
L’API COM est réellement une autoflagellation à l’acide pour faire le moindre truc.
ceci étant dit, je rencontre actuellement un souci sur une fonction d’export d’un xls vers csv, au niveau de l’encoding. L’idée étant d’exporter un fichier d’adresses (hispanophones) au format .xls en entrée vers du .csv afin de pouvoir l’importer dans postgresql (9.2) dont l’encoding de la table est nécessairement fixé sur LATIN1. Les caractères spéciaux, correctement encodés dans le excel finissent par apparaître merdiquement dans la table pg en sortie. Et a priori, ça chie dans la colle au moment de l’export en csv, malgré un encodage à la volée.
Ex d’adresse :
dans le excel : Av. Carlos Alberto Izaguirre Nº 813
dans pg : “Av. Carlos Alberto Izaguirre Nº 813”
Ci-dessous la fonction d’export :
J’ai bien essayé d’utiliser le paramètre encoding override mais sans succès… Une ch’tite idée dans l’assistance ?
Mouais. Moi j’utilise pyexcelerator (http://pyexcelerator.sourceforge.net). Je ne sais pas s’il est mieux ou moins bien mais comme j’étais seul quand il m’a fallu me dém… pour crer de l’Excel ben c’est lui que j’ai choisi…
@Guts: a priori, je dirais que unicode(s) devrait être s.decode(‘un_encoding’) et qu’il faudrait le connaitre (et éviter le try / except généraliste qui cache surement un bug d’encoding du à la méconnaissance du format). Sinon, comme il n’y a pas le code de la sauvegarde dans posgres, si le code de récupération de la donnée depuis posgress (deux autres points ou ça peut foirer), on ne peut pas savoir. Un article sur l’encoding en Python arrive demain, si tu te sens d’attendre.
@Fred: je peux me tromper (lourdement, j’ai l’habitude), mais PyExcelerator n’est plus maintenu. Les légendes numériques racontent que xlrd/xlwt a demarré comme un fork de PyExcelerator, il est maintenu et la transition devrait se faire en douceur.
Cette lib m’a bien sauvée today elle en plus très facile à prendre en main, création d’un fichier xls en 2minutes chrono!
Très sympas tout ça.
Merci . Par contre workbook.save(path) dans le 1er notebook marche pas :
NameError: name ‘workbook’ is not defined
Apparemment on a pas besoin.
Et vraiment génial ton add_sheet(“OCB”) ;)
Ouai erreur de copier/ coller :)