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.