xlsx-processing-manus について
開いた時点ですぐにデータを確認できるExcelブックを作成するためのスキルです。利用目的に合わせて、構成、分析、書式、ビジュアルの選択を案内します。
主な機能
- 01ニーズに応じた機能選択
- 02概要シートとナビゲーション
- 03グラフと条件付き書式
- 04数式と数値書式のガイド
- 05データの背景と洞察セクション
- 06ブック全体のテーマ統一
活用シーン
- 01要約付きの複数シートブック作成
- 02グラフによるカテゴリ値の比較
- 03しきい値や外れ値の強調
- 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 を作成する前に、次の点を検討します。
- ユーザーは何を必要としているか? — 「Excel ファイル」ではなく、どのような課題を解決しようとしているのか。
- 何を提供できるか? — どの機能が役立つか。
- どう対応付けるか? — この具体的な状況に適した機能の組み合わせを選択します。
機能 ↔ ユーザーにとっての価値
ユーザーの「データ理解」を支援
| 機能 | ユーザーにとっての価値 | 使用する場面 |
|---|---|---|
| 棒グラフ/縦棒グラフ | 比較結果をひと目で把握できます | カテゴリ間の値を比較する場合 |
| 折れ線グラフ | 傾向をひと目で把握できます | 時系列データ |
| 円グラフ | 構成比をひと目で把握できます | 全体に対する内訳(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:情報(何を知るか)
目標:正確で完全かつ示唆に富み、ユーザーが単なるデータだけでなく知識を得られることです。
数値形式
重要なルール:
- すべての数値セルに
number_formatを設定します。入力値と数式の結果の両方が対象です - 同じ列では精度を統一します。1 つの列に
0.1074と1.0を混在させないでください - 数式の結果にはデフォルトの書式がありません。明示的に書式を設定しない限り、実際の精度で表示されます
| データ型 | 書式コード | 例 |
|---|---|---|
| 整数 | #,##0 | 1,234,567 |
| 小数(1 桁) | #,##0.0 | 1,234.6 |
| 小数(2 桁) | #,##0.00 | 1,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つ選択します。すべての視覚要素はテーマカラーに基づきます。
利用可能なテーマ(状況に応じて選択するか、ユーザーに指定してもらいます):
| テーマ | プライマリ | ライト | 用途 |
|---|---|---|---|
| エレガントブラック | 2D2D2D | E5E5E5 | 高級感、ファッション、プレミアムレポート(デフォルトの推奨) |
| コーポレートブルー | 1F4E79 | D6E3F0 | 金融、企業分析 |
| フォレストグリーン | 2E5A4C | D4E5DE | サステナビリティ、環境 |
| バーガンディ | 722F37 | E8D5D7 | 高級ブランド、ワイン業界 |
| スレートグレー | 4A5568 | E2E8F0 | テクノロジー、モダン、ミニマリスト |
| ネイビー | 1E3A5F | D3DCE6 | 政府、海事、公共機関 |
| チャコール | 36454F | DDE1E4 | プロフェッショナル、エグゼクティブ |
| ディープパープル | 4A235A | E1D5E7 | クリエイティブ、イノベーション、プレミアムテック |
| ティール | 1A5F5F | D3E5E5 | ヘルスケア、ウェルネス |
| ウォームブラウン | 5D4037 | E6DDD9 | 自然、オーガニック、職人 |
| ロイヤルブルー | 1A237E | D3D5E8 | 学術、公共機関 |
| オリーブ | 556B2F | E0E5D5 | 軍事、アウトドア |
テーマの設定:
# === 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 | 色相 | 用途 |
|---|---|---|---|
| 強調 | E6F3FF | 209° | 高評価、重要なデータ |
| セクション | FFF3E0 | 37° | セクションの区切り |
| 入力 | FFFDE7 | 55° | 編集可能なセル |
| 特別 | FFF9C4 | 55° | 基準ケース、ベンチマーク |
| 成功 | E8F5E9 | 125° | 合格、完了 |
| 警告 | FFCCBC | 14° | 要注意 |
ルール:同じセマンティックには同じ色を使用します。異なるセマンティックには異なる色を使用します。
HIGHLIGHT = {
'emphasis': 'E6F3FF',
'section': 'FFF3E0',
'input': 'FFFDE7',
'special': 'FFF9C4',
'success': 'E8F5E9',
'warning': 'FFCCBC',
}
タイポグラフィ
セリフ体とサンセリフ体を組み合わせて使用します。階層を示す要素(タイトル、ヘッダー)にはセリフ体、データ(表形式の数値)にはサンセリフ体を使用します。
フォントの組み合わせ(推奨順):
| セリフ体(タイトル) | サンセリフ体(データ) | 備考 |
|---|---|---|
| Source Serif Pro | Source Sans Pro | Adobeのスーパーファミリー、推奨 |
| IBM Plex Serif | IBM Plex Sans | モダン、コーポレート |
| Georgia | Calibri | プリインストールされた代替フォント |
階層:
| 要素 | フォント | サイズ | スタイル |
|---|---|---|---|
| ドキュメントタイトル | セリフ体 | 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')
データブロックの定義
データブロックとは、枠線を必要とする視覚的なまとまりを構成する、連続した空でない行のグループです。データブロックは空行で区切られます。
識別ルール:
- セクションヘッダーから下方向に走査します
- 空でない行でデータブロックが始まります
- 空行で現在のデータブロックが終了します
- 各データブロックに独自の外枠を付けます
データブロックの種類:
| 種類 | 構成 | 例 |
|---|---|---|
| ヘッダーあり | ヘッダー行+データ行 | 列タイトル付きテーブル |
| ヘッダーなし | データ行のみ | 続きのデータ、サブテーブル |
認識例:
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)
| 列の種類 | 余白 | 最小幅 | 備考 |
|---|---|---|---|
| ラベル/テキスト | +4 | 15 | 通常は最初の列 |
| 数値 | +6 | 14 | 表示形式を適用した数値(負号、カンマ)用の追加スペース |
| 長いテキスト | +4 | 20、最大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)
編集可能性
- ユーザーが入力値を更新する可能性がある場合は、数式を使用します
- データが確定している場合は、固定値を使用します
- 数式はシンプルに保ち、複雑なものには説明を付けます