【Python】PatternFillオブジェクト、Alignmentオブジェクトを使ってセルの色と文字の配置を調整する。

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、セルの色と文字の配置に関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/dea378dd-0662-8b5c-a560-bce97a5ce6b1.png)

上記のようなブック「商品リストを」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/0487b9f6-7cc2-3a41-b800-183425d83a3b.png)

この様な表に変更したいです。

# PatternFillオブジェクト

```python
cell.fill = PatternFill(fgColor='RGB形式の色',
                        bgColor='RGB形式の色',
                        fill_type='パターンの種類')
```

セルの塗りつぶしを設定するには、PatternFillオブジェクトを使用し
そちらをセルのfill属性に代入することで、塗りつぶせるのですが
どうにも「fgColor」「bgColor」「fill_type」の各引数がすんなり頭に入ってこず
色々試した結果このようなコードを一旦書いてみました。

### お試し塗りつぶしコード

```python
from openpyxl import load_workbook
from openpyxl.styles import Alignment, PatternFill

wb = load_workbook('商品リスト.xlsx')
ws = wb.active

# 各種塗りつぶし方法。
darkH_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='darkHorizontal')

lightH_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='lightHorizontal')

darkV_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='darkVertical')

lightV_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='lightVertical')

darkT_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='darkTrellis')

lightT_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='lightTrellis')

darkG_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='darkGray')

lightG_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='lightGray')

solid_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='solid')

g125_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='gray125')

g0625_fill = PatternFill(
    fgColor='ff0000', bgColor='ffff00', fill_type='gray0625')

# 各種文字の配置
center_alignment = Alignment(horizontal='center', vertical='center')
left_top_alignment = Alignment(horizontal='left', vertical='top')
right_bottom_alignment = Alignment(horizontal='right', vertical='bottom')

# 実際に塗りつぶしてみる。
for row in ws['B2:G2']:
    for cell in row:
        cell.fill = darkH_fill
        cell.alignment = center_alignment

for row in ws['B3:G3']:
    for cell in row:
        cell.fill = lightH_fill
        cell.alignment = left_top_alignment

for row in ws['B4:G4']:
    for cell in row:
        cell.fill = darkV_fill
        cell.alignment = right_bottom_alignment

for row in ws['B5:G5']:
    for cell in row:
        cell.fill = lightV_fill
        cell.alignment = center_alignment

for row in ws['B6:G6']:
    for cell in row:
        cell.fill = lightT_fill
        cell.alignment = center_alignment

for row in ws['B7:G7']:
    for cell in row:
        cell.fill = lightT_fill
        cell.alignment = center_alignment

for row in ws['B8:G8']:
    for cell in row:
        cell.fill = darkG_fill
        cell.alignment = center_alignment

for row in ws['B9:G9']:
    for cell in row:
        cell.fill = lightG_fill
        cell.alignment = center_alignment

for row in ws['B10:G10']:
    for cell in row:
        cell.fill = solid_fill
        cell.alignment = center_alignment

for row in ws['B11:G11']:
    for cell in row:
        cell.fill = g125_fill
        cell.alignment = center_alignment

for row in ws['B12:G12']:
    for cell in row:
        cell.fill = g0625_fill
        cell.alignment = center_alignment

wb.save('商品リスト_見出変更.xlsx')
```

### お試し塗りつぶしコードの結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/84d5a1ac-334b-dcab-15a4-a463df14394c.png)

結果はこうなりました。

### 塗りつぶしパターンのまとめ
「bgColor」で設定した色は背景の色と考えて・・・

- darkHorizontal：「fgColor」で設定した色の太い横線。
- lightHorizontal：「fgColor」で設定した色の細い横線。
- darkVertical：「fgColor」で設定した色の太い縦線。
- lightVertical：「fgColor」で設定した色の細い縦線。
- darkTrellis：「fgColor」で設定した色の細い交差線。
- lightTrellis：「darkTrellis」との差はない。
- darkGray：「fgColor」で設定した色の太い点線。
- lightGray：「fgColor」で設定した色の細い点線。
- solid：「fgColor」で設定した色で塗りつぶし。「bgColor」も「fgColor」と同じにした方が良い。
- gray125：「fgColor」で設定した色の小さな点の水玉模様。間隔は狭い。
- gray0625：「fgColor」で設定した色の小さな点の水玉模様。間隔は広い。

という結果になりました。
他にもパターンはあると思いますが、正直なところ

「塗りつぶし（solid）以外に使うところあるのかな？」

と言う、内なるツッコミによって調べるのを諦めました。

# Alignmentオブジェクト

```python
cell.alignment = Alignment(horizontal='横位置',
                           vertical='縦位置',
                           wrap_text=「折返して全体表示」にする時はTrue,
                           shrink_to_fit=「縮小して全体表示」にする時はTrue)
```

horizontalの引数に記述するのは・・・

- left：左詰め
- center：中央ぞろえ
- right：右詰め

verticalの引数に記述するのは・・・

- top：上詰め
- center：中央ぞろえ
- bottom：下詰め

# 最終的なコード

```python
from openpyxl import load_workbook
from openpyxl.styles import Alignment, PatternFill

wb = load_workbook('商品リスト.xlsx')
ws = wb.active

# 塗りつぶし方法。
gray_fill = PatternFill(
    fgColor='C6E0B4', fill_type='solid')

# 文字の配置
center_alignment = Alignment(horizontal='center', vertical='center')

# 実際に塗りつぶしてみる。
for row in ws['B2:G2']:
    for cell in row:
        cell.fill = gray_fill
        cell.alignment = center_alignment
wb.save('商品リスト_見出変更.xlsx')
```

今回パターンを調べるのにえらく時間がかかってしまいました。
「調べて試してまた調べる」のサイクルって楽しいですよね。
だいたい途中で脱線してしまって本来の目的を忘れてしまうのですが・・・。

もう少し「本線」を見据えて勉強していくようにしま・・・したいですね。