【openpyxl】エクセル:数式・関数の計算結果が取得できない問題の解決(data_only=True)

/

【openpyxl】エクセル:数式・関数の計算結果が取得できない問題の解決(data_only=True)

Pythonのエクセル操作でopenpyxlパッケージを使う方は非常に多いです。
openpyxlではエクセルを操作するための様々な機能が提供されています。

私も仕事でVBAではなく、Pythonでエクセル操作をしています。

その中で既存エクセルのセルから値を取得する際にうまくいかないことがありました。
openpyxlで数式や関数で計算された値を取得する時です。

計算された値ではなく、数式や関数がそのまま文字列として取得されてしまいました。

本記事では、openpyxlで他エクセルから、セルの数式や関数で計算された結果を取得する方法を解説していきます。

今回の現象

以下のエクセルファイルに対して現象の再現を行います。
セルA3に数式が入っており、その結果を取得します。

エクセルのセルA3から数式を取得する(openpyxl)

以下のプログラムを作成し、エクセルファイルからセルA3のデータを取得します。

import openpyxl

wb = openpyxl.load_workbook('office54.xlsx')
ws = wb.active
print(ws['A3'].value)

このプログラムを起動すると、計算結果ではなく「=A1+A2」という数式の文字列が返ってきます。

> python get-a3.py
=A1+A2

これではopenpyxlのできる範囲が非常に少なくなります。
ですが安心してください。openpyxlにはこの問題を解決する方法がちゃんと用意されています。

解決方法

今回の問題が発生した原因は、既存のエクセルを読み込む段階にあります。

デフォルトのままload_workbookを使った場合、セルの値をCellオブジェクトから取得すると、数式や関数による計算結果の値ではなく数式や関数そのままの文字列を取得するようになっています。

数式や関数による計算結果をCellオブジェクトから取得したい場合は、load_workbookでエクセルを読み込む際に、
data_only=True
を引数に与えてください。

wb = openpyxl.load_workbook('office54.xlsx', data_only=True)

data_only=Trueにすることで、数式で計算された結果をCellオブジェクトから取得できるようになります。

このdata_only=Trueでエクセルを読み込む場合は、以下2点に注意してください。

  • data_only=Trueでは数式は読み込まれないため、編集後に元のファイルに上書き保存しないよう注意が必要
  • data_only=Trueで読み込み後、openpyxlで入力した数式は保存した後でないと、数式で計算された値を取得できない

2つ目の注意点の理由は、数式の計算をするのはExcelアプリだからです。
そのためopenpyxlで入れた数式はそのままではただの文字列なので、保存してExcelアプリに計算をしてもらう必要があります。

まとめ

Pythonのopenpyxlによるセルの数式・関数の計算結果が取得できない問題の解決方法はいかがでしたか。
意外に多くの方がこの問題で悩まれたことがあると思います。

今回のポイントはエクセルファイルの読み込み時の引数です。
場面によって使い分けるようにしてください。

連載記事

Pythonによるエクセル操作の記事を定期的にアップしております。
ぜひエクセル仕事の効率化のためにご参照ください。