Vous êtes sur la page 1sur 6

MANIPULATION DES FICHIERS EXCELS

Prerequis:
- Connaître les notions de base des classeurs excel
- Avoir excel installé sur son ordinateur. Ou alors open office si on utilise MAC
ou Linux.
- revoir les notions sur la lecture et l'écriture des fichiers en python
(optionnel)

1. Création des fichiers excels

Pour commencer, il va falloir disponibiliser des fichiers excels sur notre post de
travail.
Vous pouvez créer vos propres fichiers, mais je recommande de télécharger des
fichiers que j'avais déjà préparer pour vous
dans le dossier partager.

2. Création du projet

Lancez visual studio code et créer le dossier qui doit contenir votre projet.
Donnez-lui le nom de votre choix.
Dans le dossier, créer le fichier "fichiers_excel.py" et ouvrez-le dans l'éditeur
de code.

Copiez le fichier fichiers_excel.zip se trouvant dans le dossier partagé à la


racine de votre projet.
Déziper le fichier et utilisant une technique de dézippage de votre choix.
Si vous utilisez un MacBoock, concerver uniquement le dossier MACOSX, si vous
utilisez Windows, conservez uniquement le dossier excel.

3. Installation de la librairie openpyxl.

Nous allons utilisez la librairie openpyxl pour manipuler les ficher python.
Ouvrez votre terminal et tapez la commande:

pip install openpyxl (Si vous utilisez Linux ou Mac, tapez pip3).

Dans la commande ci-dessus, je précise la version de openpyxl que j'ai moi-même


utilisé pour être sûr que vous n'avez pas de surprises lors de l'installation.

4. Importation de openpyxl et lecture des fichiers excel

Ouvrez le fichiers_excel.py que vous avez créé et importer openpyxl.

import openpyxl

A ce stade, nous pouvons déjà ouvrir les fichiers excels et avoir accès à leurs
contenus.
Ouvrons le fichier octobre.xlsx et recupérons le résultat dans une variable.

wb = openpyxl.load_workbook('octobre.xlsx')

Nous pouvons déjà tester pour savoir combien des feuilles il y a dans notre
workbook (classeur).

print(wb.sheetnames)

Exécuter le script pour savoir combien de feuilles il y a dans le classeur. Vous


devriez avoir un tableau avec une seule feuille ['Feuil1']

Attention: Si vous avez une erreur, rassurez vous que vous lancez le script à
partir du bon réportoir. Vous devez lancer le script à partir du répertoire qui
contient vos fichiers excel. Sinon, il faut alors préciser le chemin vers vos
fichiers pour que le script soit en mesure de retrouver le fichier à ouvrir.

Une fois que l'on connait le nom d'une feuille, on peut la récupérer dans une
variable et pouvoir y faire des opérations.
sheet = wb['Feuil1']

On peut aussi récupérer la feuille d'une autre manière


sheet = wb[wb.sheetnames[0]] # On recupère la première feuille du classeur
sheet = wb.active # On récupère la feuille active

Pour lire les données dans la feuille. Ajouter les instructions suivantes et
exécutés le fichier pour voir le résultat.

cell = sheet['A1']
print(cell.value)

Ici, nous avons eu accès à la cellule en précisant le nom de la cellule, mais il


est récommandée d'accéder aux cellules avec leurs coordonnées. Ainsi, le deux
lignes qui précèdent peuvent s'écrire de la manière suivante:

cell = sheet.cell(row=1, column=1)


print(cell.value)

ou bien

cell = sheet.cell(1, 1)
print(cell.value)

Cette façon d'écrire peut nous permettre d'appliquer les boucles pour lire les
données sur un plage de cellules.
Prenons l'exemple de la plage des prix unitaires de tous les articles (B2:B6)

for i in range(2, 7):


cell =sheet.cell(row=i, column=2)
print(cell.value)

NB: Si vous lisez la valeur d'une cellule vide, vous recevez le résultat "None".

Choisissez de lire une cellule vide dans le classeur et affichez le résultat pour
vérifier. Utiliser l'une des méthodes utilisées plus haut pour lire les cellules.

print(sheet.max_row)
print(sheet.max_column)

5. Lectures des plusieurs fichiers

Une façon d'ouvrir plusieurs fichiers c'est de reprendre l'instruction de lecture


