mcpField
W
Word Document Creator

Word Document Creator

github.com/jmsktmドキュメント10276 回インストール40 週間前に更新
リポジトリ

Word Document Creator について

Word Document Creatorは、Node.jsライブラリでMicrosoft Word(.docx)ファイルを生成するスキルです。新規作成とテンプレート利用に対応し、書式設定や一括生成ができます。

主な機能

  1. 01書式付き .docx の作成
  2. 02テンプレートからの文書生成
  3. 03表と画像の追加
  4. 04個別文書の一括生成
  5. 05スタイルとページレイアウトの設定

活用シーン

  1. 01書式付きの手紙やレポートの作成
  2. 02可変データのテンプレートへの反映
  3. 03表や画像を含む文書の作成
  4. 04データソースから個別ファイルを生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jmsktm/claude-settings --skill word-document-creator

インストール後、Claude Code で/word-document-creatorを入力して読み込まれたか確認します。

詳細

Word ドキュメント作成

Word Document Creator スキルは、Microsoft Word(.docx)ドキュメントをプログラムで生成するための包括的な機能を提供します。Node.js 用の docx ライブラリを使用し、書式、スタイル、表、画像、ヘッダー、フッター、複雑なレイアウトに対応します。このスキルは、自動ドキュメント生成、レポート作成、テンプレートベースのワークフローに欠かせません。

シンプルな手紙から、表、グラフ、画像、カスタムスタイルを含む複雑なレポートまで作成できます。ゼロからの作成と、変数置換を使ったテンプレートベースの生成の両方に対応しています。

主なワークフロー

ワークフロー 1:書式設定済みのドキュメントをゼロから作成する

目的: 見出し、段落、リスト、書式を含む Word ドキュメントを作成します

手順:

  1. docx ライブラリをインポートし、Document インスタンスを作成します
  2. 見出し、本文、リストのスタイルを定義します
  3. ヘッダーとフッターを含むセクションを追加します
  4. 書式(太字、斜体、色、配置)を設定した段落を作成します
  5. 番号付きリストと箇条書きリストを追加します
  6. 書式を設定した表を挿入します
  7. .docx ファイルにエクスポートします

実装:

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);
}
ワークフロー 2:テンプレートからドキュメントを生成する

目的: Word ファイルのテンプレートを使い、プレースホルダーを実際のデータに置き換えます

手順:

  1. pizzip と docxtemplater を使って .docx ファイルのテンプレートを読み込みます
  2. 置換値を含むデータオブジェクトを定義します
  3. テンプレートにデータを設定します
  4. 置換内容を反映してテンプレートをレンダリングします
  5. 繰り返しセクション(表、リスト)のループを処理します
  6. 画像と条件付きセクションを処理します
  7. 最終ドキュメントをエクスポートします

実装:

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}
ワークフロー 3:表と画像を含むドキュメントを作成する

目的: データ表と埋め込み画像を含む複雑なドキュメントを作成します

手順:

  1. Document インスタンスを作成します
  2. 行と列を含む表を定義します
  3. セルの書式(罫線、網かけ、配置)を設定します
  4. 太字のスタイルで表のヘッダーを追加します
  5. データ行を入力します
  6. サイズと位置を指定して画像を挿入します
  7. 画像にキャプションを追加します
  8. ドキュメントをエクスポートします

実装:

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);
}
ワークフロー 4:ドキュメントを一括生成する

目的: データソースから複数の個別ドキュメントを作成します

手順:

  1. データソース(JSON、CSV、データベース)を読み込みます
  2. ドキュメントのテンプレートを読み込みます
  3. 各レコードについて、以下を実行します:
    • 新しいドキュメントインスタンスを作成します
    • レコードのデータを入力します
    • 書式を適用します
    • 一意のファイル名で保存します
  4. 各ドキュメントの成功/失敗を記録します
  5. 概要レポートを生成します
ワークフロー 5:高度な書式を追加する

目的: スタイル、フォント、色、間隔、ページレイアウトを適用します

