Microsoft Excel, même s'il est de plus en plus concurrencé par Open Office Calc, est un des logiciels les plus connus et les plus utilisés à travers le monde. Qui n'a pas un jours crée un tableau et fait quelques calculs dans ce tableur ou un de ses clones? Dès qu'il s'agit de stocker et de classer des données, on est vite tenté de créer un tableur. Excel est donc devenu un standard de fait pour l'échange des données.
Ainsi, J'ai reçu dernièrement un fichier Excel dont il m'a fallu extraire les données et les insérer dans une base de donnée d'un site internet. Bien évidemment cette tâche peut-être très lourde à exécuter manuellement et j'ai donc réaliser un script Python pour le faire automatiquement.
Il existe plusieurs méthodes pour cela, la plus connue est de piloter Excel grâce à son interface COM. Un interface COM est un composant qui existe dans la plupart des logiciels Microsoft et qui permet à un autre logiciel d'en prendre le contrôle. L'explication est rapide mais j'espère qu'elle éclairera ceux qui n'ont jamais transpiré avec la technologie COM.
Malheureusement, cette solution ne fonctionnait pas pour moi puisque la machine sur laquelle je devais faire l'import est celle de mon hébergeur Internet. Impossible donc d'installer Excel ou OpenOffice. De plus cette machine fonctionne sous Linux.
Heureusement, j'ai découvert le module Python xlrd qui permet de lire un fichier Excel sans avoir Excel et sous n'importe quel OS avec Python. Voila mon problème résolu!
Je vous propose donc un petit script qui montre comment on peut extraire les données d'un fichier Excel avec xlrd. Vous noterez que c'est très simple. La plus grosse difficulté venant de la conversion unicode vers ascii pour éviter les erreurs sur des caractères accentués.
import xlrd
book = xlrd.open_workbook("mon_fichier.xls")
sheet = book.sheet_by_index(0) # ou: sheet_by_name("Ma feuille")
for row_index in xrange(sheet.nrows):
row= ""
for col_index in xrange(sheet.ncols):
value = sheet.cell(rowx=row_index,colx=col_index).value
if type(value) is unicode:
value = unicodedata.normalize('NFKD', value).encode('ascii','ignore')
row += "{0} - ".format(value)
print row
Je pense que ce module me rendra de grands services: import de données, tests... Peut-être cela sera aussi le cas pour vous.
C'est aussi l'occasion pour moi de vous souhaiter de bonnes fêtes de fin d'année.