sur chaque fichier.

wb = openpyxl.load_workbook('octobre.xlsx')
wb2 = openpyxl.load_workbook('novembre.xlsx')
wb3 = openpyxl.load_workbook('decembre.xlsx')
Nous allons alors essayer de collecter les données de chacun de ces fichiers excel
pour constituer une structure des données que nous pouvons manipuler à notre guise.
Dans cette étape, nous allons intéresser par exemples au total des ventes pour
chaque article pour tous les trois mois.

Commençons par récupérer les noms des articles et les totaux des ventes. Stockons-
les dans un dictionnaires.

sheet1 = wb.active
donnees = {}
for row in range(2, sheet1.max_row):
nom_article= sheet1.cell(row, column=1).value
if not nom_article:
break
total_vente = sheet1.cell(row, column=4).value
donnees[nom_article] = total_vente

print(donnees)

Lancez le fichier et analyser le résultat. Que voyez-vous? Quelque chose d'étrange?


Effectivement, vous remarquez que le dictionnaire a récupéré des formules à la
places des valeurs. Corrignons cela. Cela se corrige au niveau de l'ouverture des
fichiers. Rentrons dans le code et ajoutons un paramètre à chaque instruction
d'ouverture de fichier.

wb = openpyxl.load_workbook('octobre.xlsx', data_only=True)
wb2 = openpyxl.load_workbook('novembre.xlsx', data_only=True)
wb3 = openpyxl.load_workbook('decembre.xlsx', data_only=True)

Exécutez le script et observez le résultat.

Jusqu'à présent, nous lisons dans un seul fichier. Comment lire les autres fichiers
et ajouter les données à notre dictionnaire.

Nous allons d'abords modifier le code pour qu'on récupère une liste de prix pour
chaque article étant donnée qu'il s'agit de plusieurs mois. On modifie uniquement
la ligne :

donnees[nom_article] = [total_vente]

Excécutez le code et observez le résultat.

Ensuite, on va crééer une fonction pour nous permettre de pouvoir lire tous les
classeurs.
Cette fonction aura donc deux paramètres: le classeur à lire et le dictionnaire qui
doit recevoir les données. Modifions notre code ainsi:

def ajouter_data_depuis_wb(wb, donnees):


sheet = wb.active
for row in range(2, sheet.max_row):
nom_article= sheet.cell(row, column=1).value
if not nom_article:
break
total_vente = sheet.cell(row, column=4).value
donnees[nom_article] = [total_vente]

On va alors consitituer notre dictionnaire de données en appelant cette fonction


sur chaque classeur.
dictionnaires = {}
ajouter_data_depuis_wb(wb1, dictionnaires)
print(dictionnaires)

Exécutez le code et observer le résultat. Nous avons le même résultat.


Maintenant ajoutons les autres classeurs et observons le résultat.

dictionnaires = {}
ajouter_data_depuis_wb(wb1, dictionnaires)
ajouter_data_depuis_wb(wb2, dictionnaires)
ajouter_data_depuis_wb(wb3, dictionnaires)
print(dictionnaires)

On exécutant ce script, on sera évidemment compte que le dictionnaire n'ajoute pas


les autres mois, mais il écrase les données existantes. Corrigons le code pou qu'il
ajoute les données au dictionnaires sans écraser les données existantes.

Ainsi, la boucle de notre fonction devient:

for row in range(2, sheet.max_row):


nom_article= sheet.cell(row, column=1).value
if not nom_article:
break
total_vente = sheet.cell(row, column=4).value
if donnees.get(nom_article):
donnees[nom_article].append(total_vente)
else:
donnees[nom_article] = [total_vente]

Ceci permet de résoudre un dilème. Même si l'ordre des articles au niveau des
classeurs n'est pas identique, le script ajoutera les données en respectant la
correspondance avec la clé.

6. Génération des fichiers excel

Dans cette section, nous allons nous arranger pour créer un fichier qui stockera
les données que nous avons récupérées dans la section précédente. Il s'agit
d'enregister les ventes d'octobre, de novembre et de décembre pour chaque pour
article.

Nous allons dévoir nommer certaines choses manuellement dans python pour nous
permettre d'insérer les valeurs automatiquement plus tard.

#On crée d'abord un classeur

