mcpField
X
xlsx-processing-manus

xlsx-processing-manus

github.com/lawve-aiドキュメント907101 回インストール1 週間前に更新
リポジトリ

xlsx-processing-manus について

開いた時点ですぐにデータを確認できるExcelブックを作成するためのスキルです。利用目的に合わせて、構成、分析、書式、ビジュアルの選択を案内します。

主な機能

  1. 01ニーズに応じた機能選択
  2. 02概要シートとナビゲーション
  3. 03グラフと条件付き書式
  4. 04数式と数値書式のガイド
  5. 05データの背景と洞察セクション
  6. 06ブック全体のテーマ統一

活用シーン

  1. 01要約付きの複数シートブック作成
  2. 02グラフによるカテゴリ値の比較
  3. 03しきい値や外れ値の強調
  4. 04数式を使った調整可能なモデル作成

インストール

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

$npx skills add https://github.com/lawve-ai/awesome-legal-skills --skill xlsx-processing-manus

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

詳細

Excel 生成スキル

目標

ユーザーが Excel をすぐに活用でき、開いたときに洞察を得られるようにします。

基本原則

内容を明確に保ち、認知的な負担を増やさないようにしながら、できる限り視覚的な情報を充実させます。すべての視覚要素には意味と目的があり、装飾ではなく内容に役立つものであるべきです。


パート 1:ユーザーニーズと機能の対応付け

Excel を作成する前に、次の点を検討します。

  1. ユーザーは何を必要としているか? — 「Excel ファイル」ではなく、どのような課題を解決しようとしているのか。
  2. 何を提供できるか? — どの機能が役立つか。
  3. どう対応付けるか? — この具体的な状況に適した機能の組み合わせを選択します。
機能 ↔ ユーザーにとっての価値
ユーザーの「データ理解」を支援
機能ユーザーにとっての価値使用する場面
棒グラフ/縦棒グラフ比較結果をひと目で把握できますカテゴリ間の値を比較する場合
折れ線グラフ傾向をひと目で把握できます時系列データ
円グラフ構成比をひと目で把握できます全体に対する内訳(6 カテゴリ以下)
データバーセルを離れずに大きさを比較できますすばやく比較したい数値列
カラースケールヒートマップのようにパターンを浮き立たせます行列、範囲、分布
スパークライン1 つのセル内で傾向を把握できます過去の状況を含むサマリー行
ユーザーが「重要な情報を見つける」ことを支援
機能ユーザーにとっての価値使用する場面
事前並べ替え最も重要なデータを先頭に表示しますランキング、上位 N 件、優先順位
条件付き強調表示重要なデータを自動的に目立たせます外れ値、しきい値、上位/下位 N 件
アイコンセット状態をひと目で確認できますKPI の状態、カテゴリ別の状態(控えめに使用)
太字/色による強調主要項目と副次項目を視覚的に区別できますサマリー行、重要指標
重要な洞察セクション結論を直接提示します分析レポート
ユーザーの「時間短縮」を支援
機能ユーザーにとっての価値使用する場面
概要シート最初のページで概要を確認でき、探し回る必要がありません複数シートのファイルすべて
事前計算済みのサマリー結果がすぐに使え、手動計算が不要です統計が必要なデータ
一貫した数値形式形式を調整する必要がありませんすべての数値データ
ウィンドウ枠の固定スクロール中も見出しが表示されます10 行を超える表
リンク付きシート一覧推測せずにすばやく移動できます3 シートを超えるファイル
ユーザーが「そのまま使える」よう支援
機能ユーザーにとっての価値使用する場面
フィルターユーザー自身でデータを探索できます探索的な分析が必要な場合
ハイパーリンククリックして移動でき、手動で切り替える必要がありませんシート間の参照、外部ソース
印刷に適したレイアウト印刷または PDF へのエクスポートがすぐにできます共有用レポート
数式(ハードコード値ではなく)パラメーターを変更すると結果が更新されますモデル、予測、調整可能なシナリオ
データの入力規則のドロップダウン入力ミスを防ぎますユーザー入力が必要なテンプレート
ユーザーが「データを信頼する」ことを支援
機能ユーザーにとっての価値使用する場面
データソースの明記データの出所がわかりますすべての外部データ
作成日データの鮮度がわかります時間依存のレポート
データの対象期間どの期間を扱っているかがわかります時系列データ
プロフェッショナルな書式信頼できる印象を与えます外部向けファイルすべて
一貫した精度正確さに対する疑念をなくしますすべての数値
ユーザーが「洞察を得る」ことを支援
機能ユーザーにとっての価値使用する場面
比較列(Δ、%)比較のための手動計算が不要になります前年比、前月比、A 対 B
順位列順位をその場で確認できます競合分析、パフォーマンス
グループ化したサマリーディメンションごとに集計結果を表示しますセグメント別分析
傾向インジケーター(↑↓)方向性をひと目で把握できます変化の方向が重要な場合
洞察テキスト「それで何がわかるのか」を明示します分析レポート