手順:

  1. ドキュメントにカスタムスタイルを定義します
  2. スタイル階層(見出しレベル、本文、キャプション)を作成します
  3. フォントファミリー、サイズ、色を設定します
  4. 段落の間隔とインデントを設定します
  5. ページの余白と向きを設定します
  6. ページ番号とセクション区切りを追加します
  7. テーマとカラースキームを適用します

実装:

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" })
    ]
  }]
});

クイックリファレンス

アクションコマンド/トリガー
新しいドキュメントを作成"create word document [name]"
テンプレートから作成"generate docx from template [file]"
表を追加"[doc] に [rows] 行の表を追加"
画像を挿入"insert [image] into word doc"
一括生成"[data] ごとに Word ドキュメントを作成"
スタイルを適用"[style] で Word ドキュメントを整形"
ヘッダー/フッターを追加"add header [text] to document"
目次を作成"generate table of contents"

ベストプラクティス

  • 直接書式設定よりスタイル: 一貫性を保ち、更新を容易にするために、スタイルを定義して使用します
  • テンプレート: 繰り返し使用する文書の種類(契約書、報告書、手紙)にはテンプレートを使用します
  • ページレイアウト: 文書の作成を始める際に、余白、向き、用紙サイズを設定します
  • 表: 見栄えを良くし、メンテナンスを容易にするために、表のスタイルを使用します
  • 画像: 埋め込む前に画像を圧縮し、適切な解像度(150~300 DPI)を使用します
  • ヘッダー/フッター: シンプルに保ち、セクション間で一貫性を持たせます
  • ファイルサイズ: 文書のサイズを確認し、不要な高解像度画像の埋め込みを避けます
  • 互換性: 幅広い読者を対象とする場合は、異なるバージョンの Word で文書をテストします
  • データ検証: エラーを避けるため、テンプレートへの差し込み前に入力データを検証します
  • エラー処理: テンプレートのプレースホルダーが欠落している場合は、適切に処理します
  • バージョン管理: 進化する文書の種類には、テンプレートのバージョン管理を使用します
  • アクセシビリティ: 適切な見出し階層を使用し、画像には代替テキストを設定します

一般的なパターン

議事録:

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
    ]
  }]
});

差し込み印刷:

// Template: Dear {firstName} {lastName}, ...
contacts.forEach(contact => {
  generateFromTemplate('letter-template.docx', contact, `letter-${contact.id}.docx`);
});

依存関係

必要なパッケージをインストールします:

npm install docx docxtemplater pizzip

高度な機能を使用する場合のオプション:

npm install docx-templates # Alternative templating
npm install officegen      # Legacy support

エラー処理

  • テンプレートエラー: 処理前にテンプレートの構造を検証します
  • データの欠落: オプションのテンプレートフィールドにはデフォルト値を設定します
  • 画像の読み込み: 埋め込む前に画像ファイルの存在を確認します
  • ファイルのアクセス権: 書き込み権限エラーを適切に処理します
  • メモリの問題: 大きな文書では、対応している場合はストリーミングを検討します
  • エンコーディング: 国際文字を正しく扱うため、適切な UTF-8 エンコーディングを使用します

パフォーマンスのヒント

  • 複数の文書でスタイル定義を再利用します
  • バッチ処理ではテンプレートを事前に読み込みます
  • 非常に大きな文書にはストリーミングを使用します
  • 埋め込む前に画像を圧縮します
  • ファイルシステム操作をまとめて実行します
  • 可能であれば、コンパイル済みテンプレートをキャッシュします

高度な機能

目次:

new TableOfContents("Table of Contents", {
  hyperlink: true,
  headingStyleRange: "1-3"
});

条件付きセクション:

// In template: {#showSection}Content{/showSection}
doc.setData({ showSection: condition ? {...} : false });

カスタム番号付け:

new Paragraph({
  text: "Numbered item",
  numbering: {
    reference: "custom-numbering",
    level: 0
  }
});

コメント