Génération en lot de fichiers Word à partir d'un modèle avec Python

Utilisation de la bibliothèque docxtpl pour traiter les modèles Word

Pour automatiser la création de documents Word en lot, on peut exploiter Python avec la bibliothèque docxtpl, conçue pour manipuler des modèles Word. Commencez par l'installer via pip :

pip install docxtpl

Cette approche permet de remplir dynamiquement des modèles Word avec des données provenant d'une source telle qu'un fichier Excel. Les images ci-dessous illustrent un exemple de modèle avant et après traitement.

Lecture des données à partir d'un fichier Excel

La première étape consitse à extraire les informations nécessaires depuis un fichier Excel. Voici une classe adaptée pour cette tâche, utilisant xlrd pour la lecture :

import os
import xlrd
from docxtpl import DocxTemplate

class ExtracteurExcel:
    def __init__(self, chemin_fichier):
        # Vérifier l'existence du fichier
        if os.path.exists(chemin_fichier):
            self.chemin = chemin_fichier
            self.classeur = xlrd.open_workbook(self.chemin)
            self._resultats = []
        else:
            raise FileNotFoundError("Le fichier spécifié est introuvable")

    def lister_feuilles(self):
        # Retourner la liste des noms de feuilles
        return self.classeur.sheet_names()

    def charger_donnees(self, nom_feuille):
        # Charger les données sous forme de liste de dictionnaires
        feuille = self.classeur.sheet_by_name(nom_feuille)
        entetes = feuille.row_values(0)
        for indice in range(1, feuille.nrows):
            valeurs = feuille.row_values(indice)
            self._resultats.append(dict(zip(entetes, valeurs)))
        return self._resultats

Génération des documents Word à partir des données

Ensuite, on crée une classe pour générer les fichiers Word en appliquant les données au modèle. Les noms de variables et la logique ont été modifiés pour plus de clarté :

class GenerateurWord:
    def __init__(self, mode_chemin, dossier_sortie):
        self.modele = mode_chemin
        self.sortie = dossier_sortie

    def produire_document(self, enregistrement):
        # Préparer le contexte pour le modèle Word
        contexte = {
            "client": enregistrement['client'],
            "ref_logement": enregistrement['ref_logement'],
            "piece_identite": enregistrement['piece_identite'],
            "somme_versee": enregistrement['somme_versee'],
            "domicile": enregistrement['domicile'],
            "tel_contact": enregistrement['tel_contact'],
            "mandataire": enregistrement['mandataire'],
            "requete": enregistrement['requete'],
            "montant_total": enregistrement['montant_total'],
        }
        template = DocxTemplate(self.modele)
        template.render(contexte)
        nom_fichier = f"{self.sortie}/{enregistrement['mandataire']}_requete.docx"
        template.save(nom_fichier)

# Exemple d'utilisation dans le script principal
if __name__ == "__main__":
    extracteur = ExtracteurExcel("donnees/ventes_immobilieres.xlsx")
    donnees_globales = extracteur.charger_donnees('Feuil1')
    for item in donnees_globales:
        generateur = GenerateurWord("modeles/declaration.docx", "documents_generes")
        generateur.produire_document(item)

Ce processus itère sur chaque ligne du fichier Excel, remplit le modèle Word avec les valeurs correspondantes et sauvegarde un nouveau document pour chaque enregistrement, comme démontré dans les résultats finaux.

Étiquettes: Python docxtpl xlrd word-template Excel

Publié le 10 juin à 00h38