パート 2:4 層の実装

レイヤー 1:構成(どのように整理するか)

目標:論理的で見つけやすく、ユーザーが必要な情報をすぐに見つけられることです。

シートの構成
ガイドライン推奨事項
シート数3~5 が理想、最大 7
最初のシート要約とナビゲーションを含む「Overview」にします
シートの順序全般から詳細へ(Overview → Data → Analysis)
命名明確で簡潔にします(例:「Sheet1」ではなく「Revenue Data」)
情報アーキテクチャ
  • Overview シートだけで内容を把握できること:ほかのシートを開かなくても、ユーザーが主なメッセージを理解できるようにします
  • 段階的な情報開示:まず要約を示し、詳しく知りたいユーザーには詳細を提示します
  • シート間で一貫した構成:同じレイアウトパターンと開始位置にします
レイアウトのルール
要素位置
左余白A 列を空にする(幅 3)
上余白1 行目を空にする
コンテンツの開始位置セル B2
セクション間の間隔セクション間に空行を 1 行
テーブル間の間隔テーブル間に空行を 2 行
グラフすべてのテーブルの下(2 行空ける)、または関連するテーブルの右

グラフの配置:

  • デフォルト:すべてのテーブルの下に配置し、コンテンツの左端にそろえます
  • 代替案:関連する 1 つのテーブルの右に配置します
  • グラフ同士、またはグラフとテーブルが重ならないようにします
単独のテキスト行

テキストを 1 つのセルだけに入力する行(タイトル、説明、注記、箇条書きなど)では、テキストは右側の空セルに自然に広がります。ただし、右側のセルに内容(スペースを含む)がある場合、テキストは切り詰められます。

判断基準:

条件対応
右側のセルが空であることが保証されている対応不要。テキストは自然に広がります
右側のセルに内容が入る可能性がある内容の幅に合わせてセルを結合するか、テキストを折り返します
テキストがコンテンツ領域の幅を超えるテキストを折り返し、行の高さを手動で設定します

技術上の注意:塗りつぶしと罫線だけではテキストのはみ出しは防がれません。実際のセル内容(スペース文字を含む)がある場合にのみ防がれます。

ナビゲーション

シートが 3 つ以上あるファイルでは、Overview にシートインデックスを含めます。

# Sheet Index with hyperlinks
ws['B5'] = "CONTENTS"
ws['B5'].font = Font(name=SERIF_FONT, size=14, bold=True, color=THEME['accent'])

sheets = ["Overview", "Data", "Analysis"]
for i, sheet_name in enumerate(sheets, start=6):
    cell = ws.cell(row=i, column=2, value=sheet_name)
    cell.hyperlink = f"#'{sheet_name}'!A1"
    cell.font = Font(color=THEME['accent'], underline='single')

レイヤー 2:情報(何を知るか)

目標:正確で完全かつ示唆に富み、ユーザーが単なるデータだけでなく知識を得られることです。

数値形式

重要なルール:

  1. すべての数値セルに number_format を設定します。入力値と数式の結果の両方が対象です
  2. 同じ列では精度を統一します。1 つの列に 0.1074 と 1.0 を混在させないでください
  3. 数式の結果にはデフォルトの書式がありません。明示的に書式を設定しない限り、実際の精度で表示されます
