Le processus manuel remplacé
Chaque lundi, une assistante commerciale ouvre un fichier par région, copie les lignes dans un classeur maître, construit un tableau croisé et ajuste la mise en forme. Une heure de travail et des erreurs dès qu'un fichier a une colonne de plus.
Étape 1 : combiner les fichiers
glob trouve tous les fichiers ; chaque ligne garde son fichier d'origine pour la traçabilité.
from pathlib import Path
import pandas as pd
frames = []
for f in Path("regions").glob("*.xlsx"):
d = pd.read_excel(f)
d["source"] = f.stem
frames.append(d)
data = pd.concat(frames, ignore_index=True)Étape 2 : la synthèse
pivot_table reproduit le tableau croisé dynamique, totaux compris.
synthese = data.pivot_table(
index="commercial", columns="source", values="montant",
aggfunc="sum", fill_value=0, margins=True, margins_name="Total",
)Étape 3 : écrire et mettre en forme
On écrit les deux feuilles puis openpyxl met l'en-tête en gras, applique le format monétaire et fige la première ligne.
from openpyxl import load_workbook
from openpyxl.styles import Font
out = "rapport_hebdo.xlsx"
with pd.ExcelWriter(out) as w:
synthese.to_excel(w, sheet_name="Synthese")
data.to_excel(w, sheet_name="Detail", index=False)
wb = load_workbook(out)
ws = wb["Synthese"]
for cell in ws[1]:
cell.font = Font(bold=True)
for row in ws.iter_rows(min_row=2, min_col=2):
for cell in row:
cell.number_format = '#,##0.00 €'
ws.freeze_panes = "B2"
wb.save(out)Étape 4 : planifier
Sous Windows, le Planificateur de tâches lance python rapport.py chaque lundi à 8 h ; sous macOS/Linux, une ligne cron 0 8 * * 1. Ajoutez un try/except qui journalise les erreurs.
Aller plus loin
Vérifiez les colonnes avant la concaténation et envoyez le rapport par e-mail avec smtplib. Décrivez votre propre structure de fichiers à FormulAI pour obtenir le script adapté.

