Spreadsheet Builder について
Spreadsheet Builderは、exceljsなどのライブラリで書式付きExcelブックやCSVファイルを生成するスキルです。データ出力、財務モデル、ダッシュボード向けに、数式、条件付き書式、グラフ、複数シートのレポートを扱います。
主な機能
- 01ExcelブックとCSVファイルの作成
- 02数式と計算の追加
- 03条件付き書式の適用
- 04グラフとデータ可視化の作成
- 05リンク付き複数シートブックの構築
活用シーン
- 01財務レポートやモデルの生成
- 02在庫表やデータ出力の準備
- 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 ファイルを作成します
手順:
exceljsをインポートし、Workbook インスタンスを作成します- 名前を指定してワークシートを追加します
- ヘッダーと列幅を指定して列を定義します
- データ行を追加します
- 基本的な書式設定(フォント、色、配置)を適用します
- 列幅と行の高さを設定します
- .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:数式と計算を追加する
目的: 自動計算と数式を含むスプレッドシートを作成します
手順:
- ワークブックとワークシートを作成します
- データ列を追加します
- 数式セル(SUM、AVERAGE、IF、VLOOKUP など)を挿入します
- セル参照を使用して動的な計算を行います
- 条件付き数式を追加します
- 計算列を作成します
- 合計と小計を追加します
実装:
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:条件付き書式を適用する
目的: ルールやしきい値に基づいてセルを強調表示します
手順:
- データを含むワークブックを作成します
- 条件付き書式のルールを定義します
- 値の範囲にカラースケールを適用します
- 視覚的に比較できるようにデータバーを使用します
- ステータスを示すアイコンセットを追加します
- 上位値または下位値を強調表示します
- カスタムの数式ベースのルールを適用します
実装:
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:グラフと可視化を作成する
目的: データの傾向や比較を可視化するグラフを追加します
手順:
- データを含むワークブックを作成します
- データ用ワークシートを追加します
- グラフ用ワークシートを作成するか、データシートに埋め込みます
- グラフの種類(棒、折れ線、円、散布図など)を指定します
- 系列のデータ範囲を設定します
- グラフのタイトル、軸、凡例を設定します
- スタイルと色を適用します
- ワークシート上にグラフを配置します
実装:
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:リンク付きの複数シートワークブックを作成する
目的: 関連する複数のシートを含む複雑なワークブックを作成します
手順:
- ワークブックを作成します
- 複数のワークシート(Summary、Details、Raw Data など)を追加します
- シート間の数式と参照を作成します
- シート間にハイパーリンクを追加します
- パスワードでシートを保護します
- 必要に応じてシートを表示または非表示にします
- アクティブなシートを設定し、ウィンドウ枠を固定します
実装:
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 ファイルを作成します
手順:
- データをオブジェクトまたは配列の配列として整形します
- 必要に応じてヘッダーを定義します
- CSV 形式に変換します
- 特殊文字と引用符を処理します
- 区切り文字(カンマ、セミコロン、タブ)を設定します
- 適切なエンコーディングでファイルに書き込みます
実装:
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
});