データ型書式コード例
整数#,##01,234,567
小数(1 桁)#,##0.01,234.6
小数(2 桁)#,##0.001,234.56
パーセンテージ0.0%12.3%
通貨$#,##0.00$1,234.56

よくある間違い:入力セルにだけ書式を設定し、数式セルを忘れることです。

# WRONG: Formula cell without number_format
ws['C10'] = '=C7-C9'  # Will display raw precision like 14.123456789

# CORRECT: Always set number_format for formula cells
ws['C10'] = '=C7-C9'
ws['C10'].number_format = '#,##0.0'  # Displays as 14.1

# Best practice: Define format by column/data type, apply to ALL cells
for row in range(data_start, data_end + 1):
    cell = ws.cell(row=row, column=value_col)
    cell.number_format = '#,##0.0'  # Applies to both values and formulas
データのコンテキスト

すべてのデータセットにコンテキストが必要です。

要素場所例
データソースOverview またはシートのフッター"Source: Company Annual Report 2024"
期間タイトルの近く、またはサブタイトル"Data from Jan 2020 - Dec 2024"
生成日Overview のフッター"Generated: 2024-01-15"
定義注記セクション、または別シート"Revenue = Net sales excluding returns"
重要な洞察

分析を含む場合、データを提示するだけでなく、それが何を意味するのかをユーザーに伝えます。

ws['B20'] = "KEY INSIGHTS"
ws['B20'].font = Font(name=SERIF_FONT, size=14, bold=True, color=THEME['accent'])

insights = [
    "• Revenue grew 23% YoY, driven primarily by APAC expansion",
    "• Top 3 customers account for 45% of total revenue",
    "• Q4 showed strongest performance across all metrics"
]
for i, insight in enumerate(insights, start=21):
    ws.cell(row=i, column=2, value=insight)
コンテンツの完全性
確認事項対応
欠損値空欄または「N/A」として表示します。実際にゼロでない限り、0 にしないでください
計算フィールド計算を説明する数式または注記を含めます
略語初出時、または注記で定義します
単位見出しに含めます(例:「Revenue ($M)」)

レイヤー 3:ビジュアル(何を目にするか)

目標:プロフェッショナルな見た目、ひと目で伝わる価値、コンテンツに役立つビジュアルを実現することです。

必須設定
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

# Hide gridlines for cleaner look
ws.sheet_view.showGridLines = False

# Left margin
ws.column_dimensions['A'].width = 3
テーマシステム

ワークブックごとにテーマを1つ選択します。すべての視覚要素はテーマカラーに基づきます。

利用可能なテーマ(状況に応じて選択するか、ユーザーに指定してもらいます):

テーマプライマリライト用途
エレガントブラック2D2D2DE5E5E5高級感、ファッション、プレミアムレポート(デフォルトの推奨)
コーポレートブルー1F4E79D6E3F0金融、企業分析
フォレストグリーン2E5A4CD4E5DEサステナビリティ、環境
バーガンディ722F37E8D5D7高級ブランド、ワイン業界
スレートグレー4A5568E2E8F0テクノロジー、モダン、ミニマリスト
ネイビー1E3A5FD3DCE6政府、海事、公共機関
チャコール36454FDDE1E4プロフェッショナル、エグゼクティブ
ディープパープル4A235AE1D5E7クリエイティブ、イノベーション、プレミアムテック
ティール1A5F5FD3E5E5ヘルスケア、ウェルネス
ウォームブラウン5D4037E6DDD9自然、オーガニック、職人
ロイヤルブルー1A237ED3D5E8学術、公共機関
オリーブ556B2FE0E5D5軍事、アウトドア

テーマの設定:

# === THEME CONFIGURATION ===
THEMES = {
    'elegant_black': {
        'primary': '2D2D2D',
        'light': 'E5E5E5',
        'accent': '2D2D2D',
        'chart_colors': ['2D2D2D', '4A4A4A', '6B6B6B', '8C8C8C', 'ADADAD', 'CFCFCF'],
    },
    'corporate_blue': {
        'primary': '1F4E79',
        'light': 'D6E3F0',
        'accent': '1F4E79',
        'chart_colors': ['1F4E79', '2E75B6', '5B9BD5', '9DC3E6', 'BDD7EE', 'DEEBF7'],
    },
    # ... other themes follow same pattern
}

