PythonでExcelを読む!書く!第一歩への再挑戦

こんにちは、挑戦するエンジニア のり ですよ。
事務処理にExcelを使われている方、多いのではないでしょうか?
Excelを使った作業を少しでも自動化できると、うれしいですよね。
今回は、前回うまくいかなかったExcelの読み書きに、再挑戦してみたいと思います。

目次

目次

1.前回のおさらいと問題点
2.問題点の対応方針
3.load_workbookの引数による動作の違い
4.Excelファイルにデータを書いた結果
5.まとめ

1.前回のおさらいと問題点

まず、前回のおさらいと問題点の確認です。
前回、openpyxlを使用して、Excelファイルを読み書きをしました。
load_workbook関数を使い、Excelファイルからデータ取り出すとき
引数にdata_only=trueを設定することで式の計算後の値を取得しました。

Visual Studio Codeのターミナル実行結果(読み込み)

しかし、引数に data_only=true を設定して開いたワークブックに、
値を入れて保存すると、式が入っていたセルも値になって保存されてしまいました。
load_workbook関数は、引数に data_only=true を設定して読み込み、それをsaveしてしまうと
式が値に変わってしまうのです。
これでは、せっかく作った資料も台無しです。

編集後のExcel

今回はこの問題を回避するべく、挑戦してみたいと思います。

2.問題点の対応方針

今回、問題点の対応方針を次のように考えてみました。

【対応方針】
 Excelファイルを読み込むオブジェクトと、書き込むオブジェクトを別にする。

つまり、読み込み用のオブジェクトは式の計算結果の値が取れる data_only=true を設定して作成し、
書き込み用のオブジェクトは式を壊さないよう data_only=true の設定をせずに作成するのです。
作成してみたプログラムの例は、次の通りです。

読み込みと書き込みを別オブジェクトにしたプログラムの例

念のため、読み込み用のオブジェクトを開くときは read_only=True (読み取り専用)を
設定することで、間違ってExcelファイルを壊さないようにしています。

次は、作成したプログラムを実行してみます。

3.load_workbookの引数による動作の違い

まず、プログラムを実行する前に、更新するExcelファイルを確認します。

プログラム実行前のExcelファイル

実行は、Visual Studio Codeのエクスプローラーで拡張子「.py」のファイルを右クリック。
表示されたメニューから[ターミナルでPythonファイルを実行]を選択します。

Pythonプログラムの実行結果

想定通り、読み込み時の引数に data_only=true を設定したオブジェクトは、
セルA5の値を計算後の値「70」で読み込んでいます。
一方、読み込み時の引数に data_only=true を設定しなかったオブジェクトは、
セルA5の値を計算前の値「=SUM(A1:A4)」で読み込んでいます。

次は、書き込みをしたExcelファイルを見てみましょう。

4.Excelファイルにデータを書いた結果

Pythonのプログラムを実行して、データを書き込んだExcelファイルは次のようになりました。
まず、セルB5です。取得した値「70」が書き込まれています。

書き込みをしたExcelファイル(セルB5)

続いて、セルA5です。元の式「=SUM(A1:A4)」は、変更されずにそのままです。

書き込みをしたExcelファイル(セルA5)

これで、狙いどおり式を壊さず、値を書き込むことが出来ました。

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()

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次