【Python】openpyxlでExcelを操作する ② -セルの上書き、結合

前回はopenpyxlを使ったExcelファイルの入出力について紹介しました。今回は指定のセルに値を上書きする方法と、セルを結合する方法を紹介します。

プログラムで扱うExcelファイルのセル結合はあまりしたくありませんが、こういうこともできますということで。もちろん、そういったニーズもあると思いますし。

事前準備

今回は以下のExcelファイルを使用します。

Sample.xlsx

ファイルを読み込むまでのコードは以下の通りです。

import openpyxl

filePath = "Sample.xlsx"

#既存のExcelファイルを読み込む
wb = openpyxl.load_workbook(filePath)

ws = wb["シート1"]

きちんと読み込んでいるか確認するために各行をprint出力してみます。

for row in ws["A1:D8"]:
    print([cell.value for cell in row])

>>
['A', 1, 'イヌ', None]
['B', 2, 'ネコ', None]
['C', 3, 'サル', None]
['D', 4, 'キジ', None]
['E', 5, 'ウマ', None]
['F', 6, 'ロバ', None]
['G', 7, 'ペンギン', None]
[None, None, None, None]

セルの値を上書き

単一セルの上書き

単一のセルの値を上書きするときが、そのセルを指定して値を代入します。以下では、A1セルの値を”ZZZ”に上書きします。

#セルの値の上書き
ws['A1'].value = "ZZZ"

wb.save("Sample2.xlsx")
Sample.xlsx

複数セルの上書き

1つ1つのセルを指定して上書きなんてじれったい!という場合は、for文を使うことで複数セルにまとめて上書きすることができます(原理は一緒なんですけどね)。

以下ではB2~D4までのセルの値を100から1ずつ足して上書きしていきます。

num = 100
#複数セルの上書き
for row in ws["B2:D4"]:
    for cell in row:
        cell.value = num
        num += 1

1つ目のfor文では行方向、2つのfor文で列方向に繰り返します。上書き範囲の指定はスライシングで行います。B2:D4で図の範囲が上書きされるので、Excelファイルで範囲を選択したときの左上:右下を指定するイメージです。

この方法を応用すれば、特定列をまとめて上書き等できるので便利です。

セル結合

セルの結合にはws.merge_cells()を用います。結合範囲は先ほどのようにスライシングで指定します。

ws.merge_cells(範囲の左上:範囲の右下)

#セル結合
ws.merge_cells("A1:D1")
wb.save("Sample2.xlsx")

このようにセルが結合されます。もちろん、結合したセルのうち左端以外の値は消去されます。

セル結合の解除

セルの結合を解除する場合はws.unmerge_cells()を用います。

ws.unmerge_cells("A1:D1")

このとき、結合されているセルの範囲を正確に指定しないとエラーが出てしまいます。

たとえば、A1:D1でセルを結合している場合、以下のコードはエラーになります。

ws.unmerge_cells("A1:C1")

>>
ValueError: list.remove(x): x not in list

まとめ

openpyxlでセルの値を上書きする方法とセルを結合する方法を紹介しました。

特に値の書き換えはPythonでExcelを扱う際によく使うと思います。処理のやり方は色々ありますが、よりシンプルなコードになればそれに越したことはないです。

Excelの自動化に役立てば幸いです^^

ではでは👋