THEME = THEMES['elegant_black']  # Default
SERIF_FONT = 'Source Serif Pro'   # or 'Georgia' as fallback
SANS_FONT = 'Source Sans Pro'     # or 'Calibri' as fallback

テーマカラーの適用方法:

要素色背景
ドキュメントタイトルTHEME['primary']なし
セクションヘッダーTHEME['primary']なし、または THEME['light']
テーブルヘッダー白THEME['primary']
データセル黒なし、または交互に F9F9F9
チャート要素THEME['chart_colors']—
セマンティックカラー

データの意味を表す色(テーマとは独立):

セマンティック色用途
ポジティブ2E7D32成長、利益、成功
ネガティブC62828減少、損失、失敗
警告F57C00注意、警戒
行のハイライトカラー

行単位の強調に使用します。さりげない区別のため、明度の高い色合い(明度85〜95%)を使用します。

セマンティックHex色相用途
強調E6F3FF209°高評価、重要なデータ
セクションFFF3E037°セクションの区切り
入力FFFDE755°編集可能なセル
特別FFF9C455°基準ケース、ベンチマーク
成功E8F5E9125°合格、完了
警告FFCCBC14°要注意

ルール:同じセマンティックには同じ色を使用します。異なるセマンティックには異なる色を使用します。

HIGHLIGHT = {
    'emphasis': 'E6F3FF',
    'section': 'FFF3E0',
    'input': 'FFFDE7',
    'special': 'FFF9C4',
    'success': 'E8F5E9',
    'warning': 'FFCCBC',
}
タイポグラフィ

セリフ体とサンセリフ体を組み合わせて使用します。階層を示す要素(タイトル、ヘッダー)にはセリフ体、データ(表形式の数値)にはサンセリフ体を使用します。

フォントの組み合わせ(推奨順):

セリフ体(タイトル)サンセリフ体(データ)備考
Source Serif ProSource Sans ProAdobeのスーパーファミリー、推奨
IBM Plex SerifIBM Plex Sansモダン、コーポレート
GeorgiaCalibriプリインストールされた代替フォント

階層:

要素フォントサイズスタイル
ドキュメントタイトルセリフ体18-22太字、プライマリカラー
セクションヘッダーセリフ体12-14太字、プライマリカラー
テーブルヘッダーセリフ体10-11太字、白
データセルサンセリフ体11標準、黒
注記サンセリフ体9-10斜体、666666
# Document title
ws['B2'].font = Font(name=SERIF_FONT, size=18, bold=True, color=THEME['primary'])

# Section header
ws['B6'].font = Font(name=SERIF_FONT, size=14, bold=True, color=THEME['primary'])

# Table header
header_font = Font(name=SERIF_FONT, size=10, bold=True, color='FFFFFF')

# Data cells
data_font = Font(name=SANS_FONT, size=11)

# Notes
notes_font = Font(name=SANS_FONT, size=10, italic=True, color='666666')
データブロックの定義

データブロックとは、枠線を必要とする視覚的なまとまりを構成する、連続した空でない行のグループです。データブロックは空行で区切られます。

識別ルール:

  1. セクションヘッダーから下方向に走査します
  2. 空でない行でデータブロックが始まります
  3. 空行で現在のデータブロックが終了します
  4. 各データブロックに独自の外枠を付けます

データブロックの種類:

種類構成例
ヘッダーありヘッダー行+データ行列タイトル付きテーブル
ヘッダーなしデータ行のみ続きのデータ、サブテーブル

認識例:

