mcpField
S
Spreadsheet Builder

Spreadsheet Builder

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

Spreadsheet Builder について

Spreadsheet Builderは、exceljsなどのライブラリで書式付きExcelブックやCSVファイルを生成するスキルです。データ出力、財務モデル、ダッシュボード向けに、数式、条件付き書式、グラフ、複数シートのレポートを扱います。

主な機能

  1. 01ExcelブックとCSVファイルの作成
  2. 02数式と計算の追加
  3. 03条件付き書式の適用
  4. 04グラフとデータ可視化の作成
  5. 05リンク付き複数シートブックの構築

活用シーン

  1. 01財務レポートやモデルの生成
  2. 02在庫表やデータ出力の準備
  3. 03グラフと数式を使ったダッシュボードの作成

インストール

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

$npx skills add https://github.com/jmsktm/claude-settings --skill spreadsheet-builder

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

詳細

Spreadsheet Builder

Spreadsheet Builder スキルを使用すると、高度な書式設定、数式、グラフ、データ分析機能を備えた、プロフェッショナルな Excel(.xlsx)ファイルや CSV ファイルを作成できます。exceljs や xlsx などのライブラリを使用し、シンプルなデータのエクスポートから複雑な財務モデルやダッシュボードまで、あらゆる作業に対応します。

データレポート、財務諸表、在庫リスト、分析ダッシュボードなど、表形式のデータを可視化できます。複数のシート、セルのスタイル設定、条件付き書式、数式、ピボットテーブル、グラフに対応しており、スプレッドシートの自動化に必要な包括的なソリューションです。

コアワークフロー

ワークフロー 1:基本的な Excel ワークブックを作成する

目的: 書式設定されたデータを含むシンプルな Excel ファイルを作成します

手順:

  1. exceljs をインポートし、Workbook インスタンスを作成します
  2. 名前を指定してワークシートを追加します
  3. ヘッダーと列幅を指定して列を定義します
  4. データ行を追加します
  5. 基本的な書式設定(フォント、色、配置)を適用します
  6. 列幅と行の高さを設定します
  7. .xlsx ファイルに書き込みます

実装:

const ExcelJS = require('exceljs');

async function createBasicWorkbook(data, outputPath) {
  const workbook = new ExcelJS.Workbook();
  const worksheet = workbook.addWorksheet('Sales Data');

  // Define columns
  worksheet.columns = [
    { header: 'Date', key: 'date', width: 12 },
    { header: 'Product', key: 'product', width: 25 },
    { header: 'Quantity', key: 'quantity', width: 10 },
    { header: 'Price', key: 'price', width: 12 },
    { header: 'Total', key: 'total', width: 12 }
  ];

  // Style header row
  worksheet.getRow(1).font = { bold: true, size: 12 };
  worksheet.getRow(1).fill = {
    type: 'pattern',
    pattern: 'solid',
    fgColor: { argb: 'FF4472C4' }
  };
  worksheet.getRow(1).font = { color: { argb: 'FFFFFFFF' }, bold: true };

  // Add data
  data.forEach(row => {
    worksheet.addRow(row);
  });

  // Format currency columns
  worksheet.getColumn('price').numFmt = '$#,##0.00';
  worksheet.getColumn('total').numFmt = '$#,##0.00';

  await workbook.xlsx.writeFile(outputPath);
}
ワークフロー 2:数式と計算を追加する

目的: 自動計算と数式を含むスプレッドシートを作成します

手順:

  1. ワークブックとワークシートを作成します
  2. データ列を追加します
  3. 数式セル(SUM、AVERAGE、IF、VLOOKUP など)を挿入します
  4. セル参照を使用して動的な計算を行います
  5. 条件付き数式を追加します
  6. 計算列を作成します
  7. 合計と小計を追加します

実装:

async function createWithFormulas(data, outputPath) {
  const workbook = new ExcelJS.Workbook();
  const worksheet = workbook.addWorksheet('Financial Report');

  worksheet.columns = [
    { header: 'Month', key: 'month', width: 12 },
    { header: 'Revenue', key: 'revenue', width: 15 },
    { header: 'Expenses', key: 'expenses', width: 15 },
    { header: 'Profit', key: 'profit', width: 15 },
    { header: 'Margin %', key: 'margin', width: 12 }
  ];

  // Add data rows
  data.forEach((row, index) => {
    const rowIndex = index + 2; // Account for header row
    worksheet.addRow({
      month: row.month,
      revenue: row.revenue,
      expenses: row.expenses,
      profit: { formula: `B${rowIndex}-C${rowIndex}` }, // Revenue - Expenses
      margin: { formula: `D${rowIndex}/B${rowIndex}` }  // Profit / Revenue
    });
  });

  // Add totals row
  const lastRow = data.length + 2;
  worksheet.addRow({
    month: 'TOTAL',
    revenue: { formula: `SUM(B2:B${lastRow - 1})` },
    expenses: { formula: `SUM(C2:C${lastRow - 1})` },
    profit: { formula: `SUM(D2:D${lastRow - 1})` },
    margin: { formula: `D${lastRow}/B${lastRow}` }
  });

  // Format totals row
  worksheet.getRow(lastRow).font = { bold: true };
  worksheet.getRow(lastRow).fill = {
    type: 'pattern',
    pattern: 'solid',
    fgColor: { argb: 'FFE7E6E6' }
  };

  // Number formatting
  worksheet.getColumn('revenue').numFmt = '$#,##0.00';
  worksheet.getColumn('expenses').numFmt = '$#,##0.00';
  worksheet.getColumn('profit').numFmt = '$#,##0.00';
  worksheet.getColumn('margin').numFmt = '0.00%';

  await workbook.xlsx.writeFile(outputPath);
}
ワークフロー 3:条件付き書式を適用する

目的: ルールやしきい値に基づいてセルを強調表示します

手順:

  1. データを含むワークブックを作成します
  2. 条件付き書式のルールを定義します
  3. 値の範囲にカラースケールを適用します
  4. 視覚的に比較できるようにデータバーを使用します
  5. ステータスを示すアイコンセットを追加します
  6. 上位値または下位値を強調表示します
  7. カスタムの数式ベースのルールを適用します

実装:

async function addConditionalFormatting(data, outputPath) {
  const workbook = new ExcelJS.Workbook();
  const worksheet = workbook.addWorksheet('Performance');

  // Add data...
  worksheet.columns = [
    { header: 'Employee', key: 'name', width: 20 },
    { header: 'Sales', key: 'sales', width: 15 },
    { header: 'Target', key: 'target', width: 15 },
    { header: 'Performance', key: 'performance', width: 15 }
  ];

  data.forEach(row => worksheet.addRow(row));

  // Color scale: Green (high) to Red (low)
  worksheet.addConditionalFormatting({
    ref: 'B2:B100',
    rules: [
      {
        type: 'colorScale',
        cfvo: [
          { type: 'min' },
          { type: 'percentile', value: 50 },
          { type: 'max' }
        ],
        color: [
          { argb: 'FFF8696B' }, // Red
          { argb: 'FFFFEB84' }, // Yellow
          { argb: 'FF63BE7B' }  // Green
        ]
      }
    ]
  });

  // Data bars for performance column
  worksheet.addConditionalFormatting({
    ref: 'D2:D100',
    rules: [
      {
        type: 'dataBar',
        minLength: 0,
        maxLength: 100,
        color: { argb: 'FF638EC6' }
      }
    ]
  });

  // Highlight values above target
  worksheet.addConditionalFormatting({
    ref: 'B2:B100',
    rules: [
      {
        type: 'expression',
        formulae: ['B2>C2'], // Sales > Target
        style: {
          fill: {
            type: 'pattern',
            pattern: 'solid',
            bgColor: { argb: 'FFC6EFCE' }
          }
        }
      }
    ]
  });

  await workbook.xlsx.writeFile(outputPath);
}
ワークフロー 4:グラフと可視化を作成する

目的: データの傾向や比較を可視化するグラフを追加します

手順:

  1. データを含むワークブックを作成します
  2. データ用ワークシートを追加します
  3. グラフ用ワークシートを作成するか、データシートに埋め込みます
  4. グラフの種類(棒、折れ線、円、散布図など)を指定します
  5. 系列のデータ範囲を設定します
  6. グラフのタイトル、軸、凡例を設定します
  7. スタイルと色を適用します
  8. ワークシート上にグラフを配置します

