Lire et écrire dans un fichier XLS avec Python


< 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 :


Télécharger le code de l’article

12 thoughts on “Lire et écrire dans un fichier XLS avec Python

  • kontre

    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

  • Poulet 2.0

    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é.

  • panchua

    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.

  • Guts

    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 :

    import csv, xlrd, xlwt
        def xls2csv(self, xlspath):
            u""" export an Excel 2003 file (.xls) to a CSV file
            see: http://stackoverflow.com/a/10803229 """
            with xlrd.open_workbook(xlspath) as book:
                sheet = book.sheet_by_index(0)
                with open('temp/' + path.splitext(path.basename(xlspath))[0] + '.csv', 'wb') as f:
                    out = csv.writer(f, delimiter='t', dialect = 'excel')
                    for row in range(sheet.nrows):
                        try:
                            out.writerow(sheet.row_values(row))
                        except:
                             out.writerow([unicode(s).encode("utf-8") for s in sheet.row_values(row)])
     
            # End of function
            return book, f

    J’ai bien essayé d’utiliser le paramètre encoding override mais sans succès… Une ch’tite idée dans l’assistance ?

  • Sam Post author

    @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.

  • Poulet 2.0

    @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.

  • dad

    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”) ;)

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.