Skills docx

install
source · Clone the upstream repo
git clone https://github.com/TerminalSkills/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/TerminalSkills/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/docx" ~/.claude/skills/terminalskills-skills-docx && rm -rf "$T"
manifest: skills/docx/SKILL.md
source content

docx

Generate .docx files from code. No Word installation needed.

Setup

# Install the docx library for Word document generation.
npm install docx

Basic Document

// src/docx/basic.ts — Create a Word document with a heading, paragraph, and save.
import { Document, Packer, Paragraph, TextRun, HeadingLevel } from "docx";
import fs from "fs";

const doc = new Document({
  sections: [
    {
      children: [
        new Paragraph({
          heading: HeadingLevel.HEADING_1,
          children: [new TextRun({ text: "Monthly Report", bold: true })],
        }),
        new Paragraph({
          spacing: { before: 200 },
          children: [
            new TextRun("This report covers performance metrics for "),
            new TextRun({ text: "January 2025", bold: true }),
            new TextRun(". All figures are preliminary."),
          ],
        }),
      ],
    },
  ],
});

const buffer = await Packer.toBuffer(doc);
fs.writeFileSync("report.docx", buffer);

Tables

// src/docx/tables.ts — Create a formatted table with header row and data.
import {
  Document, Packer, Paragraph, Table, TableRow, TableCell,
  TextRun, WidthType, BorderStyle, ShadingType,
} from "docx";
import fs from "fs";

function createHeaderCell(text: string): TableCell {
  return new TableCell({
    children: [new Paragraph({ children: [new TextRun({ text, bold: true, color: "FFFFFF" })] })],
    shading: { type: ShadingType.SOLID, color: "3498DB" },
  });
}

function createCell(text: string): TableCell {
  return new TableCell({
    children: [new Paragraph(text)],
  });
}

const table = new Table({
  width: { size: 100, type: WidthType.PERCENTAGE },
  rows: [
    new TableRow({ children: [createHeaderCell("Name"), createHeaderCell("Revenue"), createHeaderCell("Growth")] }),
    new TableRow({ children: [createCell("Product A"), createCell("$45,000"), createCell("+12%")] }),
    new TableRow({ children: [createCell("Product B"), createCell("$32,000"), createCell("+8%")] }),
  ],
});

const doc = new Document({ sections: [{ children: [table] }] });
const buffer = await Packer.toBuffer(doc);
fs.writeFileSync("table.docx", buffer);

Images

// src/docx/images.ts — Embed images in a Word document from file or URL.
import { Document, Packer, Paragraph, ImageRun } from "docx";
import fs from "fs";

const imageBuffer = fs.readFileSync("logo.png");

const doc = new Document({
  sections: [
    {
      children: [
        new Paragraph({
          children: [
            new ImageRun({
              data: imageBuffer,
              transformation: { width: 200, height: 60 },
              type: "png",
            }),
          ],
        }),
        new Paragraph("Company logo above."),
      ],
    },
  ],
});

const buffer = await Packer.toBuffer(doc);
fs.writeFileSync("with-image.docx", buffer);

Headers, Footers, and Page Numbers

// src/docx/headers.ts — Add headers and footers with page numbers.
import {
  Document, Packer, Paragraph, TextRun, Header, Footer,
  PageNumber, AlignmentType,
} from "docx";
import fs from "fs";

const doc = new Document({
  sections: [
    {
      headers: {
        default: new Header({
          children: [
            new Paragraph({
              alignment: AlignmentType.RIGHT,
              children: [new TextRun({ text: "Confidential", italics: true, color: "999999" })],
            }),
          ],
        }),
      },
      footers: {
        default: new Footer({
          children: [
            new Paragraph({
              alignment: AlignmentType.CENTER,
              children: [
                new TextRun("Page "),
                new TextRun({ children: [PageNumber.CURRENT] }),
                new TextRun(" of "),
                new TextRun({ children: [PageNumber.TOTAL_PAGES] }),
              ],
            }),
          ],
        }),
      },
      children: [
        new Paragraph({ text: "Document content goes here." }),
      ],
    },
  ],
});

const buffer = await Packer.toBuffer(doc);
fs.writeFileSync("with-headers.docx", buffer);

Lists

// src/docx/lists.ts — Create bulleted and numbered lists.
import { Document, Packer, Paragraph, TextRun, AlignmentType } from "docx";
import fs from "fs";

const doc = new Document({
  numbering: {
    config: [
      {
        reference: "numbered-list",
        levels: [
          { level: 0, format: "decimal", text: "%1.", alignment: AlignmentType.LEFT },
        ],
      },
    ],
  },
  sections: [
    {
      children: [
        new Paragraph({ text: "Action Items:", heading: "Heading2" as any }),
        ...[
          "Review Q1 metrics",
          "Update pricing model",
          "Schedule team sync",
        ].map(
          (item) =>
            new Paragraph({
              children: [new TextRun(item)],
              numbering: { reference: "numbered-list", level: 0 },
            })
        ),
      ],
    },
  ],
});

const buffer = await Packer.toBuffer(doc);
fs.writeFileSync("lists.docx", buffer);