質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

380閲覧

python openpyxlでエクセル関数を入力し 関数で計算した"値"を取り出したい。

fl00

総合スコア9

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2023/05/26 10:35

数値のみが入ったエクセルがあり、
①python openpyxlでエクセル関数を入力し
②関数で計算した"値"を取り出したい。
(①を直接エクセルで実施しないのは、大量にエクセルがありPythonのglobで一括処理をしたいため)
値を取り出したいが、関数が取り出されてしまいます。Google検索したところ「data_only=True」でできるとありましたが、Trueでも数式が出力されます。
コードとサンプルファイルを添付いたします。
print(SUM_value) から10が出力されるにはどのようにすればよいでしょうか。
現状SUM(A1:A4)が出力されます。

一方、sample02のエクセルは10と計算されています。
別方法として「A5をコピーし、A5に値を貼り付け」のエクセル操作をopenpyxlでできれば解決できるとも思います。そのようなサンプルコードを教授いただけると助かります。
--コード--
import openpyxl as px
wb = px.load_workbook('sample.xlsx',data_only=True)
ws = wb['Sheet1']
ws['A5'].value='=SUM(A1:A4)'
wb.save('sample02.xlsx')
SUM_value=ws['A5'].value
print(SUM_value)

■sample.xlsxの中身
A1=1
A2=2
A3=3
A4=4

tatsu99👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2023/05/26 23:37

>一方、sample02のエクセルは10と計算されています。 これを、確認した方法は、このファイルをExcelで開いて目視で確認かと思います。 https://buzz-server.com/tech/python-openpyxl-no-value-cause/ を読むと、以下のようなことが書いてあります。 計算式の通りに実際に計算を行うのは、Excelの機能です、openpyxlで計算を行うことはできません。 従って、計算式を実際に計算させたいなら、python経由でexecを起動し、excelで自動計算を行い、そのファイルを保存し、その後、そのファイルをopenopxlで読み込む必要があります。 上記のような面倒なことをするなら、 1案:計算式を設定せずに、計算式と同じことをopenpyxlで行う。 2案:VBAで全て行う。(VBAでもpythonのglobと同じことを実現することは可能です) のどちらかになるかと思います。
fl00

2023/05/28 06:54

tatsu99さん、bsdfanさん ご回答、有難うございます。確かに作成されたエクセルを一回開き、閉じたうえで px.load_workbookから読み込むと10が出力されました。 踏まえてpython内で解決し、Excelの保存も行いたいためsubprocessで解決できないか試みています。 import openpyxl as px import subprocess import time wb = px.load_workbook('sample.xlsx',data_only=True) ws = wb['Sheet1'] ws['A5'].value='=SUM(A1:A4)' wb.save('sample02.xlsx') expro=subprocess.Popen([r'C:\Program Files (x86)\〇〇(プログラムの場所)\EXCEL.EXE', r'C:\Users△△(ファイルの場所)\Sample02.xlsx']) time.sleep(1) expro.kill() time.sleep(1) wb = px.load_workbook('sample02.xlsx',data_only=True) ws = wb['Sheet1'] SUM_value=ws['A5'].value print(SUM_value) 上記ですとエクセルプログラムを開いた後に閉じているのですが、上書き保存はされていないようです。killのせいかおもいます。killの前に上書き保存のコードを入れたいのですが、良いコードが分かりません。 ご存じの方、教えていただけますでしょうか。
tatsu99

2023/05/28 09:36

pythonから直接excelを起動すると、その後、excelにそのファイルを保存させることができません。 pythonからはvbscriptを起動し、そのスクリプトからexcelを操作するのが良いかと思います。 サンプルを回答欄に書きます。
bsdfan

2023/05/28 10:43

excelを使うことが許されるなら、pywin32(win32com)とかxlwingsをつかうのもいいと思います。
tatsu99

2023/05/28 11:34 編集

xlwingsを使ってみました。かなり、コンパクトにスクリプトがまとまりますね。 回答欄にvbscriptを使う方法を提示しましたが、xlwingsを使う方法の方が良いかと思います。 xlwingsのみで、スクリプトが完結します。
guest

回答1

0

ベストアンサー

 まず、 vbscriptを作成します。
このスクリプトは、
1.excel起動の起動
2.パラメータで指定されたファイル(sample02.xlsxのフルパス)をexcelに読み込ませる
3.上記ファイルを保存する
4.excelの終了
を行います。
このファイルをsample99.vbsという名前で保存します。

VBSCRIPT

1Dim oParam 2Set oParam = WScript.Arguments 3if oParam.Count = 0 then WScript.Quit 9 4Dim fpath 5fpath = oParam(0) 6'msgbox(fpath) '確認用 7Set Obj = WScript.CreateObject("Excel.Application") 8Obj.Visible = True 'Falseにすると表示されない 9set wb = Obj.Workbooks.Open(fpath) 10wb.save 11wb.close 12Obj.Quit 13

次にpython側です。

python3

1import os 2import subprocess 3import openpyxl as px 4wb = px.load_workbook('sample.xlsx',data_only=True) 5ws = wb['Sheet1'] 6ws['A5'].value='=SUM(A1:A4)' 7 8path = os.getcwd() 9fname = path + "\\" + 'sample02.xlsx' 10print(fname) #確認用 11wb.save(fname) 12args = "cscript D:\\goo\\vbs\\sample99.vbs " + fname 13result = subprocess.run(args) 14 15print("------------") 16wb = px.load_workbook('sample02.xlsx',data_only=True) 17ws = wb['Sheet1'] 18SUM_value=ws['A5'].value 19print(SUM_value)

実行時の注意事項
sample99.vbsは、こちらの環境ではD:\goo\vbsのフォルダに格納しました。
あなたの環境に合わせて適切に設定してください。
sample99.vbs中の
Obj.Visible = Trueは、excelの画面の表示です。FalseにするとExcelが表示されなくなります。

実行結果
D:\goo\python\test_excel>py test.py
D:\goo\python\test_excel\sample02.xlsx
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.


10

投稿2023/05/28 09:47

tatsu99

総合スコア5487

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fl00

2023/05/28 16:28

tatsu99さん、回答いただいた皆さん 有難うございました。 こちらのコードで解決できること確認しました。 大変助かりました。業務が効率的に進みそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問