openpyxl で「目次」シートを自動生成し、各シートへワンクリックで移動できるブックを作成する方法

複数シートを含む業務マニュアルでは、最初のシートにリンク付きの目次を用意しておくと閲覧者の操作性が大幅に向上します。本記事では、Python ライブラリ openpyxl を用いて次の処理を一括で行うスクリプトをご紹介いたします。

  • 既存ブックの先頭に「Index」シートを挿入
  • シート名一覧を自動取得し、ハイパーリンクを設定
  • 目次表に罫線・塗りつぶし・列幅調整を適用

目次

事前準備

pip install openpyxl

サンプルコード

from openpyxl import load_workbook
from openpyxl.styles import Border, PatternFill, Side

# --- 1. ブック読み込み ---
wb = load_workbook('manual_master.xlsx')

# --- 2. 既存タブのアクティブ状態を解除 ---
for sh in wb.worksheets:
    sh.sheet_view.tabSelected = None

# --- 3. 「Index」シートを先頭に作成 ---
ws_index = wb.create_sheet(title='Index', index=0)
ws_index.column_dimensions['B'].width = 38  # ハイパーリンク列の幅を拡張

# --- 4. 目次ヘッダーを作成 ---
header_titles = ('No.', 'Jump to Page')
thin_border   = Border(
    left=Side(border_style='thin',  color='000000'),
    right=Side(border_style='thin', color='000000'),
    top=Side(border_style='thin',   color='000000'),
    bottom=Side(border_style='thin', color='000000')
)
header_fill = PatternFill(fill_type='solid', fgColor='C6E0B4')

for col_idx, title in enumerate(header_titles, start=1):
    cell = ws_index.cell(row=1, column=col_idx, value=title)
    cell.border = thin_border
    cell.fill   = header_fill

# --- 5. 既存シート名を取得し、目次行を追加 ---
for idx, sheet_name in enumerate(wb.sheetnames[1:], start=2):
    ws_index.cell(row=idx, column=1, value=idx - 1).border = thin_border

    link_cell            = ws_index.cell(row=idx, column=2, value=sheet_name)
    link_cell.hyperlink  = f'#{sheet_name}!A1'
    link_cell.style      = 'Hyperlink'
    link_cell.border     = thin_border

# --- 6. Index シートをアクティブに設定し保存 ---
wb.active = 0
wb.save('manual_with_index.xlsx')

コードの主なポイント

処理内容解説
タブ選択状態を解除sheet_view.tabSelectedNone にすると、Index タブのみがアクティブになります。
ハイパーリンクの設定#{シート名}!A1 形式で指定すると、対象シートのセル A1 にジャンプします。
見出し行の装飾PatternFillBorder で統一感のあるデザインを付与しています。

応用例

  • シートが増減しても対応
    追加シートを含めて wb.sheetnames[1:] を都度取得するため、目次更新のたびにスクリプトを再実行すれば常に最新状態を維持できます。
  • 階層的な目次を作る
    シート名にプレフィックス(例: 01_, 02_)を付け、番号を基準に並び替えてから目次を生成すると階層構造を表現できます。
  • 列幅を自動調整
    長いシート名に対応する場合は ws_index.column_dimensions['B'].auto_size = True(openpyxl 3.1 以降)で自動調整が可能です。

まとめ

本スクリプトを利用すると、リンク付き目次の作成を数秒で自動化でき、利用者はクリック一つで目的のシートへ遷移できます。定期的に改訂が入るマニュアルや多数の分析シートがあるブックでも、目次を組み込むことで可読性と操作性を大幅に向上させられます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次