openpyxlでよく使う操作についてのまとめ

pythonでExcel操作をする際に使用する`openpyxl`でのよく使う操作について備忘録的にまとめました。


# インストール
```shell
pip install openpyxl
```

# ファイル操作

Excelファイルの新規作成
```python
wb = openpyxl.Workbook()
```

Excelファイルの読み込み
```python
wb = openpyxl.load_workbook('input_file.xlsx')
```


Excelファイルの読み込み(数式の計算結果を読み込む場合)
```python
wb = openpyxl.load_workbook("input_file.xlsx", data_only=True)
```


Excelファイルの保存
```python
wb.save('input_file.xlsx')
```

# シートの操作

シートの新規作成
```python
ws = wb.create_sheet(title='hoge')
```

sheetオブジェクトの取得
```python
ws_list = wb.worksheets
# 出力は、sheetオブジェクトのリスト　[<Worksheet "Sheet">]
ws = wb["シート名"]
```

シート名の取得
```python
wb.sheetnames
# 出力はシート名のリスト　['Sheet1', 'Sheet2', 'Sheet3', 'Sheet4']
```

シートの削除 (引数はworksheetオブジェクト)
```python
wb.remove(ws)
```

新規ファイル作成時はデフォルトでシート名Sheetが存在してるので不要な場合は以下で削除。
```python
wb.remove(wb.worksheets[0])
# or
wb.remove(wb["Sheet"])
```

# セルの操作

セルの取得 

アドレス、行列番号で指定(固定値になるのであまり使わない)
```python
# アドレス指定
cell = ws["A1"]
# 
cell = ws.cell(row=1, col=1)
# 引数省略可
cell = ws.cell(1, 1)
```

セルの内容を取得
```python
val = cell.value
```

セルの内容を操作
```python
cell.value = 'hoge'
```

`cell.value`の初期値は`None`

# 行列ごとのセルの操作

行ごとの操作
```python
for row in ws.rows:
	for cell in row:

```

行ごとの操作(範囲指定)
min_row, min_colは1からカウント
```python
for row in ws.iter_rows(min_row=1, min_col=1, max_row=8, max_col=10):
	for cell in row:
```

列ごとの操作
```python
for col in ws.cols:
	for cell in col:

```

列ごとの操作(範囲指定)
```python
for col in ws.iter_cols(min_row=5, min_col=1, max_row=200, max_col=40):
	for cell in col:

```

所感では範囲指定しない操作だと処理の途中で行列操作が終わってしまうことがある。
特に既存のファイルを開いた場合だと、セルに値が存在する部分までしか操作できないため、範囲指定するのがベター。
範囲指定はmaxを指定しないといけないので、途中でbreak処理を入れるなりする。

# セルの配置, 色, 枠線の操作

import
```python
from openpyxl.styles import Alignment, PatternFill
from openpyxl.styles.borders import Border, Side
```

## セルの配置

セルの値の配置を設定
```python
alignment = Alignment(horizontal='横位置', vertical='縦位置')
```
横位置
- left: 左揃え
- center: 中央揃え
- right: 右揃え

縦位置
- bottom: 上揃え
- center: 中央揃え
- right: 下揃え

セルの値を折り返して全体表示する
```python
alignment_whole = Alignment(wrap_text=True)
```
セルの値を縮小して全体表示する
```python
alignment_whole = Alignment(shrink_to_fit =True)
```

セルに配置設定を適用

```python
cell.alignment = alignment_whole
```

## セルの色の操作
```python
light_yellow_fill = PatternFill(fgColor='ffff4d', bgColor='ffff4d', fill_type='solid')
```

詳細設定方法はこちらが分かりやすかった。https://qiita.com/rihu-do/items/3add2ab4bffe600ee300
カラーコードは、こちらのサイトが参考になった。https://www.colordic.org/colorsample



セルに配色設定の適用

```python
cell.fill = light_yellow_fill
```

## セルの枠線の操作


枠線の設定
```python
side = Side(style='thin', color='000000')
border = Border(top=side, bottom=side, left=side, right=side)
```
詳細はこちらが分かりやすい。https://qiita.com/github-nakasho/items/358e5602aeda81c58c81


枠線の適用
```python
cell.border = border
```

値が存在するセルに対して枠線を適用する
```python
def write_border_line(_workbook):
    for _worksheet in _workbook:
        for _row in _worksheet:
            for _cell in _row:
                if _cell.value:
                    _cell.border = border

```



# 参考

ドキュメント
https://openpyxl.readthedocs.io/en/stable/index.html


https://gammasoft.jp/support/how-to-use-openpyxl-for-excel-file/

https://qiita.com/rihu-do/items/3add2ab4bffe600ee300

https://qiita.com/github-nakasho/items/3f861395227e5645cce7

https://qiita.com/github-nakasho/items/358e5602aeda81c58c81


https://www.colordic.org/colorsample