pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、値の転記に関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。
以下のような
〇〇市、△△市・・・と地区ごとの平均時給の台帳を作りたいとします。
平均時給は計算式で表しています。
余談:「#DIV/0!」対策
ちなみになのですが、こちらのように何も入力していなかったりすると「#DIV/0!」と表示されてしまうことがないでしょうか。
この表示、「0」で割ってますよって意味でして地味に嫌いです・・・。
対策としては
=IFERROR(計算式,"")
このような感じで、表示が消えてくれます。個人的にすっきりです!
cell.value属性
cell(行番号,列番号).value
cell(1,1) == ws['A1']
cell(5,10) == ws['J5']
1始まりでセルの番地を設定できます。
繰り返し処理で、行や列をずらしていくときに重宝してくれそうです。
lord_workbook関数で、data_only=Trueを指定する。
今回の問題は、数式ではなく計算結果の値を読み込みたいことなので
lord_workbook(ファイル, data_only=True)
上記のように記述してあげると計算結果の値を読み込んでくれます。
ただ、そのままWorkbook.saveとかで保存してしまうと数式も消してしまうので
別のブックに転記するなりして、上書きしないように注意が必要です。
cell.number_formatで書式設定をコピー
こちらは地味なところなのですが、時給の平均値なのでセルの書式設定も通貨です。
やっぱりここは書式設定もコピーしたいですね!
こちらはセルのnumber_fomat属性で取得できます。
cell.number_format
これらをふまえて、記述してみると
from pathlib import Path
from openpyxl import load_workbook, Workbook
wb_new = Workbook()
ws_new = wb_new.active
ws_new.title = '台帳'
ws_new.column_dimensions['A'].width = 20
path = Path('../地区別平均時給')
for i, file in enumerate(path.glob('*.xlsx')):
wb = load_workbook(file, data_only=True)
ws = wb['チェックリスト']
row_no = i + 1
# セルD23を転記
ws_new.cell(row_no, 1).value = ws['D23'].value
# セルL23を転記
ws_new.cell(row_no, 2).value = ws['L23'].value
# セルL23の表示設定をコピー
ws_new.cell(row_no, 2).number_format = ws['L23'].number_format
wb_new.save('平均時給一覧.xlsx')
となりました。
個人的には大事なところを勉強できたとウハウハしています。