【初心者向け】openpyxlの結合セルの扱い方|よくある落とし穴と対処法を解説

結合されたセルから値を取得する際の注意点

openpyxlで結合されたセルから値を取得する場合、つまずきやすいポイントがあります。
それは、結合セルの値は「左上のセル」にしか存在しないという仕様です。

値が入っているのは左上セルだけ

例えば、A1〜C1を結合した場合、実際に値が入るのはA1セルのみです。B1やC1にはデータが存在せず、アクセスしてもNoneが返ってきます。

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# A1〜C1を結合し、A1に値を設定
ws.merge_cells('A1:C1')
ws['A1'] = "見出し"

# 結合セルの各セルの値を確認
print(ws['A1'].value)  # → "見出し"
print(ws['B1'].value)  # → None
print(ws['C1'].value)  # → None

isinstance()でセルが結合セルかどうかを判定する方法

結合セルの判定には isinstance() を使う

openpyxlでは、結合されたセルの左上以外は MergedCellという特別なクラスになります。これを利用して、isinstance()関数で結合セルかどうかを簡単に判定できます。

from openpyxl import Workbook
from openpyxl.cell.cell import MergedCell

wb = Workbook()
ws = wb.active

# セルを結合
ws.merge_cells('A1:C1')
ws['A1'] = "見出し"

# セルの型を判定
print(isinstance(ws['A1'], MergedCell))  # → False(左上セルは通常のセル)
print(isinstance(ws['B1'], MergedCell))  # → True(B1は結合セルの一部)

結合されたセルの範囲を取得する方法

結合セルの範囲は merged_cells.ranges で取得

openpyxlのWorksheetオブジェクトには、すでに結合されているセル範囲をまとめて保持しているmerged_cells.rangesというプロパティがあります。このリストをループすることで、各結合セルの開始位置や終了位置が取得可能です。

from openpyxl import Workbook

# ワークブックとワークシートを作成
wb = Workbook()
ws = wb.active

# セルを結合
ws.merge_cells('A1:C1')
ws.merge_cells('B2:D2')

# 結合セルの範囲を取得
for merged_range in ws.merged_cells.ranges:
    print(f"結合セル範囲: {merged_range}")

出力例

結合セル範囲: A1:C1
結合セル範囲: B2:D2

公式ドキュメント

openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files — openpyxl 3.1.3 documentation

関連記事

【初心者向け】openpyxlでセルを結合・解除する方法|罫線の注意点も解説
openpyxlでセルを結合する方法PythonでExcelを操作できるライブラリ openpyxl。中でも、見出しや表のレイアウトに便利なのがセルの結合機能です。この記事では、merge_cells()によるセルの結合方法と、罫線の注意点...

コメント

タイトルとURLをコピーしました