Générer un rapport Word mensuel automatiquement avec Python (données, tableau et graphique inclus)

Créer un rapport mensuel structuré ne devrait pas rimer avec copier-coller manuel. Grâce à Python, on peut automatiser la création d’un document Word propre et professionnel à partir d’un fichier de données (comme un export de la Search Console).

Dans cet article, je vous montre comment produire un rapport complet, prêt à être diffusé, en utilisant uniquement Python et un template Word.

🎯 Objectif

Générer un fichier .docx contenant automatiquement :

  • ✅ Les 10 requêtes les plus vues (impressions)
  • ✅ Le mot-clé principal à surveiller
  • ✅ Une liste de recommandations à suivre
  • ✅ Un graphique en camembert des impressions

À partir de deux fichiers :

  • Un template Word professionnel avec des balises de remplacement
  • Un fichier Excel source avec les données de performance

Prérequis techniques

pip install python-docx pandas matplotlib openpyxl

Le script utilise :

  • pandas pour lire et trier les données,
  • matplotlib pour générer un graphique,
  • python-docx pour créer et remplir le fichier Word.

Le template Word

Le template utilise des balises faciles à identifier :
{mois}, {tableau_requetes}, {mot_cle}, {actions}, {graphique}

🧩 Exemple de structure :

Rapport mensuel - {mois}

1. Requêtes principales
{tableau_requetes}

2. Mot-clé à surveiller
{mot_cle}

3. Propositions d’actions
{actions}

4. Graphique – Répartition des impressions
{graphique}


Le script Python

Voici un aperçu du code :

pythonCopierModifierimport pandas as pd
from docx import Document
from docx.shared import Inches
from datetime import datetime
import matplotlib.pyplot as plt

# Chemins
EXCEL_PATH = "donnees_search_console.xlsx"
TEMPLATE_PATH = "template_rapport_professionnel.docx"
OUTPUT_PATH = f"rapport_mensuel_{datetime.today().strftime('%Y-%m')}.docx"
GRAPH_IMAGE_PATH = "graphique_impressions_pie.png"

# Charger les données
df = pd.read_excel(EXCEL_PATH, sheet_name="Requêtes")
df.columns = ["Requête", "Clics", "Impressions", "CTR", "Position"]
top10 = df.sort_values(by="Impressions", ascending=False).head(10)

# Générer le graphique
fig, ax = plt.subplots()
ax.pie(top10["Impressions"], labels=top10["Requête"], autopct="%1.1f%%", startangle=90)
plt.tight_layout()
plt.savefig(GRAPH_IMAGE_PATH)

# Infos dynamiques
mois = datetime.today().strftime("%B %Y")
mot_cle = top10.iloc[0]["Requête"]
actions = [
    "Analyser la concurrence sur ce mot-clé",
    "Optimiser la balise title des pages concernées",
    "Améliorer la vitesse de chargement mobile",
    "Ajouter du contenu multimédia enrichi",
    "Développer une FAQ liée à ce sujet"
]

# Remplir le document Word
doc = Document(TEMPLATE_PATH)

for p in doc.paragraphs:
    if "{mois}" in p.text:
        p.text = p.text.replace("{mois}", mois)
    if "{mot_cle}" in p.text:
        p.text = p.text.replace("{mot_cle}", mot_cle)
    if "{actions}" in p.text:
        p.text = p.text.replace("{actions}", "\\n".join(f"- {a}" for a in actions))
    if "{graphique}" in p.text:
        p.text = ""
        doc.add_picture(GRAPH_IMAGE_PATH, width=Inches(5.5))

# Insertion tableau
for p in doc.paragraphs:
    if "{tableau_requetes}" in p.text:
        p.text = ""
        table = doc.add_table(rows=1, cols=len(top10.columns))
        table.style = "Light List"
        hdr = table.rows[0].cells
        for idx, col in enumerate(top10.columns):
            hdr[idx].text = col
        for _, row in top10.iterrows():
            cells = table.add_row().cells
            for idx, val in enumerate(row):
                cells[idx].text = str(val)
        break

doc.save(OUTPUT_PATH)

Résultat

Le script produit un fichier Word contenant :

  • Le mois en cours
  • Un tableau clair des requêtes principales
  • Un mot-clé à surveiller
  • Des actions concrètes
  • Et un graphique directement intégré

Parfait pour un usage en entreprise, une newsletter mensuelle ou un reporting automatique.

Une réflexion sur « Générer un rapport Word mensuel automatiquement avec Python (données, tableau et graphique inclus) »

Les commentaires sont fermés.