Template Engine

by claude-office-skills9c4c7d5cd281MIT499 starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 8 months ago

Auto-fill document templates with data - mail merge for any format

Instructions onlyDocuments & Office
AI-generated overview

Fills document templates with data, supporting mail merge across Word, Excel and PowerPoint files.

What it does
This skill describes template-based document generation: templates contain placeholders and are filled with supplied data. It covers Jinja2-style syntax for substitution, loops, conditionals and filters, with examples for Word via docxtpl and Excel via openpyxl. It also outlines bulk mail merge from a CSV file and conditional content rendering, producing filled output documents.
When to use it
Use it for mail merge of letters or contracts, generating personalized reports from data, creating certificates from templates, or auto-filling forms with user data.
Requirements
Instructions only, no scripts shipped. The documented examples require Python with python-docx, openpyxl, python-pptx, reportlab and jinja2, and reference an office-mcp server tool fill_docx_template.

Template Engine Skill

Overview

This skill enables template-based document generation - define templates with placeholders, then automatically fill them with data. Works with Word, Excel, PowerPoint, and more.

How to Use

  1. Describe what you want to accomplish
  2. Provide any required input data or files
  3. I'll execute the appropriate operations

Example prompts:

  • "Mail merge for bulk letters/contracts"
  • "Generate personalized reports from data"
  • "Create certificates from templates"
  • "Auto-fill forms with user data"

Domain Knowledge

Template Syntax (Jinja2-based)

{{ variable }}           - Simple substitution{% for item in list %}   - Loop{% if condition %}       - Conditional{{ date | format_date }} - Filter

Word Template Example

python
from docxtpl import DocxTemplate
# Create template with placeholders:# Dear {{ name }},# Thank you for your order #{{ order_id }}...
def fill_template(template_path: str, data: dict, output_path: str):    doc = DocxTemplate(template_path)    doc.render(data)    doc.save(output_path)    return output_path
# Usagefill_template(    "templates/order_confirmation.docx",    {        "name": "John Smith",        "order_id": "ORD-12345",        "items": [            {"name": "Product A", "qty": 2, "price": 29.99},            {"name": "Product B", "qty": 1, "price": 49.99}        ],        "total": 109.97    },    "output/confirmation_john.docx")

Excel Template

python
from openpyxl import load_workbookimport re
def fill_excel_template(template_path: str, data: dict, output_path: str):    wb = load_workbook(template_path)    ws = wb.active        # Find and replace placeholders like {{name}}    for row in ws.iter_rows():        for cell in row:            if cell.value and isinstance(cell.value, str):                for key, value in data.items():                    placeholder = "{{" + key + "}}"                    if placeholder in cell.value:                        cell.value = cell.value.replace(placeholder, str(value))        wb.save(output_path)    return output_path

Bulk Generation (Mail Merge)

python
import csvfrom pathlib import Path
def mail_merge(template_path: str, data_csv: str, output_dir: str):    """Generate documents for each row in CSV."""        Path(output_dir).mkdir(exist_ok=True)        with open(data_csv) as f:        reader = csv.DictReader(f)                for i, row in enumerate(reader):            output_path = f"{output_dir}/document_{i+1}.docx"            fill_template(template_path, row, output_path)            print(f"Generated: {output_path}")
# Usage with contacts.csv:# name,email,company# John,[email protected],Acme# Jane,[email protected],Corp
mail_merge(    "templates/welcome_letter.docx",    "data/contacts.csv",    "output/letters")

Advanced: Conditional Content

python
from docxtpl import DocxTemplate
# Template with conditionals:# {% if vip %}# Thank you for being a VIP member!# {% else %}# Thank you for your purchase.# {% endif %}
doc = DocxTemplate("template.docx")doc.render({    "name": "John",    "vip": True,    "discount": 20})doc.save("output.docx")

Best Practices

  1. Use clear placeholder naming ({{client_name}})
  2. Validate data before rendering
  3. Handle missing data gracefully
  4. Keep templates version-controlled

Installation

bash
# Install required dependenciespip install python-docx openpyxl python-pptx reportlab jinja2

Resources

Source and attribution

Source:claude-office-skills/skillsintemplate-engineat commit9c4c7d5

License: MIT

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal