3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでExcelの数式を計算結果の値に置き換えて保存する方法

3
Posted at

user:

複数シートからなるExcelファイルがあります。これらの中にはエクセル関数なども含まれているのですが、すべてのシートに対して、エクセル関数の代わりに具体的な出力値を使って、元と同じく構成の複数シートのExcelファイルとして主力するPython関数を書いてください。

assistant:

Excelファイルの複数シートに含まれる数式(エクセル関数)を、数式の代わりにその計算結果の具体的な値に置き換えた状態で保存するPython関数を作成したいというご要望ですね。

ポイントは以下の通りです。

  • Excelファイルの各シートに対して、数式が入っているセルは値に置き換える。
  • それ以外のセルの値はそのままにする。
  • 新しいExcelファイルとして保存する。
  • 複数シートすべてに対して行う。

これを実現するには、openpyxlが便利です。openpyxlはExcelファイルの読み込み、編集、保存ができ、セルの値・数式や計算結果にアクセスすることができます。

ポイント

  • Excelで数式を含むファイルを保存した状態では、セルに.valueとして数式が入っており、.data_onlyモードでファイルを再読み込みすると数式の計算結果を取得できます。
  • しかし一般に、Python上で数式を計算するエンジンは少ないので、
  • 直接Excelの計算結果がファイルに保存されていることが前提となります。
  • よって、元ファイルがExcelで正しく開いて保存されていて計算結果が格納されているファイルである必要があります。

以下の方法は次のような流れになります。

  1. オリジナルのファイルを読み込み(数式がセルに入っている状態)
  2. 同じファイルをdata_only=Trueで読み込み計算結果だけ読込む
  3. オリジナルの読み込みファイルのセルを1つずつチェックし、
    数式が入っているセルがあれば、計算値に置換
  4. 新しいファイルとして保存

実装例

from openpyxl import load_workbook

def replace_formula_with_value(input_filepath: str, output_filepath: str):
    # 数式を読込むワークブック
    wb_formula = load_workbook(input_filepath, data_only=False)
    # 計算結果のみを読込むワークブック
    wb_values = load_workbook(input_filepath, data_only=True)

    for sheet_name in wb_formula.sheetnames:
        ws_formula = wb_formula[sheet_name]
        ws_values = wb_values[sheet_name]

        # セルを1つずつ確認
        for row in ws_formula.iter_rows():
            for cell in row:
                # cellに数式があるなら、計算値を設定
                if cell.data_type == "f":  # 数式タイプの場合
                    # 同じアドレスの計算結果をws_valuesから取得して置き換え
                    cell.value = ws_values[cell.coordinate].value

    # 上書きではなく新規ファイルとして保存
    wb_formula.save(output_filepath)

使い方

replace_formula_with_value("元ファイル.xlsx", "数式を値に置換済みファイル.xlsx")

注意点

  • 元ファイルはExcelなどで開いて再計算し、保存したファイルである必要があります。そうしないと計算結果が入っていません。
  • openpyxlはExcelの高度な計算式の計算はできません。計算した値をExcel側で保持していることが前提。
  • 大きなファイルでは処理に時間がかかることがあります。

もし VBAやExcel自体を操作できる環境(Windows + Excelインストール済み)であれば、pywin32のCOM操作を使ってExcelで計算させて値を固定化する方法もあります。必要があればお知らせください。

user:

ありがとうございました。以上の内容をブログに記録したいので、タイトルを提案してください。

assistant:

以下のようなブログタイトル案はいかがでしょうか?

  • 「PythonでExcelの数式を計算結果の値に置き換えて保存する方法」
  • 「openpyxlで複数シートのExcelファイル内の数式を値に変換する手順」
  • 「Excel関数を具体的な値に!Pythonで数式を値化して複数シート対応する方法」
  • 「Python×openpyxlでExcelの数式セルを計算結果の値に一括置換する」
  • 「複数シート対応:PythonでExcelの数式を計算済み結果に置き換える方法まとめ」

用途やターゲットに合わせてお好きなものをお使いください!
もしもっとカジュアルや専門的なニュアンスが良ければお伝えください。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?