Automatiser Office sans macro

Les macros VBA sont puissantes mais fragiles — elles ne fonctionnent pas sur Linux, déclenchent souvent des alertes de sécurité et sont difficiles à versionner. AutomationSequence V8 propose des actions natives openpyxl (Excel) et python-docx (Word) qui s'exécutent sans Office installé et produisent des fichiers natifs .xlsx et .docx.

Générer un rapport Excel ou Word depuis Python est plus reproductible qu'une macro VBA : le code est versionnable, testable, et tourne sur Windows, Linux et macOS sans dépendance Office.

Actions Excel — openpyxl

# Créer un fichier Excel depuis une séquence JSON
[
  {
    "type": "excel_create",
    "output": "rapport_{{date_today}}.xlsx",
    "sheets": [
      {
        "name": "Données",
        "data_var": "query_result",
        "headers": true,
        "auto_width": true,
        "freeze_row": 1,
        "style": "table_blue"
      }
    ],
    "output_var": "excel_path"
  }
]

Actions Excel disponibles :

  • excel_create — créer un nouveau classeur avec une ou plusieurs feuilles.
  • excel_read — lire une feuille et stocker les données dans une variable.
  • excel_write_sheet — écrire des données dans une feuille existante.
  • excel_add_chart — ajouter un graphique (bar, line, pie, scatter).
  • excel_apply_formula — insérer des formules Excel dans des cellules.
  • excel_format_range — appliquer des styles, couleurs, bordures.

Formules et tableaux croisés

from automation_sequence.actions.excel import ExcelAction
import openpyxl
from openpyxl.chart import BarChart, Reference

class ExcelWithPivotPlugin(ExcelAction):
    def execute(self, params, ctx):
        wb = openpyxl.load_workbook(params['file'])
        ws = wb.active

        # Ajouter une ligne de totaux
        last_row = ws.max_row + 2
        ws.cell(last_row, 1, "TOTAL")
        ws.cell(last_row, 3, f"=SUM(C2:C{ws.max_row})")

        # Graphique bar depuis la colonne C
        chart = BarChart()
        data  = Reference(ws, min_col=3, min_row=1, max_row=ws.max_row-2)
        cats  = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row-2)
        chart.add_data(data, titles_from_data=True)
        chart.set_categories(cats)
        ws.add_chart(chart, "E5")
        wb.save(params['file'])

Actions Word — python-docx

# Générer un document Word depuis un template
{
  "type": "word_from_template",
  "template": "templates/rapport_mensuel.docx",
  "variables": {
    "{{mois}}":        "{{date_MMMM_YYYY}}",
    "{{nb_sejours}}": "{{rsa_data|length}}",
    "{{service}}":    "Cardiologie"
  },
  "output": "rapports/rapport_{{date_YYYYMM}}.docx"
}

Templates dynamiques

Le système de templates Word fonctionne par remplacement de marqueurs dans le document source. Les marqueurs {{variable}} dans le texte, les tableaux et les en-têtes sont remplacés automatiquement :

from docx import Document

def fill_template(template_path: str, variables: dict, output_path: str):
    doc = Document(template_path)

    def replace_in_paragraphs(paragraphs):
        for para in paragraphs:
            for run in para.runs:
                for key, val in variables.items():
                    if key in run.text:
                        run.text = run.text.replace(key, str(val))

    replace_in_paragraphs(doc.paragraphs)
    for table in doc.tables:
        for row in table.rows:
            replace_in_paragraphs(cell.paragraphs for cell in row.cells)

    doc.save(output_path)

Fusion de documents

{
  "type": "word_merge",
  "files": [
    "sections/couverture.docx",
    "rapports/rapport_{{date_YYYYMM}}.docx",
    "sections/annexes.docx"
  ],
  "output": "livraison/rapport_complet_{{date_YYYYMM}}.docx",
  "page_break_between": true
}

Séquence complète : rapport mensuel automatisé

[
  // 1. Récupérer les données Oracle
  {"type":"oracle_query", "query":"SELECT ...", "output_var":"data"},

  // 2. Générer l'Excel avec graphique
  {"type":"excel_create", "data_var":"data", "output":"data.xlsx"},

  // 3. Générer le Word depuis template
  {"type":"word_from_template", "template":"rapport.docx",
   "variables":{"{{rows}}":"{{data|length}}"}, "output":"rapport_final.docx"},

  // 4. Envoyer par email avec pièces jointes
  {"type":"smtp_send", "attachments":["data.xlsx","rapport_final.docx"],
   "to":"direction@entreprise.fr"}
]

Conclusion

Les actions openpyxl et python-docx d'AutomationSequence V8 permettent de générer des rapports Office complets depuis des données Oracle, CSV ou API — sans Office installé, sans macro VBA, et avec une traçabilité complète dans le journal HMAC. La combinaison template Word + données Oracle + envoi SMTP constitue un pipeline de reporting mensuel entièrement automatisé en moins de 20 lignes de JSON.

⚙️
PRODUIT LIÉ
AutomationSequence V8.0
← Retour au blog Article suivant →