wb_final = openpyxl.Workbook()

#On récupère la feuille active

sheet_final = wb_final.active

#On peut renommer la feuille si on le souhaite


sheet_final.title = "Ventes" # Renommer la feuille

#On donne les valeurs aux quatres premières cellues (A1, B1, C1, D1)
sheet_final.append(["Article", "Octobre", "Novembre", "Décembre"])
#On enregistre en créant un fichier nommé ventes.xlsx. Cette instruction vient
toujours à la fin de toutes les intructions d'écriture.
wb_final.save("ventes.xlsx")

Exécutez le code et observer le résultat.

Une autre façon de donner les valeurs aux cellules est la suivante:
sheet_final['A1'] = "Article"
sheet_final['B1'] = "Octobre"
sheet_final['C1'] = "Novembre"
sheet_final['D1'] = "Decembre"

Utilisez la forme qui vous inspire.

Ajoutons la liste des articles dans la feuille. On commence à compter à partir de


la ligne 2 parce que la première ligne contient déjà les titres. On itère et on
récupère chaque élément du dictionnaire comme un tuple, on stocke la première
valeur du tuple dans nom_article et le tableau de ventes dans la variables ventes.
Ce qu'on ajoute dans la cellule, c'est la valeur nom_article.

row = 2 # On commence à la ligne 2


for i in dictionnaires.items():
print(i)
nom_article = i[0]
ventes = i[1]
sheet_final.cell(row=row, column=1).value = nom_article
row += 1
wb_final.save("ventes.xlsx")

Exécutez le code pour voir les résultats.

Ajoutons les valeurs des ventes. Nous allons modifiez la boucle pour ajouter les
ventes. Nous devons itérer sur la variable vente qui contient les valeurs.

row = 2 # On commence à la ligne 2


for i in dictionnaires.items():
print(i)
nom_article = i[0]
ventes = i[1]
sheet_final.cell(row=row, column=1).value = nom_article
for j in range(0, len(ventes)):
sheet_final.cell(row=row, column=j+2).value = ventes[j]
row += 1
wb_final.save("ventes.xlsx")

Ceci est aussi simple si nous choisissons d'utiliser les tableaux à deux
dimensions. Ajoutons les articles et les valeurs dans la la feuille.

row=2
for i in dictionnaires:
print(i)
sheet_final.cell(row, 1).value = i
sheet_final.cell(row, 2).value = dictionnaires[i][0]
sheet_final.cell(row, 3).value = dictionnaires[i][1]
sheet_final.cell(row, 4).value = dictionnaires[i][2]
row += 1
wb_final.save("ventes.xlsx")
7. Ajouter un graphique

Partant du fichier vente créé, nous allons construire un graphique pour voir
comment les prix des articles ont évolué de Octobre à Décembre.

D'abord, il y a ce qu'on n'appelle, la référence. On doit indiquer à notre


graphique la plage de données à utiliser pour constituer notre graphique.
Pour nous, les données vont de B2 à D6. Mais nous allons nous baser uniquement sur
l'évolution du prix de la pomme de terre dans cette exercice.

Créons la référence.

graphique_ref = openpyxl.chart.Reference(sheet_final, min_col=2, min_row=2,


max_col=4, max_row=2)

Créons la série. Celle-ci corresponds à ce que le représente le graphique. Vous le


verrez lors de l'affiche des résultats. C'est un peu comme la légende.

graphique_series = openpyxl.chart.Series(graphique_ref, title="Ventes en euro")

#Choisissons le type de graphique:

graphique= openpyxl.chart.BarChart()

#Ajoutons un titre à notre graphique

graphique.title = "Ventes trimestriel pommes"

#Ajoutons la série au graphique:

graphique.append(graphique_series)

#Enfin, ajoutons le graphique à la feuille et précison la cellule où afficher le


graphique.
sheet_final.add_chart(graphique, "F2")

#Enregistrons notre fichier.


wb_final.save("ventes.xlsx")

Exécuter pour voir le résultat.

Félicitation. Maintenant vous avez appris à manipuler des fichiers excel avec
Python.
Pour en savoir plus sur le graphique, prière consulter la documentation via ce
lien: https://openpyxl.readthedocs.io/en/stable/charts/introduction.html

Vous aimerez peut-être aussi