Row 5: Section Header "INCOME STATEMENT"   → No border (not a Data Block)
Row 6: Empty                               → Separator
Row 7: Header (Item, Year1, Year2...)      → Data Block 1 starts
Row 8: Revenue, 47061, 48943...            
Row 9: Growth Rate, 4.0%, 3.5%...          → Data Block 1 ends
Row 10: Empty                              → Separator
Row 11: EBITDA, 12121, 12627...            → Data Block 2 starts (no header)
Row 12: EBITDA Margin, 25.8%, 25.8%...     → Data Block 2 ends
Row 13: Empty                              → Separator
Row 14: D&A, 1200, 1224...                 → Data Block 3 starts (no header)
Row 15: EBIT, 10921, 11404...              
Row 16: EBIT Margin, 23.2%, 23.3%...       → Data Block 3 ends

結果:独自の外枠を持つ3つのデータブロックに分かれます。

罫線のルール

推奨スタイル:横罫線のみ — よりすっきりとしたモダンな見た目になります。

各データブロックに必要な罫線:

罫線の種類位置
外枠データブロックの4辺(上、下、左、右)すべて
ヘッダー下中程度の太さ、テーマのプライマリカラー(ヘッダーがある場合)
内部の横罫線すべての行の間に細い罫線
内部の縦罫線なし(すっきりとした見た目にするため省略)

重要:データブロック内のすべてのセルに罫線を設定してください。ヘッダーやラベルのセルだけでなく、データセルにも罫線が必要です。

# Border definitions
outer_border = Side(style='thin', color='D1D1D1')
header_bottom = Side(style='medium', color=THEME['primary'])
inner_horizontal = Side(style='thin', color='D1D1D1')
no_border = Side(style=None)

def apply_data_block_borders(ws, start_row, end_row, start_col, end_col, has_header=True):
    """
    Apply borders to a Data Block.
    Every cell must be processed—not just headers and labels.
    """
    for row in range(start_row, end_row + 1):
        for col in range(start_col, end_col + 1):
            cell = ws.cell(row=row, column=col)
            
            # Left/Right: outer frame
            left = outer_border if col == start_col else no_border
            right = outer_border if col == end_col else no_border
            
            # Top: outer for first row, inner horizontal for others
            top = outer_border if row == start_row else inner_horizontal
            
            # Bottom: header_bottom for header, outer for last row, inner for middle
            if has_header and row == start_row:
                bottom = header_bottom
            elif row == end_row:
                bottom = outer_border
            else:
                bottom = inner_horizontal
            
            cell.border = Border(left=left, right=right, top=top, bottom=bottom)

データブロック以外の要素(タイトル、セクション見出し、単独のテキスト、注記):罫線なし。

配置

ヘッダー:中央揃え。

データセル:

内容水平方向
短いテキスト(単語)中央揃え
長いテキスト(文章)左揃え + indent=1
数値右揃え
日付、ステータス中央揃え

垂直方向:常にcenter(折り返しテキストを含む)。

# Left-aligned text with padding
cell.alignment = Alignment(horizontal='left', vertical='center', indent=1)

# Numbers
cell.alignment = Alignment(horizontal='right', vertical='center')

# Wrapped text
cell.alignment = Alignment(horizontal='left', vertical='center', wrap_text=True, indent=1)
列幅

計算範囲:データブロックのセルのみ。単独のテキスト行、セクション見出し、注記は除外します。

計算式:max(max_content_length_in_data_blocks + padding, minimum)

列の種類余白最小幅備考
ラベル/テキスト+415通常は最初の列
数値+614表示形式を適用した数値(負号、カンマ)用の追加スペース
長いテキスト+420、最大40最大値を超える場合は折り返す

設計上の制約:異なるデータブロックでも、同じ列は同様の役割を担うようにしてください。列幅は、その列にあるすべてのデータブロックのうち、最も幅の広い内容に基づいて決定します。

単独のテキスト行:列幅の計算には含めないでください。テキストを自然に表示するか、折り返し/結合を使用してください。

def calculate_column_width(ws, col, data_block_ranges):
    """
    Calculate column width based only on Data Block content.
    Standalone text rows are excluded.
    
    data_block_ranges: list of (start_row, end_row) tuples
    """
    max_len = 0
    is_numeric = True
    
    for start_row, end_row in data_block_ranges:
        for row in range(start_row, end_row + 1):
            cell = ws.cell(row=row, column=col)
            if cell.value:
                # Get formatted display length
                display_value = str(cell.value)
                max_len = max(max_len, len(display_value))
                if not isinstance(cell.value, (int, float)):
                    is_numeric = False
    
    padding = 6 if is_numeric else 4
    minimum = 14 if is_numeric else 15
    
    return max(max_len + padding, minimum)
