skills/word-document-creator/SKILL.md
Generate Microsoft Word .docx files with formatting, tables, images, and styles
npx skillsauth add jmsktm/claude-settings Word Document CreatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
The Word Document Creator skill provides comprehensive capabilities for generating Microsoft Word (.docx) documents programmatically. It handles formatting, styles, tables, images, headers, footers, and complex layouts using the docx library for Node.js. This skill is essential for automated document generation, report creation, and template-based workflows.
Create everything from simple letters to complex reports with tables, charts, images, and custom styling. The skill supports both creation from scratch and template-based generation with variable replacement.
Purpose: Build a Word document with headings, paragraphs, lists, and formatting
Steps:
docx library and create Document instanceImplementation:
const { Document, Packer, Paragraph, TextRun, HeadingLevel, AlignmentType } = require('docx');
const fs = require('fs');
async function createDocument(outputPath) {
const doc = new Document({
sections: [{
properties: {},
headers: {
default: new Header({
children: [new Paragraph({ text: "Company Name", alignment: AlignmentType.RIGHT })]
})
},
children: [
new Paragraph({
text: "Business Proposal",
heading: HeadingLevel.HEADING_1,
alignment: AlignmentType.CENTER
}),
new Paragraph({
children: [
new TextRun({ text: "Prepared for: ", bold: true }),
new TextRun("Client Name")
]
}),
new Paragraph({
text: "Executive Summary",
heading: HeadingLevel.HEADING_2
}),
new Paragraph({
text: "This proposal outlines the scope, timeline, and budget for the project...",
alignment: AlignmentType.JUSTIFIED
})
]
}]
});
const buffer = await Packer.toBuffer(doc);
fs.writeFileSync(outputPath, buffer);
}
Purpose: Use a template Word file and replace placeholders with actual data
Steps:
pizzip and docxtemplaterImplementation:
const Docxtemplater = require('docxtemplater');
const PizZip = require('pizzip');
const fs = require('fs');
function generateFromTemplate(templatePath, data, outputPath) {
const content = fs.readFileSync(templatePath, 'binary');
const zip = new PizZip(content);
const doc = new Docxtemplater(zip, {
paragraphLoop: true,
linebreaks: true
});
// Data object with placeholder values
doc.setData({
clientName: data.clientName,
projectName: data.projectName,
date: new Date().toLocaleDateString(),
items: data.items, // Array for looping
total: data.total
});
doc.render();
const buf = doc.getZip().generate({
type: 'nodebuffer',
compression: 'DEFLATE'
});
fs.writeFileSync(outputPath, buf);
}
// Template placeholders: {clientName}, {projectName}, etc.
// Loop syntax: {#items}{name} - {price}{/items}
Purpose: Build complex documents containing data tables and embedded images
Steps:
Implementation:
const { Document, Packer, Paragraph, Table, TableRow, TableCell, Media } = require('docx');
const fs = require('fs');
async function createTableDocument(data, imagePath, outputPath) {
const image = Media.addImage(doc, fs.readFileSync(imagePath), 300, 200);
const doc = new Document({
sections: [{
children: [
new Paragraph({ text: "Sales Report Q4 2025", heading: HeadingLevel.HEADING_1 }),
new Table({
rows: [
// Header row
new TableRow({
children: [
new TableCell({ children: [new Paragraph({ text: "Month", bold: true })] }),
new TableCell({ children: [new Paragraph({ text: "Revenue", bold: true })] }),
new TableCell({ children: [new Paragraph({ text: "Growth", bold: true })] })
]
}),
// Data rows
...data.map(row => new TableRow({
children: [
new TableCell({ children: [new Paragraph(row.month)] }),
new TableCell({ children: [new Paragraph(row.revenue)] }),
new TableCell({ children: [new Paragraph(row.growth)] })
]
}))
]
}),
new Paragraph({ text: "" }), // Spacing
new Paragraph({ text: "Revenue Trend Chart", heading: HeadingLevel.HEADING_2 }),
new Paragraph({ children: [image] }),
new Paragraph({ text: "Figure 1: Quarterly Revenue Trend", italics: true })
]
}]
});
const buffer = await Packer.toBuffer(doc);
fs.writeFileSync(outputPath, buffer);
}
Purpose: Create multiple personalized documents from a data source
Steps:
Purpose: Apply styles, fonts, colors, spacing, and page layout
Steps:
Implementation:
const doc = new Document({
styles: {
paragraphStyles: [
{
id: "CustomHeading",
name: "Custom Heading",
basedOn: "Heading1",
next: "Normal",
run: {
size: 32,
bold: true,
color: "2E74B5",
font: "Calibri"
},
paragraph: {
spacing: { before: 240, after: 120 }
}
}
]
},
sections: [{
properties: {
page: {
margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } // 1440 = 1 inch
}
},
children: [
new Paragraph({ text: "Styled Heading", style: "CustomHeading" })
]
}]
});
| Action | Command/Trigger | |--------|-----------------| | Create new document | "create word document [name]" | | From template | "generate docx from template [file]" | | Add table | "add table with [rows] rows to [doc]" | | Insert image | "insert [image] into word doc" | | Batch generate | "create word docs for each [data]" | | Apply style | "format word doc with [style]" | | Add header/footer | "add header [text] to document" | | Create TOC | "generate table of contents" |
Meeting Minutes:
const doc = new Document({
sections: [{
children: [
new Paragraph({ text: "Meeting Minutes", heading: HeadingLevel.HEADING_1 }),
new Paragraph({ text: `Date: ${date}` }),
new Paragraph({ text: `Attendees: ${attendees.join(', ')}` }),
new Paragraph({ text: "Agenda", heading: HeadingLevel.HEADING_2 }),
// ... agenda items
new Paragraph({ text: "Action Items", heading: HeadingLevel.HEADING_2 }),
// ... action items table
]
}]
});
Mail Merge:
// Template: Dear {firstName} {lastName}, ...
contacts.forEach(contact => {
generateFromTemplate('letter-template.docx', contact, `letter-${contact.id}.docx`);
});
Install required packages:
npm install docx docxtemplater pizzip
Optional for advanced features:
npm install docx-templates # Alternative templating
npm install officegen # Legacy support
Table of Contents:
new TableOfContents("Table of Contents", {
hyperlink: true,
headingStyleRange: "1-3"
});
Conditional Sections:
// In template: {#showSection}Content{/showSection}
doc.setData({ showSection: condition ? {...} : false });
Custom Numbering:
new Paragraph({
text: "Numbered item",
numbering: {
reference: "custom-numbering",
level: 0
}
});
data-ai
Optimize YouTube videos for SEO, thumbnails, descriptions, and audience retention
testing
Design and facilitate effective workshops with agendas, activities, and outcomes
data-ai
Design and optimize AI-powered workflows for complex tasks
data-ai
Design and implement automated workflows to eliminate repetitive tasks and streamline processes