视觉画布设计
canvas-design
基于设计原则创作静态视觉作品,用于海报与品牌图形。
docx【文档与办公】Generate Word documents programmatically with the docx library — create paragraphs, tables, images, headers, footers, numbered lists, and styled content. Use when tasks involve generating contracts, proposals, resumes, or any .docx output from application data in Node.js.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Generate .docx files from code. No Word installation needed.
# Install the docx library for Word document generation.
npm install docx
// 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);
// 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);
// 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);
// 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);
// 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);