Create and manipulate Word DOCX files programmatically. Use when the user needs to generate documents, modify DOCX templates, extract document content, or automate Word document workflows. Supports both template-based generation (for branding compliance) and from-scratch creation. Keywords: Word, DOCX, document, report, template, contract, letter, corporate, branding.
Use this skill when:
{{TITLE}} or ${author}Do NOT use this skill when:
Template Mode: Modify existing branded templates
{{PLACEHOLDERS}} with actual contentScratch Mode: Create documents from nothing using JSON specifications
Extract text inventory to understand what can be replaced:
deno run --allow-read scripts/analyze-template.ts corporate-template.docx > inventory.json
Output (inventory.json):
{
"filename": "corporate-template.docx",
"paragraphCount": 25,
"tableCount": 2,
"imageCount": 1,
"paragraphs": [
{
"index": 0,
"style": "Title",
"fullText": "{{DOCUMENT_TITLE}}",
"runs": [
{ "text": "{{DOCUMENT_TITLE}}", "bold": true, "fontSize": 28 }
]
}
],
"placeholders": [
{ "tag": "{{DOCUMENT_TITLE}}", "location": "paragraph", "paragraphIndex": 0 },
{ "tag": "{{AUTHOR}}", "location": "footer-default", "paragraphIndex": 0 },
{ "tag": "${date}", "location": "table", "tableIndex": 0, "cellLocation": "R1C2" }
]
}
Create replacements.json:
{
"textReplacements": [
{ "tag": "{{DOCUMENT_TITLE}}", "value": "Q4 2024 Financial Report" },
{ "tag": "{{AUTHOR}}", "value": "Finance Department" },
{ "tag": "${date}", "value": "December 15, 2024" },
{ "tag": "{{COMPANY}}", "value": "Acme Corporation" }
],
"includeHeaders": true,
"includeFooters": true
}
deno run --allow-read --allow-write scripts/generate-from-template.ts \
corporate-template.docx replacements.json output.docx
Create spec.json:
{
"title": "Quarterly Report",
"creator": "Finance Team",
"styles": {
"defaultFont": "Calibri",
"defaultFontSize": 11
},
"sections": [
{
"header": {
"paragraphs": [
{ "text": "Acme Corporation", "alignment": "right" }
]
},
"footer": {
"paragraphs": [
{ "text": "Confidential", "alignment": "center" }
]
},
"content": [
{
"text": "Q4 2024 Financial Report",
"heading": 1,
"alignment": "center"
},
{
"runs": [
{ "text": "Executive Summary: ", "bold": true },
{ "text": "This report provides an overview of our financial performance for Q4 2024." }
]
},
{ "pageBreak": true },
{
"text": "Revenue Breakdown",
"heading": 2
},
{
"rows": [
{
"cells": [
{ "content": [{ "text": "Category" }], "shading": "DDDDDD" },
{ "content": [{ "text": "Amount" }], "shading": "DDDDDD" },
{ "content": [{ "text": "Change" }], "shading": "DDDDDD" }
],
"isHeader": true
},
{
"cells": [
{ "content": [{ "text": "Product Sales" }] },
{ "content": [{ "text": "$1,250,000" }] },
{ "content": [{ "text": "+15%" }] }
]
},
{
"cells": [
{ "content": [{ "text": "Services" }] },
{ "content": [{ "text": "$750,000" }] },
{ "content": [{ "text": "+8%" }] }
]
}
],
"width": 100,
"borders": true
}
]
}
]
}
deno run --allow-read --allow-write scripts/generate-scratch.ts spec.json output.docx
Scenario: Generate contracts from a branded template.
Steps:
# 1. Analyze template for replaceable content
deno run --allow-read scripts/analyze-template.ts contract-template.docx --pretty
# 2. Create replacements.json with client data
# 3. Generate contract
deno run --allow-read --allow-write scripts/generate-from-template.ts \
contract-template.docx replacements.json acme-contract.docx
Scenario: Generate a data report with tables and formatting.
spec.json:
{
"title": "Sales Report",
"sections": [{
"content": [
{ "text": "Monthly Sales Report", "heading": 1 },
{ "text": "January 2025", "heading": 2 },
{
"runs": [
{ "text": "Total Sales: ", "bold": true },
{ "text": "$125,000", "color": "2E7D32" }
]
}
]
}]
}
Scenario: Create a formal letter with letterhead.
spec.json:
{
"sections": [{
"header": {
"paragraphs": [
{ "text": "ACME CORPORATION", "alignment": "center", "runs": [{"text": "ACME CORPORATION", "bold": true, "fontSize": 16}] },
{ "text": "123 Business Ave, City, ST 12345", "alignment": "center" }
]
},
"content": [
{ "text": "December 15, 2024", "alignment": "right" },
{ "text": "" },
{ "text": "Dear Valued Customer," },
{ "text": "" },
{ "text": "Thank you for your continued business..." },
{ "text": "" },
{ "text": "Sincerely," },
{ "text": "John Smith" },
{ "runs": [{ "text": "CEO", "italic": true }] }
],
"footer": {
"paragraphs": [
{ "text": "www.acme.com | [email protected]", "alignment": "center" }
]
}
}]
}
| Script | Purpose | Permissions |
|---|---|---|
analyze-template.ts | Extract text, tables, placeholders from DOCX | --allow-read |
generate-from-template.ts | Replace placeholders in templates | --allow-read --allow-write |
generate-scratch.ts | Create DOCX from JSON specification | --allow-read --allow-write |
| Property | Type | Description |
|---|---|---|
text | string | Simple text content |
runs | array | Formatted text runs (for mixed formatting) |
heading | 1-6 | Heading level |
alignment | string | left, center, right, justify |
bullet | boolean | Bulleted list item |
numbering | boolean | Numbered list item |
spacing | object | before, after, line spacing |
indent | object | left, right, firstLine indentation |
pageBreakBefore | boolean | Insert page break before paragraph |
| Property | Type | Description |
|---|---|---|
text | string | Text content |
bold | boolean | Bold formatting |
italic | boolean | Italic formatting |
underline | boolean | Underline formatting |
strike | boolean | Strikethrough |
fontSize | number | Font size in points |
font | string | Font family name |
color | string | Text color (hex, no #) |
highlight | string | Highlight color |
superScript | boolean | Superscript |
subScript | boolean | Subscript |
| Property | Type | Description |
|---|---|---|
rows | array | Array of row specifications |
width | number | Table width as percentage |
borders | boolean | Show table borders |
| Property | Type | Description |
|---|---|---|
text | string | Link text |
url | string | Target URL |
bold | boolean | Bold formatting |
italic | boolean | Italic formatting |
Symptoms: Output DOCX still contains {{PLACEHOLDER}} tags.
Solution:
analyze-template.ts to verify exact tag textincludeHeaders and includeFooters are true if placeholders are thereSymptoms: Replaced text doesn't match original formatting.
Solution:
Symptoms: Image elements are blank in output.
Solution:
Symptoms: Table cells have wrong content or formatting.
Solution:
content must be an array of paragraph specificationsshading for background color, verticalAlign for alignment