204 lines
4.8 KiB
Markdown
204 lines
4.8 KiB
Markdown
---
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# CLAUDE OFFICE SKILL - Enhanced Metadata v2.0
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
# Basic Information
|
|
name: template-engine
|
|
description: "Auto-fill document templates with data - mail merge for any format"
|
|
version: "1.0"
|
|
author: claude-office-skills
|
|
license: MIT
|
|
|
|
# Categorization
|
|
category: template
|
|
tags:
|
|
- template
|
|
- engine
|
|
- autofill
|
|
- docxtpl
|
|
department: All
|
|
|
|
# AI Model Compatibility
|
|
models:
|
|
recommended:
|
|
- claude-sonnet-4
|
|
- claude-opus-4
|
|
compatible:
|
|
- claude-3-5-sonnet
|
|
- gpt-4
|
|
- gpt-4o
|
|
|
|
# MCP Tools Integration
|
|
mcp:
|
|
server: office-mcp
|
|
tools:
|
|
- fill_docx_template
|
|
|
|
# Skill Capabilities
|
|
capabilities:
|
|
- template_filling
|
|
- document_automation
|
|
|
|
# Language Support
|
|
languages:
|
|
- en
|
|
- zh
|
|
---
|
|
|
|
# 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
|
|
|
|
# Usage
|
|
fill_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_workbook
|
|
import 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 csv
|
|
from 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,john@example.com,Acme
|
|
# Jane,jane@example.com,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 dependencies
|
|
pip install python-docx openpyxl python-pptx reportlab jinja2
|
|
```
|
|
|
|
## Resources
|
|
|
|
- [docxtpl / yumdocs Repository](https://github.com/elapouya/python-docxtpl)
|
|
- [Claude Office Skills Hub](https://github.com/claude-office-skills/skills)
|