本記事ついて
本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。
参考資料
https://www.udemy.com/course/python-kaizen/learn/lecture/26849736#overview
前回の続きになりますので気になる方はこちら
https://qiita.com/kou1121/items/9acbcc3834b4648300d5
環境
以前はCloud9を使用していましたが、今回はExcelのため変えることにしました
Windows 10
Jupyter Notebook
そのため構文に少し違いがあります。
気を付けてください
目的
Excelファイルをほかのファイルにすべて一気に転記できるようになりたいと思います。
一つづつの動作を確認しながらやっていきます。
違うファイルに転記をする
ファイル情報を取得
wb_matome = openpyxl.load_workbook("出社在宅集計表_まとめ.xlsx")
wb_jinji = openpyxl.load_workbook("出社在宅集計表_人事部.xlsx")
シートを取得
ws_matome = wb_matome["4月"]
ws_jinji = wb_jinji["4月"]
まとめのセルに、人事部のセルをコピー
ws_matome.cell(row=2,column=3).value=ws_jinji.cell(row=2,column=2).value
セーブする
wb_matome.save("出社在宅集計表_まとめ2.xlsx")
すべての行をコピーしてみる
for文で回数を回します。
for i in range(30):
ws_matome.cell(row=2,column=3+i).value=ws_jinji.cell(row=2,column=2+i).value
そしてセーブしてシートを確認
では一気にすべてのセルをコピーしてセーブ
for i in range(30):
ws_matome.cell(row=2,column=3+i).value=ws_jinji.cell(row=2,column=2+i).value
ws_matome.cell(row=3,column=3+i).value=ws_jinji.cell(row=3,column=2+i).value
wb_matome.save("出社在宅集計表_まとめ2.xlsx")
各シートがあるのですべてをコピー
まずは単純に
wb_matome = openpyxl.load_workbook("出社在宅集計表_まとめ.xlsx")
wb_jinji = openpyxl.load_workbook("出社在宅集計表_人事部.xlsx")
ws_matome_4 = wb_matome["4月"]
ws_jinji_4 = wb_jinji["4月"]
for i in range(30):
ws_matome_4 .cell(row=2,column=3+i).value=ws_jinji_4.cell(row=2,column=2+i).value
ws_matome_4 .cell(row=3,column=3+i).value=ws_jinji_4.cell(row=3,column=2+i).value
ws_matome_5 = wb_matome["5月"]
ws_jinji_5 = wb_jinji["5月"]
for i in range(31):
ws_matome_5.cell(row=2,column=3+i).value=ws_jinji_5.cell(row=2,column=2+i).value
ws_matome_5.cell(row=3,column=3+i).value=ws_jinji_5.cell(row=3,column=2+i).value
ws_matome_6 = wb_matome["6月"]
ws_jinji_6 = wb_jinji["6月"]
for i in range(30):
ws_matome_6.cell(row=2,column=3+i).value=ws_jinji_6.cell(row=2,column=2+i).value
ws_matome_6.cell(row=3,column=3+i).value=ws_jinji_6.cell(row=3,column=2+i).value
wb_matome.save("出社在宅集計表_まとめ3.xlsx")
このように書いても良いですが見ずらいので整理します。
ポイントは
・読み込むシート名が変わるのでその名前をリストで保持
・range中の数字が変わってしまうので
Excelの列数を取ればいい
シート情報が入っている変数.max_column
で列の最期の列数の値を取ってこれる
ただ最初は一番最初に文字列があるためそれを引いた数にする。
そしてできたのが
wb_matome = openpyxl.load_workbook("出社在宅集計表_まとめ.xlsx")
wb_jinji = openpyxl.load_workbook("出社在宅集計表_人事部.xlsx")
month_list=["4月","5月","6月"]
for month in month_list:
ws_matome= wb_matome[month]
ws_jinji= wb_jinji[month]
for i in range( ws_jinji.max_column-1):
ws_matome.cell(row=2,column=3+i).value=ws_jinji.cell(row=2,column=2+i).value
ws_matome.cell(row=3,column=3+i).value=ws_jinji.cell(row=3,column=2+i).value
wb_matome.save("出社在宅集計表_まとめ4.xlsx")
各部署のファイルもコピー
ポイントとは
・1つ目は
出社在宅集計表_人事部.xlsx
出社在宅集計表_企画部.xlsx
出社在宅集計表_営業部.xlsx
となっているため
違う部分をリスト化すればよい
・2つ目は
row(行)の部分を変えないといけない
if文を使用する
と言うことで
import openpyxl
wb_matome = openpyxl.load_workbook("出社在宅集計表_まとめ.xlsx")
month_list=["4月","5月","6月"]
busyo_list=["人事部","企画部","営業部"]
for busyo in busyo_list:
wb_kakubu = openpyxl.load_workbook("出社在宅集計表_{}.xlsx".format(busyo))
if busyo=="人事部":
syussya_row=2
zaitaku_row=3
if busyo=="企画部":
syussya_row=4
zaitaku_row=5
if busyo=="営業部":
syussya_row=6
zaitaku_row=7
for month in month_list:
ws_matome= wb_matome[month]
ws_kakubu= wb_kakubu[month]
for i in range( ws_kakubu.max_column-1):
ws_matome.cell(row=syussya_row,column=3+i).value=ws_kakubu.cell(row=2,column=2+i).value
ws_matome.cell(row=zaitaku_row,column=3+i).value=ws_kakubu.cell(row=3,column=2+i).value
wb_matome.save("出社在宅集計表_まとめ5.xlsx")
汎用性を高くする
人事部などをセルの中身がかわっても対応できるようにする。
ポイントは
・最大行数を取得
シート情報が入っている変数.max_row
・if文で1列目の各行で入っている部署がその値と同じかを判定する
ことで完成形を
import openpyxl
wb_matome = openpyxl.load_workbook("出社在宅集計表_まとめ.xlsx")
month_list=["4月","5月","6月"]
busyo_list=["人事部","企画部","営業部"]
for busyo in busyo_list:
wb_kakubu = openpyxl.load_workbook("出社在宅集計表_{}.xlsx".format(busyo))
for month in month_list:
ws_matome= wb_matome[month]
ws_kakubu= wb_kakubu[month]
for j in range(1,ws_matome.max_row+1):
if ws_matome.cell(row=j, column=1).value==busyo:
syussya_row=j
zaitaku_row=j+1
for i in range( ws_kakubu.max_column-1):
ws_matome.cell(row=syussya_row,column=3+i).value=ws_kakubu.cell(row=2,column=2+i).value
ws_matome.cell(row=zaitaku_row,column=3+i).value=ws_kakubu.cell(row=3,column=2+i).value
wb_matome.save("出社在宅集計表_まとめ6.xlsx")