Ce que vous saurez faire à la fin
- Installer Python + pandas en 10 minutes
- Lire, filtrer, agréger un fichier Excel de millions de lignes
- Consolider 50 fichiers en 10 lignes de code
- Générer automatiquement un rapport Excel formaté
- Automatiser l’exécution mensuelle via Task Scheduler
Durée : 3 heures. Pré-requis : Windows/Mac/Linux, droits d’installation, connaissance basique Excel.
Étape 1 — Installer Python
- Allez sur
python.org/downloads. Téléchargez la version 3.12+. - Windows : lors de l’installation, cochez Add Python to PATH. C’est CRITIQUE.
- Terminez l’installation par défaut.
- Ouvrez une console (cmd sur Windows, Terminal sur Mac/Linux) :
python --version # doit renvoyer Python 3.12.x
pip --version # pip 24.x ou plus récent
Étape 2 — Installer les bibliothèques
pip install pandas openpyxl xlsxwriter matplotlib xlwings
pandas: manipulation de données tabulairesopenpyxl: lire/écrire.xlsx (avec pandas)xlsxwriter: écriture.xlsx avec mise en forme avancéematplotlib: graphiquesxlwings: piloter Excel ouvert
Étape 3 — Installer un éditeur
- VS Code (gratuit) :
code.visualstudio.com. - À l’ouverture, installez l’extension Python (Microsoft).
- Créez un dossier
C:\projets\analysespuis ouvrez-le dans VS Code. - Créez un fichier
test.py:
print("Hello Python!")
import pandas as pd
print(pd.__version__)
- Lancez avec le bouton ▶ en haut à droite ou
python test.pydans le terminal.
Étape 4 — Lire un fichier Excel
- Placez
ventes_2026.xlsxdans le dossier projet. - Créez
lire.py:
import pandas as pd
df = pd.read_excel("ventes_2026.xlsx", sheet_name="Data")
print(df.shape) # (145234, 8)
print(df.columns.tolist())
print(df.head(5))
print(df.dtypes)
print(df.describe())
- Exécutez. Vous voyez les 5 premières lignes, les types de chaque colonne, stats numériques.
Étape 5 — Filtrer et sélectionner
dakar = df[df["Region"] == "Dakar"]
grosses = df[df["CA"] > 500_000]
dakar_gros = df[(df["Region"] == "Dakar") & (df["CA"] > 500_000)]
colonnes = df[["Date", "Commercial", "CA"]]
plage_date = df[(df["Date"] >= "2026-01-01") & (df["Date"] < "2026-04-01")]
Étape 6 — Agréger par groupe
par_commercial = (df.groupby("Commercial")
.agg(CA_Total=("CA", "sum"),
Nb_Commandes=("CA", "count"),
Panier_Moyen=("CA", "mean"))
.sort_values("CA_Total", ascending=False))
print(par_commercial.head(10))
Étape 7 — Consolider 50 fichiers en 10 lignes
from pathlib import Path
import pandas as pd
dossier = Path("C:/Rapports/Ventes")
frames = []
for fichier in dossier.glob("Ventes_2026_*.xlsx"):
d = pd.read_excel(fichier)
d["source"] = fichier.name
frames.append(d)
global_df = pd.concat(frames, ignore_index=True)
global_df.to_excel("consolide_2026.xlsx", index=False, engine="openpyxl")
print(f"Consolidé {len(frames)} fichiers, {len(global_df):,} lignes")
Étape 8 — Tableau croisé dynamique
tcd = pd.pivot_table(
df,
values="CA",
index=["Region", "Commercial"],
columns="Mois",
aggfunc="sum",
fill_value=0,
margins=True, margins_name="Total"
)
tcd.to_excel("dashboard.xlsx", sheet_name="TCD")
Étape 9 — Graphiques
import matplotlib.pyplot as plt
top10 = par_commercial.head(10)
top10["CA_Total"].plot(kind="barh", figsize=(10, 6), color="#1E88E5")
plt.title("Top 10 commerciaux - CA 2026", fontsize=14, fontweight="bold")
plt.xlabel("CA (FCFA)")
plt.tight_layout()
plt.savefig("top10.png", dpi=150)
plt.close()
Étape 10 — Export Excel avec mise en forme
with pd.ExcelWriter("rapport.xlsx", engine="xlsxwriter") as w:
par_commercial.to_excel(w, sheet_name="Commerciaux")
wb = w.book
ws = w.sheets["Commerciaux"]
money = wb.add_format({"num_format": "#,##0 \"FCFA\""})
header = wb.add_format({"bold": True, "bg_color": "#1E88E5",
"color": "white", "border": 1})
ws.set_column("B:D", 18, money)
ws.set_row(0, 22, header)
ws.freeze_panes(1, 1)
# Ajouter un graphique natif Excel
chart = wb.add_chart({"type": "column"})
chart.add_series({
"name": "CA Total",
"categories": ["Commerciaux", 1, 0, 10, 0],
"values": ["Commerciaux", 1, 1, 10, 1],
})
ws.insert_chart("F2", chart)
Étape 11 — Automatiser l’exécution
- Transformez votre script en
.pyautonome avec une fonction main. - Windows Task Scheduler :
schtasks /Create /SC WEEKLY /D MON /TN "RapportHebdo" ^
/TR "python C:\projets\analyses\rapport.py" ^
/ST 07:00 /RU "%USERNAME%"
- macOS / Linux : cron.
crontab -e
# Ajouter la ligne:
0 7 * * 1 /usr/bin/python3 /home/user/analyses/rapport.py >> /tmp/rapport.log 2>&1
Étape 12 — Piloter Excel ouvert avec xlwings
import xlwings as xw
wb = xw.Book("dashboard.xlsx")
sht = wb.sheets["DASHBOARD"]
sht.range("B2").value = "Mise à jour: " + pd.Timestamp.now().strftime("%d/%m/%Y %H:%M")
sht.range("C4").options(transpose=True).value = df["CA"].tolist()
wb.save()
Étape 13 — Ajouter une barre de progression
pip install tqdm
from tqdm import tqdm
import time
fichiers = list(dossier.glob("*.xlsx"))
frames = []
for f in tqdm(fichiers, desc="Lecture"):
frames.append(pd.read_excel(f))
Étape 14 — Gérer les erreurs
import logging
logging.basicConfig(
filename="rapport.log",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
try:
df = pd.read_excel("ventes.xlsx")
logging.info(f"Lecture OK: {len(df)} lignes")
except FileNotFoundError:
logging.error("Fichier ventes.xlsx introuvable")
raise
except Exception as e:
logging.error(f"Erreur imprévue: {e}")
raise
Étape 15 — Checklist d’un script robuste
✓ Chemins paramétrables (argparse ou variables env)
✓ Logging activé (fichier + console)
✓ try/except autour des I/O fichiers
✓ Validation des données (colonnes présentes, types)
✓ Barre de progression pour jobs longs
✓ Durée totale affichée à la fin
✓ Exit code non-zéro si échec (pour monitoring)
✓ Sauvegarde des fichiers avant modification
Voir aussi
- Python dans Excel : analyser ses données avec pandas et matplotlib
- Python pandas : traiter Excel et CSV en pratique
- Excel : scoring client RFM pour e-commerce africain
Pourquoi Python remplace les macros VBA dans la finance ouest-africaine
Dans la majorité des cabinets comptables et directions financières de Dakar, Abidjan ou Douala, les analystes passent encore 40 % de leur temps à recopier-coller entre fichiers Excel, à reformater des balances âgées exportées de Sage, à fusionner des extractions bancaires Ecobank et UBA. Python avec deux bibliothèques (pandas et openpyxl) transforme ce travail répétitif en script qui tourne en 30 secondes. La courbe d’apprentissage tient en 3 semaines pour un analyste qui maîtrise déjà les formules RECHERCHEV et les tableaux croisés dynamiques.
Ce tutoriel cible l’analyste financier ou le contrôleur de gestion qui n’a jamais écrit une ligne de code. Vous installerez Python proprement, créerez votre premier script de consolidation mensuelle, automatiserez l’envoi du reporting par mail, et apprendrez à facturer cette compétence comme prestation freelance entre 80 000 et 150 000 FCFA par mission de PME.
Étape 1 — Installer Python 3.12 et VS Code sur Windows pro
Téléchargez Python 3.12.x (LTS de la branche 3.12 — la 3.13 est sortie mais les libs Excel comme xlwings traînent un peu) depuis python.org. Cochez impérativement Add Python to PATH à l’installation, sinon vous passerez 1 heure à débugger des erreurs 'python' is not recognized. Vérifiez ensuite dans PowerShell :
python --version
pip --version
Vous devez voir Python 3.12.7 (ou supérieur) et pip 24.x. Installez VS Code (gratuit, ~95 Mo) et l’extension Python officielle de Microsoft. Évitez Anaconda pour ce cas d’usage : 3 Go pour 5 % de fonctions utiles à un analyste, et la licence commerciale est devenue payante au-delà de 200 employés depuis 2024.
Étape 2 — Créer un environnement virtuel par projet
Un venv isole les dépendances de chaque mission. Sans ça, mettre à jour pandas pour le client A casse le script du client B. Dans le dossier du projet :
cd C:\Projets\reporting-cabinet-fall
python -m venv .venv
.venv\Scripts\activate
pip install pandas==2.2.3 openpyxl==3.1.5 python-dotenv==1.0.1
Le prompt PowerShell affiche maintenant (.venv) en préfixe. Vous savez que vous travaillez dans l’environnement isolé. pandas 2.2.3 est la version stable de référence début 2026, openpyxl 3.1.5 lit/écrit les .xlsx sans dépendre de Microsoft Excel installé.
Étape 3 — Lire un fichier Excel et explorer ses colonnes
Créez script-balance.py dans VS Code. Le code suivant charge une balance comptable exportée de Sage 100 et affiche un aperçu :
import pandas as pd
df = pd.read_excel("balance-2026-04.xlsx", sheet_name="Balance", header=4)
print(df.shape)
print(df.columns.tolist())
print(df.head())
L’argument header=4 indique que la vraie ligne d’en-têtes est à la ligne 5 (Sage met souvent un logo et 3 lignes de titre avant). df.shape renvoie (1247, 8) si vous avez 1247 comptes et 8 colonnes. Si vous voyez Unnamed: 0 dans les colonnes, c’est qu’une cellule fusionnée a glissé — corrigez le header=.
Étape 4 — Filtrer, agréger et créer des indicateurs
L’objectif d’un analyste : calculer le total des charges externes (comptes 61 et 62 du SYSCOHADA), comparer à N-1, sortir le ratio. Avec pandas :
charges = df[df["Compte"].astype(str).str.startswith(("61", "62"))]
total = charges["Solde Débit"].sum() - charges["Solde Crédit"].sum()
print(f"Charges externes avril 2026 : {total:,.0f} FCFA")
Le f-string formate avec séparateur de milliers (15,234,567 FCFA). Sur une balance de 1 200 lignes, le calcul prend 50 ms, contre 4-5 secondes en formule Excel matricielle qui fait souvent planter le classeur sur un Lenovo de 2019.
Étape 5 — Consolider plusieurs filiales en un seul classeur
Un cabinet qui audite un groupe de 6 filiales reçoit 6 balances séparées. Voici le pattern de consolidation :
from pathlib import Path
import pandas as pd
dossier = Path("balances-groupe")
frames = []
for f in dossier.glob("*.xlsx"):
tmp = pd.read_excel(f, sheet_name=0, header=4)
tmp["Filiale"] = f.stem
frames.append(tmp)
consolide = pd.concat(frames, ignore_index=True)
pivot = consolide.pivot_table(
index="Compte",
columns="Filiale",
values="Solde Débit",
aggfunc="sum",
fill_value=0,
)
pivot.to_excel("consolidation-groupe-2026-04.xlsx")
Le tableau croisé dynamique généré par pivot_table est immédiatement exploitable dans Excel. Le fichier de sortie pèse 80-200 Ko et s’ouvre instantanément, contrairement à un classeur Excel manuel avec 6 onglets liés qui dépasse vite 15 Mo.
Étape 6 — Mettre en forme le rendu Excel (couleurs, totaux, gel)
Un livrable client doit être lisible. openpyxl permet d’ajouter mise en forme conditionnelle, gel des volets et formats monétaires :
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = load_workbook("consolidation-groupe-2026-04.xlsx")
ws = wb.active
ws.freeze_panes = "B2"
header_fill = PatternFill("solid", fgColor="1F4E78")
for cell in ws[1]:
cell.font = Font(bold=True, color="FFFFFF")
cell.fill = header_fill
cell.alignment = Alignment(horizontal="center")
for col in ws.iter_cols(min_col=2, min_row=2):
for cell in col:
cell.number_format = '# ##0" FCFA"'
wb.save("consolidation-groupe-2026-04.xlsx")
Le résultat : en-têtes bleu marine en blanc gras, première colonne+ligne figées, montants en FCFA avec espace insécable. Vos clients vous prendront pour un magicien — c’est 30 lignes de code réutilisables pour 50 missions.
Étape 7 — Envoyer le reporting par mail automatiquement
Pour un reporting mensuel envoyé au CEO le 5 du mois à 8h, branchez Python sur Gmail Workspace via mot de passe d’application (jamais le vrai mot de passe Google) :
import smtplib, ssl
from email.message import EmailMessage
from pathlib import Path
msg = EmailMessage()
msg["From"] = "reporting@cabinet-fall.sn"
msg["To"] = "ceo@client-pme.sn"
msg["Subject"] = "Reporting consolidé avril 2026"
msg.set_content("Bonjour,\n\nVeuillez trouver ci-joint la consolidation du mois.\n\nCordialement.")
fichier = Path("consolidation-groupe-2026-04.xlsx")
msg.add_attachment(fichier.read_bytes(), maintype="application",
subtype="vnd.openxmlformats-officedocument.spreadsheetml.sheet",
filename=fichier.name)
ctx = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=ctx) as s:
s.login("reporting@cabinet-fall.sn", "MOT_DE_PASSE_APPLICATION")
s.send_message(msg)
print("Mail envoyé.")
Stockez le mot de passe d’application dans un fichier .env chargé via python-dotenv, jamais en dur dans le script. Activez la 2FA sur le compte Google avant — sinon Google bloque les SMTP depuis 2022.
Étape 8 — Planifier le script chaque 5 du mois (Planificateur Windows)
Sur le poste de travail de l’analyste (laissé allumé en veille programmée), ouvrez Planificateur de tâches, créez une tâche déclenchée le 5 de chaque mois à 08h00, action Démarrer un programme, programme C:\Projets\reporting-cabinet-fall\.venv\Scripts\python.exe, argument script-balance.py, dossier de départ C:\Projets\reporting-cabinet-fall. Cochez Exécuter même si l’utilisateur n’est pas connecté.
Pour un déploiement plus pro (cabinet qui ne veut pas dépendre d’un PC allumé), basculez sur un VPS Hetzner CX22 (4,59 EUR/mois soit 3 010 FCFA) sous Ubuntu avec un cron 0 8 5 * *. Comptez 1 heure de migration la première fois.
Étape 9 — Facturer la prestation : grille tarifaire Afrique francophone 2026
Trois formules qui marchent terrain : (1) setup one-shot — analyse besoin + script + formation 2h utilisateur, 120 000 à 180 000 FCFA selon complexité du fichier source ; (2) abonnement maintenance — 25 000 FCFA/mois pour adapter le script si Sage change de format, hotline WhatsApp 48h ouvrées ; (3) formation collective — 1 jour intra-cabinet pour 4-6 analystes, 350 000 à 500 000 FCFA. Réglez par Wave, Mixx by Yas ou virement BCEAO. Évitez PayPal qui prélève 4-5 % et bloque souvent les comptes ouest-africains.
Dans la continuité, lisez notre tutoriel Python débutant complet et notre guide pandas pour remplacer les TCD Excel.
Erreurs courantes des analystes débutants en Python (et leurs corrections)
Cinq problèmes reviennent en formation chez les analystes ouest-africains qui découvrent Python : (1) encodage — un export Sage en latin-1 affiche Société au lieu de Société ; passez encoding="latin-1" à read_csv ou ré-exportez en UTF-8 depuis Sage ; (2) séparateur décimal — un fichier français utilise la virgule (1 234,56), pandas attend le point ; passez decimal="," et thousands=" " à la lecture ; (3) dates — les colonnes datées en texte (15/04/2026) doivent être converties par pd.to_datetime(df["Date"], format="%d/%m/%Y", errors="coerce") sinon les filtres temporels échouent silencieusement.
(4) cellules fusionnées — un export comptable manuel avec fusions casse pandas ; demandez systématiquement au client un export brut sans mise en forme ; (5) fichiers verrouillés — Excel garde un verrou exclusif, fermez-le avant de lancer le script ou ajoutez un try/except PermissionError qui demande à l’utilisateur de fermer le fichier. Documentez ces 5 cas dans un README livré au client : vous économiserez 80 % des appels de support la première année.
Bonus — versionner les scripts client avec Git local
Initialisez un dépôt Git local par mission (git init dans le dossier projet), commitez chaque évolution avec un message clair en français (« ajout filtre comptes 71 produits divers »). Vous pourrez revenir 3 mois en arrière si un changement casse le reporting. Pas besoin de GitHub : le .git local suffit pour un freelance solo. Si vous travaillez en cabinet à plusieurs, hébergez sur Gitea self-hosted (gratuit, ~150 Mo RAM sur le VPS Hetzner déjà en place).