こんにちは、挑戦するエンジニア のり ですよ。
事務処理にExcelを使われている方、多いのではないでしょうか?
Excelを使った作業を少しでも自動化できると、うれしいですよね。
今回は、前回うまくいかなかったExcelの読み書きに、再挑戦してみたいと思います。
目次
1.前回のおさらいと問題点
2.問題点の対応方針
3.load_workbookの引数による動作の違い
4.Excelファイルにデータを書いた結果
5.まとめ
1.前回のおさらいと問題点
まず、前回のおさらいと問題点の確認です。
前回、openpyxlを使用して、Excelファイルを読み書きをしました。
load_workbook関数を使い、Excelファイルからデータ取り出すとき
引数にdata_only=trueを設定することで式の計算後の値を取得しました。
しかし、引数に data_only=true を設定して開いたワークブックに、
値を入れて保存すると、式が入っていたセルも値になって保存されてしまいました。
load_workbook関数は、引数に data_only=true を設定して読み込み、それをsaveしてしまうと
式が値に変わってしまうのです。これでは、せっかく作った資料も台無しです。
今回はこの問題を回避するべく、挑戦してみたいと思います。
2.問題点の対応方針
今回、問題点の対応方針を次のように考えてみました。
【対応方針】
Excelファイルを読み込むオブジェクトと、書き込むオブジェクトを別にする。
つまり、読み込み用のオブジェクトは式の計算結果の値が取れる data_only=true を設定して作成し、
書き込み用のオブジェクトは式を壊さないよう data_only=true の設定をせずに作成するのです。
作成してみたプログラムの例は、次の通りです。
念のため、読み込み用のオブジェクトを開くときは read_only=True (読み取り専用)を
設定することで、間違ってExcelファイルを壊さないようにしています。
次は、作成したプログラムを実行してみます。
3.load_workbookの引数による動作の違い
まず、プログラムを実行する前に、更新するExcelファイルを確認します。
実行は、Visual Studio Codeのエクスプローラーで拡張子「.py」のファイルを右クリック。
表示されたメニューから[ターミナルでPythonファイルを実行]を選択します。
想定通り、読み込み時の引数に data_only=true を設定したオブジェクトは、
セルA5の値を計算後の値「70」で読み込んでいます。
一方、読み込み時の引数に data_only=true を設定しなかったオブジェクトは、
セルA5の値を計算前の値「=SUM(A1:A4)」で読み込んでいます。
次は、書き込みをしたExcelファイルを見てみましょう。
4.Excelファイルにデータを書いた結果
Pythonのプログラムを実行して、データを書き込んだExcelファイルは次のようになりました。
まず、セルB5です。取得した値「70」が書き込まれています。
続いて、セルA5です。元の式「=SUM(A1:A4)」は、変更されずにそのままです。
これで、狙いどおり式を壊さず、値を書き込むことが出来ました。
5.まとめ
さて、今回のおさらいです。
今回の挑戦は、前回の挑戦で直面した問題点を回避する挑戦でした。
ライブラリ「openpyxl」を使用して、Excelファイルを読み書きするときに、
式が値に変わってしまう問題点です。
対策として、load_workbook関数の引数「data_only」に着目し、
読み込みと書き込みでオブジェクトを分けることで、
計算結果を読み込むことと、計算式を壊さず値を書き込むことを両立させました。
今回の挑戦では、openpyxlを使ったプログラムの問題点を回避できました。
しかし、openpyxlを使用してExcelを操るのは、いろいろと問題点がありそうです・・・。
その点については、またの機会にしたいと思います。
それでは、今日の挑戦はこのへんで。
またのお越しをお待ちしております。
今回のプログラムソース
# ライブラリをインポートする
import openpyxl
# Excelファイル名(フルパス)
FILE_NAME = “c:\Python\dat\worksheet01.xlsx”
# Excelファイル(ワークブック)を開く
rwb = openpyxl.load_workbook(FILE_NAME, read_only=True, data_only=True)
wwb = openpyxl.load_workbook(FILE_NAME)
# 先頭のワークシートを取り出す
rws = rwb.worksheets[0]
wws = wwb.worksheets[0]
# セルから値を取り出して表示します
print (rws[‘A5’].value)
print (wws[‘A5’].value)
# データの編集と保存
wws[‘B5’].value = rws[‘A5’].value
wwb.save(FILE_NAME)
# ワークブックを閉じる
rwb.close()
wwb.close()