openpyxlで別ファイルのExcelセル参照(外部リンク)を読み取る方法

openpyxl

はじめに:そのExcelファイル、他のファイルに依存していませんか?

openpyxlを使ってExcelファイルを操作していると、「このファイル、実は別のExcelファイルから値を参照しているようだ…」という状況に遭遇することがあります。=[data.xlsx]Sheet1!$A$1のような数式、いわゆる**「外部リンク」**です。

自動化スクリプトを組む上で、ファイルがどのような外部ファイルに依存しているかを把握することは非常に重要です。

この記事では、openpyxlを使って、.xlsxファイルに含まれる別ファイルへのセル参照(外部リンク)の情報を読み取る具体的な方法と、その際の重要な注意点について解説します。


結論:外部リンクの「定義」は読めるが、「最新の値」は読めない

openpyxlで外部リンクに関してできることと、できないことを最初に明確にしておきましょう。

  • できること:
    • そのExcelファイルが、どの外部ファイルを参照しているかという定義情報をリストアップすること。
    • 外部リンクを持つ数式セルの**「最後に保存された値(キャッシュ値)」**を読むこと。
  • できないこと:
    • 参照先の外部ファイルを自動で開き、最新の値を読み取って数式を再計算すること。

openpyxlは、あくまでファイル構造を解析するライブラリであり、Excelアプリケーションのように他のファイルと連携して動くわけではない、と理解することが重要です。


外部リンク情報を読み取る実践コード

それでは、実際にPythonコードを使って外部リンクの情報を読み取ってみましょう。

Step 1: 外部リンクを持つExcelファイルの準備

まず、手動でテスト用のファイルを用意します。

  1. data_source.xlsxという名前のファイルを作成し、A1セルに2025と入力して保存します。
  2. report_file.xlsxという別のファイルを作成し、A1セルに=[data_source.xlsx]Sheet!$A$1という数式を入力して保存します。

これで、report_file.xlsxdata_source.xlsxを参照する準備ができました。

Step 2: workbook.external_linksを調べる

openpyxlでは、ワークブックが持つ外部リンクの情報はworkbook.external_linksというプロパティにリストとして格納されています。このリストの中身を確認するのが基本のアプローチです。

from openpyxl import load_workbook

TARGET_FILE = "report_file.xlsx"

try:
    wb = load_workbook(TARGET_FILE)
    ws = wb.active

    print(f"--- ファイル '{TARGET_FILE}' の外部リンク調査 ---")

    # external_linksプロパティの有無を確認
    if not wb.external_links:
        print("結果: このファイルに外部リンクは見つかりませんでした。")
    else:
        print(f"結果: {len(wb.external_links)} 個の外部リンクを発見しました。")
        for i, link in enumerate(wb.external_links, 1):
            # ExternalLinkオブジェクトの構造は複雑なため、reprで概要を表示
            print(f"  [{i}] {link}")

    print("\n--- 参照セルの情報 ---")
    cell_a1 = ws['A1']
    if cell_a1.data_type == 'f': # セルの型が数式(formula)かチェック
        print(f"セル A1 の数式: {cell_a1.value}")
        # wb.data_only=Trueで読み込んだ場合、キャッシュ値が取れる
        wb_data_only = load_workbook(TARGET_FILE, data_only=True)
        cached_value = wb_data_only['Sheet1']['A1'].value
        print(f"セル A1 のキャッシュ値: {cached_value}")

except FileNotFoundError:
    print(f"エラー: ファイル '{TARGET_FILE}' が見つかりません。")

実行結果のポイント

  • wb.external_linksのリストにオブジェクトが入っていれば、このファイルが外部参照を持つことが分かります。
  • セルの値を読むと、数式そのもの(=[data_source.xlsx]Sheet!$A$1)が取得できます。
  • data_only=Trueオプションで読み込むと、最後にExcelで保存された時の計算結果(2025)がキャッシュ値として取得できます。

最も重要な注意点:キャッシュ値の罠

この方法で取得できるセルの値は、あくまでキャッシュ値です。

例えば、Step 1で作成したdata_source.xlsxのA1セルを2026に変更して保存したとします。その後、report_file.xlsxをExcelで開いて更新・保存しない限り、上記のPythonスクリプトで読み取れるA1のキャッシュ値は古い2025のままです。

openpyxlは、あなたがdata_source.xlsxを変更したことを知らないのです。


まとめ:openpyxlは外部リンクの「調査員」

openpyxlを使って別ファイルのセル参照(外部リンク)を扱う方法をまとめます。

  • **wb.external_links**プロパティを調べることで、ブックがどの外部ファイルに依存しているかを知ることができる。
  • 外部リンクを持つセルの値は、数式として読み取れる。
  • data_only=Trueを使えば、**最後に保存された時の計算結果(キャッシュ値)**を取得できる。
  • 最新の値をリアルタイムに取得する機能はないため、注意が必要。

openpyxlにおける外部リンク関連の機能は、値を動的に更新するためのものではなく、ファイルの依存関係を静的に解析するための**「調査ツール」**として非常に有用です。自動化の前に、まず対象ファイルの構造を把握する目的で活用しましょう。

コメント

タイトルとURLをコピーしました