Tu passes tes vendredis à copier-coller des chiffres dans Word ? Un rapport par client, un tableau par semaine, toujours la même mise en page ? python-docx génère ces documents à ta place : titres, paragraphes, tableaux, images. En Python, en quelques lignes, sans jamais ouvrir Word.
La librairie python-docx manipule les fichiers .docx comme une suite d'objets : un Document, des paragraphes, des titres, des tableaux. Tu écris ton script une fois, et il pond cent rapports identiques en une seconde. Voici comment t'y mettre.
Installer python-docx
Installation en une commande :
pip install python-docxTon premier document
Le squelette minimal tient en quatre lignes. On crée un objet Document, on ajoute un titre et un paragraphe, puis on sauvegarde.
from docx import Document
doc = Document()
doc.add_heading("Rapport mensuel", level=1)
doc.add_paragraph("Généré automatiquement avec python-docx.")
doc.save("rapport.docx")Le fichier rapport.docx apparaît dans ton dossier. Ouvre-le : titre, paragraphe, c'est déjà propre. Mais on peut faire beaucoup mieux.
Mettre en forme : gras, italique, couleur
add_paragraph renvoie un objet auquel tu ajoutes des runs, des morceaux de texte stylés indépendamment. Gras, italique, couleur, taille : tout se règle sur le run.
from docx.shared import Pt, RGBColor
p = doc.add_paragraph()
p.add_run("Chiffre d'affaires : ").bold = True
p.add_run("42 300 €").italic = True
r = p.add_run(" (+12 %)")
r.font.color.rgb = RGBColor(0, 128, 0)
r.font.size = Pt(10)Un run, c'est une portion de texte avec son propre style. Tu enchaînes plusieurs runs dans un même paragraphe pour mélanger gras, italique et couleur sans toucher au reste.
Insérer un tableau
Pour les données, add_table crée une grille. On remplit la première ligne en en-tête, puis on ajoute une ligne par enregistrement. La propriété style applique une mise en forme propre en une seule ligne.
donnees = [
("Produit", "Ventes", "CA (€)"),
("Abonnement Pro", 210, 3150),
("Abonnement Starter", 540, 2700),
("Licence annuelle", 35, 8750),
]
table = doc.add_table(rows=1, cols=3)
table.style = "Light Grid Accent 1"
hdr = table.rows[0].cells
for i, titre in enumerate(donnees[0]):
hdr[i].text = titre
for ligne in donnees[1:]:
cellules = table.add_row().cells
for i, valeur in enumerate(ligne):
cellules[i].text = str(valeur)Un rapport complet en trente lignes
On assemble tout : un script qui lit une liste de données, construit le document et le tableau, puis sauvegarde un fichier par mois. C'est le genre de script qu'on garde dans un coin et qui fait gagner une heure chaque semaine.
from docx import Document
def generer_rapport(mois, ventes, ca_total):
doc = Document()
doc.add_heading(f"Rapport commercial - {mois}", level=1)
p = doc.add_paragraph()
p.add_run("Chiffre d'affaires total : ").bold = True
p.add_run(f"{ca_total} €")
table = doc.add_table(rows=1, cols=2)
table.style = "Light Grid Accent 1"
table.rows[0].cells[0].text = "Produit"
table.rows[0].cells[1].text = "Ventes"
for produit, nombre in ventes:
cellules = table.add_row().cells
cellules[0].text = produit
cellules[1].text = str(nombre)
doc.add_paragraph("Généré automatiquement, sans ouvrir Word.")
doc.save(f"rapport_{mois}.docx")
print(f"rapport_{mois}.docx créé")
generer_rapport(
"septembre",
[("Pro", 210), ("Starter", 540), ("Licence", 35)],
"14 600",
)python-docx ne remplace pas un humain qui rédige : il remplace l'humain qui recopie. Pour les rapports répétitifs, les factures, les contrats types ou les tableaux de bord hebdomadaires, c'est l'un des outils les plus rentables de ton arsenal Python. Tu écris la logique une fois, et Word bosse pour toi.
Pour aller plus loin : add_picture pour insérer des images, add_page_break pour paginer, et les styles prédéfinis du .docx pour une mise en page irréprochable. La documentation officielle est courte et bien fichue.






