pythonのopenpyxlの使い方メモ

pythonでExcel(xlsx)を作成・編集・読み込みができるモジュールである `openpyxl` の使い方メモです。

# OpenPyXLドキュメント

[http://openpyxl.readthedocs.io/en/stable/](http://openpyxl.readthedocs.io/en/stable/)

# Excelファイル作成

## Excelファイルを作成する

空のExcelファイルを作成します。

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    Excelファイル(xlsx)を作るだけ
    `example.xlsx` が実行したカレントにできる
    """
    wb = openpyxl.Workbook()

    # 保存
    wb.save('example.xlsx')
```

## 標準WS名を変更

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    `example.xlsx` に作成するWS名を設定
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `Sheet` だが変更する場合は `title` で変更する
    ws.title = "WorkSheetTitle"

    # 保存
    wb.save('example.xlsx')
```

## 複数WSを作成

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    WorkSheetを複数作成する
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `Sheet` だが変更する場合は `title` で変更する
    ws.title = "WorkSheetTitle"

    # 2つめのWSを定義
    ws2 = wb.create_sheet("NewWorkSheet2")

    # 3つめのWSを定義してポジションを設定する
    # `0` だと一番先頭
    ws3 = wb.create_sheet("NewWorkSheet3", 0)

    # 保存
    wb.save('example.xlsx')
```

## WSタブのカラーを変更

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    WSタブのカラーを変更
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `Sheet` だが変更する場合は `title` で変更する
    ws.title = "WorkSheetTitle"

    # WSのtabカラーを設定する
    ws.sheet_properties.tabColor = "1072BA"

    # 保存
    wb.save('example.xlsx')
```

## セルに値を入れる

### 座標を指定

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    セルに値を入れる
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `Sheet` だが変更する場合は `title` で変更する
    ws.title = "WorkSheetTitle"

    # セルに値を入れる
    ws["A1"] = "HOGE"
    ws["B1"] = "FUGA"

    # 保存
    wb.save('example.xlsx')
```

### 行列表記

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    セルに値を入れる
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `Sheet` だが変更する場合は `title` で変更する
    ws.title = "WorkSheetTitle"

    # 行列表記でセルに値を入れる
    ws.cell(row=4, column=2, value=10)

    # 保存
    wb.save('example.xlsx')
```

### 行列表記2

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    セルに値を入れる
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `sheet` だが変更する場合は `title` で変更する
    ws.title = "worksheettitle"

    # 行列表記でセルに値を入れる
    v = 0
    for i in range(1,10):
        for n in range(1,10):
            ws.cell(row=i, column=n, value=v)
            v += 1

    # 保存
    wb.save('example.xlsx')
```

### 範囲指定

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    セルに値を入れる
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `sheet` だが変更する場合は `title` で変更する
    ws.title = "worksheettitle"

    # 行列表記でセルに値を入れる
    v = 0
    for i in range(1,10):
        for n in range(1,10):
            ws.cell(row=i, column=n, value=v)
            v += 1

    # 保存
    wb.save('example.xlsx')
```

### 行を一度に出力

```python
#!/usr/bin/env python3
import openpyxl

# カラム名
column_title = ["FirstName", "LastName"]

if __name__ == '__main__':
    """
    セルに値を入れる
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `sheet` だが変更する場合は `title` で変更する
    ws.title = "worksheettitle"

    # カラム名と値をセットして順番にセルへ値を入れる
    rows = [
        column_title,
        ["Tarou", "Tanaka"],
        ["Tarou", "Suzuki"],
        ["Tarou", "Uchiayama"],
    ]
    for row in rows:
        ws.append(row)

    # 保存
    wb.save('example.xlsx')
```

### セル内改行

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    セル内の改行
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `Sheet` だが変更する場合は `title` で変更する
    ws.title = "WorkSheetTitle"

    # セル内改行
    ws['A1'] = "A\nB\nC"
    ws['A1'].alignment = openpyxl.styles.Alignment(wrapText=True)

    # 保存
    wb.save('example.xlsx')
```

## セルのスタイル設定

**スタイルドキュメント**

[https://openpyxl.readthedocs.io/en/default/styles.html#cell-styles-and-named-styles](https://openpyxl.readthedocs.io/en/default/styles.html#cell-styles-and-named-styles)

### フォント設定

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    セルのスタイル変更
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `sheet` だが変更する場合は `title` で変更する
    ws.title = "worksheettitle"

    # フォントの設定
    font = openpyxl.styles.Font(
        name = "HGPｺﾞｼｯｸE",
        size = 15,
    )
    a1 = ws["A1"]
    a1.font = font
    a1.value = "TEST"

    # 保存
    wb.save('example.xlsx')
```

### セルの枠線

```python
#!/usr/bin/env python3
import openpyxl
from openpyxl.styles import Border, Side

if __name__ == '__main__':
    """
    セルのスタイル変更
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `sheet` だが変更する場合は `title` で変更する
    ws.title = "worksheettitle"

    # セルの枠線
    border = Border(
        left=Side(
            border_style="thin",
            color="FF0000"
        ),
        right=Side(
            border_style="thin",
            color="FF0000"
        ),
        top=Side(
            border_style="thin",
            color="FF0000"
        ),
        bottom=Side(
            border_style="thin",
            color="FF0000"

        )
    )
    b2 = ws["B2"]
    b2.border = border
    b2.value = "TEST"

    # 保存
    wb.save('example.xlsx')
```

### セルの結合

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    セルのスタイル変更
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `sheet` だが変更する場合は `title` で変更する
    ws.title = "worksheettitle"

    # セルの結合
    ws.merge_cells("A1:E1")
    ws["A1"] = "HOGE"

    # 保存
    wb.save('example.xlsx')
```

### セルの塗りつぶし

```python
#!/usr/bin/env python3
import openpyxl
from openpyxl.styles import PatternFill

if __name__ == '__main__':
    """
    セルのスタイル変更
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `sheet` だが変更する場合は `title` で変更する
    ws.title = "worksheettitle"

    # セルの塗りつぶし
    fill = PatternFill(fill_type='solid',
                       fgColor='FFFF0000')
    b2 = ws["B2"]
    b2.fill = fill
    b2.value = "TEST"

    # 保存
    wb.save('example.xlsx')
```

## ハイパーリンク

```python
#!/usr/bin/env python3
import openpyxl

if __name__ == '__main__':
    """
    セルのスタイル変更
    """
    wb = openpyxl.Workbook()
    ws = wb.active

    # 標準だと `sheet` だが変更する場合は `title` で変更する
    ws.title = "worksheettitle"

    # 2つ目のWSを作成
    ws2 = wb.create_sheet("example")

    # ハイパーリンク設定
    ws["A1"] = "Link"
    ws["A1"].hyperlink = "example.xlsx#example!A1"

    # 保存
    wb.save('example.xlsx')
```

# Excelファイル読込

## Excelファイルを読込む

```python

#!/usr/bin/env python3
from openpyxl import Workbook, load_workbook

wb = load_workbook('./example.xlsx')
ws = wb.active

for row in ws:
    for cell in row:
        print(cell)
```