行の高さ

手動で設定する必要があります。openpyxlは自動調整しません。

行の種類高さ
ドキュメントのタイトル35
セクション見出し25
テーブルヘッダー30
標準のデータ18
折り返しテキストlines × 15 + 10
ws.row_dimensions[2].height = 35   # Title
ws.row_dimensions[5].height = 25   # Section header
ws.row_dimensions[7].height = 30   # Table header
ws.row_dimensions[8].height = 18   # Data row
セルの結合
要素結合するか範囲
ドキュメント/シートのタイトルはい下のコンテンツの幅
セクション見出しはい関連するテーブルの幅
複数レベルのヘッダー(親)はい子列の範囲
長いテキストの行はいコンテンツ領域の幅

結合するタイミング:列の境界でテキストが切れてしまう場合は結合します。1列内にテキストが収まる場合、結合は任意です。

結合が必要となる一般的なケース:

  • タイトルとサブタイトル(通常はコンテンツ全体の幅に広げます)
  • セクション見出し(関連するテーブルの幅に広げます)
  • KEY INSIGHTSの箇条書き(長い文章)
  • 注記と免責事項(複数の文章)

背景色付きのセクション見出し — 結合する幅はテーブルの幅と一致させます:

# Section header spans same width as table below
last_col = 8  # Must match table's last column
ws.merge_cells(f'B6:{get_column_letter(last_col)}6')
ws['B6'] = "KEY METRICS"
ws['B6'].font = Font(name=SERIF_FONT, size=14, bold=True, color=THEME['primary'])
ws['B6'].fill = PatternFill(start_color=THEME['light'], end_color=THEME['light'], fill_type='solid')
ws['B6'].alignment = Alignment(horizontal='left', vertical='center')
データの可視化

データバー:

from openpyxl.formatting.rule import DataBarRule

rule = DataBarRule(start_type='min', end_type='max', color=THEME['primary'])
ws.conditional_formatting.add('C5:C50', rule)

カラースケール:

from openpyxl.formatting.rule import ColorScaleRule

rule = ColorScaleRule(
    start_type='min', start_color='FFFFFF',
    end_type='max', end_color=THEME['primary']
)
ws.conditional_formatting.add('D5:D50', rule)

グラフ:

from openpyxl.chart import BarChart, Reference

chart = BarChart()
chart.title = "Revenue by Region"
data = Reference(ws, min_col=3, min_row=4, max_row=10)
cats = Reference(ws, min_col=2, min_row=5, max_row=10)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)

# Apply theme colors to chart series
for i, series in enumerate(chart.series):
    series.graphicalProperties.solidFill = THEME['chart_colors'][i % len(THEME['chart_colors'])]

ws.add_chart(chart, "F5")

レイヤー4:操作性(操作方法)

目標:使いやすく柔軟で、ユーザーがデータを確認し、操作できること。

ウィンドウ枠の固定

10行を超えるテーブルの場合:

ws.freeze_panes = 'B5'  # Freeze below header row
フィルター

20行を超えるテーブルの場合:

ws.auto_filter.ref = f"B4:{get_column_letter(last_col)}{last_row}"
ハイパーリンク
# Internal link
cell.hyperlink = "#'Data'!A1"
cell.font = Font(color=THEME['accent'], underline='single')

# External link
cell.hyperlink = "https://example.com"
cell.font = Font(color=THEME['accent'], underline='single')
並べ替え

最も意味のある基準で事前に並べ替えます:

  • ランキング → 値の降順
  • 時系列データ → 日付の昇順
  • アルファベット順 → 明確な優先順位がない場合
df = df.sort_values('revenue', ascending=False)
編集可能性
  • ユーザーが入力値を更新する可能性がある場合は、数式を使用します
  • データが確定している場合は、固定値を使用します
  • 数式はシンプルに保ち、複雑なものには説明を付けます

コメント