実装:

async function createWithChart(data, outputPath) {
  const workbook = new ExcelJS.Workbook();
  const worksheet = workbook.addWorksheet('Sales');

  // Add data
  worksheet.columns = [
    { header: 'Month', key: 'month', width: 12 },
    { header: 'Sales', key: 'sales', width: 15 }
  ];

  data.forEach(row => worksheet.addRow(row));

  // Create chart (Note: exceljs has limited chart support, consider using xlsx-chart)
  // For full chart support, you may need to use Excel templates or officegen library

  // Alternative: Add chart using worksheet image
  // Or use a charting library to generate image, then embed

  await workbook.xlsx.writeFile(outputPath);
}

// For advanced charts, consider using officegen or generating chart images
ワークフロー 5:リンク付きの複数シートワークブックを作成する

目的: 関連する複数のシートを含む複雑なワークブックを作成します

手順:

  1. ワークブックを作成します
  2. 複数のワークシート(Summary、Details、Raw Data など)を追加します
  3. シート間の数式と参照を作成します
  4. シート間にハイパーリンクを追加します
  5. パスワードでシートを保護します
  6. 必要に応じてシートを表示または非表示にします
  7. アクティブなシートを設定し、ウィンドウ枠を固定します

実装:

async function createMultiSheetWorkbook(data, outputPath) {
  const workbook = new ExcelJS.Workbook();

  // Summary sheet
  const summary = workbook.addWorksheet('Summary');
  summary.columns = [
    { header: 'Metric', key: 'metric', width: 25 },
    { header: 'Value', key: 'value', width: 15 }
  ];

  summary.addRow({ metric: 'Total Sales', value: { formula: "SUM(Details!B:B)" } });
  summary.addRow({ metric: 'Average Order', value: { formula: "AVERAGE(Details!B:B)" } });
  summary.addRow({ metric: 'Total Orders', value: { formula: "COUNTA(Details!A:A)-1" } });

  // Details sheet
  const details = workbook.addWorksheet('Details');
  details.columns = [
    { header: 'Order ID', key: 'id', width: 12 },
    { header: 'Amount', key: 'amount', width: 15 },
    { header: 'Date', key: 'date', width: 12 }
  ];

  data.forEach(row => details.addRow(row));

  // Freeze header row
  details.views = [
    { state: 'frozen', xSplit: 0, ySplit: 1 }
  ];

  // Add hyperlink from summary to details
  summary.getCell('A1').value = {
    text: 'View Details',
    hyperlink: '#Details!A1',
    tooltip: 'Jump to Details sheet'
  };
  summary.getCell('A1').font = { color: { argb: 'FF0000FF' }, underline: true };

  // Set Summary as active sheet
  summary.state = 'visible';
  details.state = 'visible';

  await workbook.xlsx.writeFile(outputPath);
}
ワークフロー 6:CSV にエクスポートする

目的: データ交換用のシンプルな CSV ファイルを作成します

手順:

  1. データをオブジェクトまたは配列の配列として整形します
  2. 必要に応じてヘッダーを定義します
  3. CSV 形式に変換します
  4. 特殊文字と引用符を処理します
  5. 区切り文字(カンマ、セミコロン、タブ)を設定します
  6. 適切なエンコーディングでファイルに書き込みます

実装:

const fs = require('fs');

