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

## 本記事ついて

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

## 参考資料

<https://www.udemy.com/course/python-kaizen/learn/lecture/26849736#overview>

前回の続きになりますので気になる方はこちら
<https://qiita.com/kou1121/items/9acbcc3834b4648300d5>

## 環境

以前はCloud9を使用していましたが、今回はExcelのため変えることにしました
Windows 10
Jupyter Notebook
そのため構文に少し違いがあります。
気を付けてください

## 目的

Excelファイルをほかのファイルにすべて一気に転記できるようになりたいと思います。
一つづつの動作を確認しながらやっていきます。

## 違うファイルに転記をする

### ファイル情報を取得

```python
wb_matome = openpyxl.load_workbook("出社在宅集計表_まとめ.xlsx")
wb_jinji = openpyxl.load_workbook("出社在宅集計表_人事部.xlsx")
```

### シートを取得

```python
ws_matome = wb_matome["4月"]
ws_jinji = wb_jinji["4月"]
```

### まとめのセルに、人事部のセルをコピー

```python
ws_matome.cell(row=2,column=3).value=ws_jinji.cell(row=2,column=2).value
```

### セーブする

```python
wb_matome.save("出社在宅集計表_まとめ2.xlsx")
```

### すべての行をコピーしてみる

for文で回数を回します。

```python
for i in range(30):
    ws_matome.cell(row=2,column=3+i).value=ws_jinji.cell(row=2,column=2+i).value
```

そしてセーブしてシートを確認

では一気にすべてのセルをコピーしてセーブ

```python
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")
```

### 各シートがあるのですべてをコピー

まずは単純に

```python
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の列数を取ればいい

```python
シート情報が入っている変数.max_column
```

で列の最期の列数の値を取ってこれる
ただ最初は一番最初に文字列があるためそれを引いた数にする。

そしてできたのが

```python
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文を使用する

と言うことで

```python
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")
```

### 汎用性を高くする

人事部などをセルの中身がかわっても対応できるようにする。

ポイントは
・最大行数を取得

```python
シート情報が入っている変数.max_row
```

・if文で1列目の各行で入っている部署がその値と同じかを判定する

ことで完成形を

```python
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")
```