1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

40 代おっさんPythonでExcel操作でほかのファイルにコピーしてみる

Posted at

本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

参考資料

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")
1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?