function createCSV(data, outputPath, options = {}) {
  const delimiter = options.delimiter || ',';
  const headers = options.headers || Object.keys(data[0]);

  // Create header row
  let csv = headers.join(delimiter) + '\n';

  // Add data rows
  data.forEach(row => {
    const values = headers.map(header => {
      let value = row[header] || '';
      // Escape quotes and wrap in quotes if contains delimiter or newline
      if (typeof value === 'string' && (value.includes(delimiter) || value.includes('\n') || value.includes('"'))) {
        value = '"' + value.replace(/"/g, '""') + '"';
      }
      return value;
    });
    csv += values.join(delimiter) + '\n';
  });

  fs.writeFileSync(outputPath, csv, 'utf8');
}

クイックリファレンス

操作コマンド/トリガー
Excel ワークブックを作成「[data] を使って Excel ファイルを作成」
CSV を生成「[data] を CSV にエクスポート」
数式を追加「スプレッドシートに数式を追加」
書式設定を適用「Excel のセルに [style] の書式を設定」
グラフを作成「ワークブックにグラフを追加」
複数シートのワークブック「[sheets] を含むワークブックを作成」
条件付き書式「条件付き書式を適用」
ウィンドウ枠を固定「ヘッダー行を固定」
シートを保護「[sheet] をパスワードで保護」

ベストプラクティス

  • データ検証: セルに書き込む前にデータ型を検証します
  • 数値の書式設定: 適切な数値書式(通貨、パーセント、日付)を適用します
  • 列幅: 読みやすさを考慮して、内容に応じた幅を設定します
  • ウィンドウ枠の固定: スクロール可能なデータでは、ヘッダー行を固定します
  • 名前付き範囲: 複雑なブックの数式では、名前付き範囲を使用します
  • テンプレート: 繰り返し使うレポート形式のテンプレートを作成します
  • メモリ管理: 非常に大きなデータセット(10 万行超)では、ストリーミングを使用します
  • エラー処理: 無効な参照に備えて、数式の作成を try-catch で囲みます
  • CSV のエンコーディング: 国際文字に対応するため、UTF-8 BOM を使用します
  • パフォーマンス: セルへの書き込みは個別に行わず、まとめて処理します
  • テスト: ファイル作成後に数式が正しく計算されることを確認します
  • ドキュメント: 複雑な数式にはセル内でコメントを付けます

よく使われるパターン

在庫レポート:

worksheet.columns = [
  { header: 'SKU', key: 'sku', width: 15 },
  { header: 'Product', key: 'product', width: 30 },
  { header: 'Quantity', key: 'qty', width: 12 },
  { header: 'Unit Price', key: 'price', width: 15 },
  { header: 'Total Value', key: 'value', width: 15 }
];

data.forEach((item, idx) => {
  const row = idx + 2;
  worksheet.addRow({
    sku: item.sku,
    product: item.product,
    qty: item.qty,
    price: item.price,
    value: { formula: `C${row}*D${row}` }
  });
});

財務ダッシュボード:

// Summary sheet with KPIs
summary.addRow({ metric: 'Revenue', value: { formula: "SUM(Data!B:B)" } });
summary.addRow({ metric: 'Expenses', value: { formula: "SUM(Data!C:C)" } });
summary.addRow({ metric: 'Net Profit', value: { formula: "B2-B3" } });
summary.addRow({ metric: 'Profit Margin', value: { formula: "B4/B2" } });
summary.getColumn('value').numFmt = '$#,##0.00';

依存関係

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

npm install exceljs
npm install xlsx      # Alternative library
npm install csv-writer # For CSV generation

エラー処理

  • 無効な数式: 割り当てる前に数式の構文を検証します
  • セル参照: 参照先のセルが存在することを確認します
  • ファイルのアクセス許可: 書き込みエラーを適切に処理します
  • メモリ制限: 50 MB を超えるファイルでは、ストリーミングモードを使用します
  • データ型: データを適切な型(数値、文字列、日付)に変換します
  • エンコーディングの問題: 国際文字に対応するため、UTF-8 エンコーディングを使用します

パフォーマンスのヒント

  • 複数回の addRow() 呼び出しの代わりに worksheet.addRows() を使用します
  • データを追加する前に列のプロパティを設定します
  • 不必要なセルの読み取りを避けます
  • 大きなデータセットにはストリーミング書き込みを使用します
  • スタイルの設定をまとめて行います
  • 静的データでは、可能な場合、数式ではなく値を事前に計算します

高度な機能

大きなファイルのストリーミング:

const workbook = new ExcelJS.stream.xlsx.WorkbookWriter({ filename: outputPath });
const worksheet = workbook.addWorksheet('Large Data');
// Add data in chunks
worksheet.commit();
workbook.commit();

データ検証:

worksheet.getCell('A2').dataValidation = {
  type: 'list',
  allowBlank: true,
  formulae: ['"Option1,Option2,Option3"']
};

保護:

await worksheet.protect('password', {
  selectLockedCells: true,
  selectUnlockedCells: true
});

コメント