Create/edit .docx files with styles, tables, and templates. Use when asked to generate Word reports, contracts, proposals, or extract text.
This skill enables creation, editing, and analysis of .docx files for reports, contracts, proposals, documentation, and template-driven outputs.
Modern best practices (2026):
.docx as the editable source; treat PDF as a release artifact.| Task | Tool/Library | Language | When to Use |
|---|---|---|---|
| Create DOCX | python-docx | Python | Reports, contracts, proposals |
| Create DOCX | docx | Node.js | Server-side document generation |
| Convert to HTML | mammoth.js | Node.js | Web display, content extraction |
| Parse DOCX |
| python-docx |
| Python |
| Extract text, tables, metadata |
| Template fill | docxtpl | Python | Mail merge, template-based generation |
| Review workflow | Word compare, comments/highlights | Any | Human review without OOXML surgery |
| Tracked changes | OOXML inspection, docx4j/OpenXML SDK/Aspose | Any | True redlines or parsing tracked changes |
docxtpl when non-developers must edit layout/design in Word.python-docx for structural edits (paragraphs/tables/headers/footers) when formatting complexity is moderate.docx (Node.js) for server-side generation in TypeScript-heavy stacks.mammoth for text-first extraction or DOCX-to-HTML (best effort; may drop some layout fidelity)..doc (legacy) is not supported by these libraries; convert to .docx first (e.g., LibreOffice).python-docx cannot reliably create true tracked changes; use Word compare or specialized OOXML tooling.from docx import Document
from docx.shared import Inches, Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
# Title
title = doc.add_heading('Document Title', 0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
# Paragraph with formatting
para = doc.add_paragraph()
run = para.add_run('Bold and ')
run.bold = True
run = para.add_run('italic text.')
run.italic = True
# Table
table = doc.add_table(rows=3, cols=3)
table.style = 'Table Grid'
for i, row in enumerate(table.rows):
for j, cell in enumerate(row.cells):
cell.text = f'Row {i+1}, Col {j+1}'
# Image
doc.add_picture('image.png', width=Inches(4))
# Save
doc.save('output.docx')
import { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell } from 'docx';
import * as fs from 'fs';
const doc = new Document({
sections: [{
properties: {},
children: [
new Paragraph({
children: [
new TextRun({ text: 'Bold text', bold: true }),
new TextRun({ text: ' and normal text.' }),
],
}),
new Table({
rows: [
new TableRow({
children: [
new TableCell({ children: [new Paragraph('Cell 1')] }),
new TableCell({ children: [new Paragraph('Cell 2')] }),
],
}),
],
}),
],
}],
});
Packer.toBuffer(doc).then((buffer) => {
fs.writeFileSync('output.docx', buffer);
});
from docxtpl import DocxTemplate
doc = DocxTemplate('template.docx')
context = {
'company_name': 'Acme Corp',
'date': '2025-01-15',
'items': [
{'name': 'Widget A', 'price': 100},
{'name': 'Widget B', 'price': 200},
]
}
doc.render(context)
doc.save('filled_template.docx')
from docx import Document
doc = Document('input.docx')
# Extract all text
full_text = []
for para in doc.paragraphs:
full_text.append(para.text)
# Extract tables
for table in doc.tables:
for row in table.rows:
row_data = [cell.text for cell in row.cells]
print(row_data)
| Element | Python Method | Node.js Class |
|---|---|---|
| Heading 1 | add_heading(text, 1) | HeadingLevel.HEADING_1 |
| Bold | run.bold = True | TextRun({ bold: true }) |
| Italic | run.italic = True | TextRun({ italics: true }) |
| Font size | run.font.size = Pt(12) | TextRun({ size: 24 }) (half-points) |
| Alignment | WD_ALIGN_PARAGRAPH.CENTER | AlignmentType.CENTER |
| Page break | doc.add_page_break() | new PageBreak() |
assets/doc-template-pack.md for decision logs and recurring doc types.Use only when explicitly requested and policy-compliant.
Resources
Scripts
scripts/docx_inspect_ooxml.py - Dependency-free OOXML inspection (including tracked changes signals)scripts/docx_extract.py - Extract text/tables to JSON (requires python-docx)scripts/docx_render_template.py - Render a docxtpl template (requires docxtpl)scripts/docx_to_html.mjs - Convert .docx to HTML (requires mammoth)Templates
Related Skills