Python openpyxl 셀 병합, 셀 나누기

Python에서 openpyxl을 이용해서 데이터 작업을 하다보면 셀 병합, 그리고 반대로 병합한 셀 나누기 작업을 해야 하는 경우가 있습니다. 이번엔 Python openpyxl 셀 병합, 셀 병합 해제 방법을 살펴보겠습니다.

Python openpyxl 셀 병합 방법

셀을 병합할 때에는 워크시트에서 merge_cells 메서드를 사용합니다. 파라미터는 셀 위치를 범위(예, A1:C2)로 설정해 주면 됩니다. 병합된 셀에 접근할 때에는 가장 첫 셀의 주소로 접근하면 됩니다.

from openpyxl import Workbook

# 워크북과 워크시트 생성
wb = Workbook()
ws = wb.active

# 셀 병합
ws.merge_cells('A1:C2')

# 병합된 셀에 문자열 입력
ws['A1'] = "병합된 셀"

# 워크북 저장
wb.save("merged_cells.xlsx")
Python

스프레드 시트 파일을 열어보면 아래 그림과 같습니다. 병합한 셀을 선택하면 A1:C2라고 나오고, 코드에서 입력한 문자열도 잘 들어가 있습니다.

그림 1. openpyxl 셀 병합 결과
그림 1. openpyxl 셀 병합 결과

병합하는 방법을 확인했으니, 이번에는 반대로 셀 병합을 해제하는 방법을 살펴보겠습니다.

병합할 셀에 값이 있는 경우

병합할 셀에 값이 있는 경우에는 첫 셀의 값이 병합된 셀에 채워지므로, 혹시 그 외의 셀에 중요한 값이 있다면 꼭 처리한 후 병합하기 바랍니다.

Python openpyxl 셀 나누기(병합 해제) 방법

워크시트에서 unmerge_cells 메서드를 사용하면 병합을 해제할 수 있습니다. 병합된 영역을 모두 알려줘야 합니다. 위에서 병합한 범위가 A1부터 C2까지이므로 동일하게 A1:C2로 설정하겠습니다.

# 병합된 셀 해제
ws.unmerge_cells('A1:C2')

# 병합이 해제된 셀의 값을 확인
print(ws['A1'].value)  # "병합된 셀"이 출력됩니다.
Python

unmerge_cells의 파라미터를 A1:B1으로 하는 경우 셀 범위에 대한 KeyError가 발생합니다.

그림 2. openpyxl unmerge 영역을 잘못 지정한 경우 1
그림 2. openpyxl unmerge 영역을 잘못 지정한 경우 1

그리고 해당 영역을 초과하는 영역으로 잡으면 해당 셀 범위는 병합된 것이 아니라고 알려줍니다.

그림 3. openpyxl unmerge 영역을 잘못 지정한 경우 2
그림 3. openpyxl unmerge 영역을 잘못 지정한 경우 2

따라서 병합을 해제할 때에는 명확히 병합된 영역을 지정해 주어야 병합을 해제할 수 있습니다.

병합이 해제된 결과는 아래 그림과 같습니다. 병합이 해제되면 병합된 셀에 들어있던 문자열은 병합 영역의 첫 셀에 저장됩니다.

그림 3. openpyxl 셀 병합을 해제한 결과
그림 3. openpyxl 셀 병합을 해제한 결과

서식의 적용

병합된 셀의 서식

병합된 셀의 서식은 병합 이전 첫 셀의 서식을 기준으로 정해집니다.

병합 해제된 셀의 서식

병합된 셀의 서식은 병합 해제된 첫 셀에만 유지되고 나머지 셀은 서식이 적용되지 않습니다.

병합된 셀과 병합 해제된 셀의 서식 예제 코드

셀을 병합한 후 병합한 셀의 문자를 굵게, 색상을 빨간색으로 서식을 지정해줍니다. 그리고 서식을 해제했을 때 어떻게 되는지 살펴보겠습니다.

from openpyxl import Workbook
from openpyxl.styles import Font

# 워크북과 워크시트 생성
wb = Workbook()
ws = wb.active

# 셀 병합
ws.merge_cells('A1:C2')

# 병합된 셀에 값과 서식 입력
ws['A1'] = "여기는 병합된 셀이다!"
ws['A1'].font = Font(bold=True, color="FF0000")

# 워크북 저장
wb.save("merged_cells.xlsx")

# 셀 병합 해제
ws.unmerge_cells('A1:C2')

# 병합 해제된 셀의 값과 서식 확인
print("A1 -------")
print(ws['A1'].value)
print(ws['A1'].font.bold)
print(ws['A1'].font.color.rgb)
print("B1 -------")
print(ws['B1'].value)
print(ws['B1'].font.bold)
print(ws['B1'].font.color.rgb)

wb.save("unmerged_cells.xlsx")
Python

위의 코드를 실행한 결과는 아래와 같습니다. A1에는 폰트의 굵기와 색상값이 살아있지만, B1에는 서식이 없는 것을 확인할 수 있습니다.

그림 4. openpyxl 셀 병합 해제된 셀의 서식 확인
그림 4. openpyxl 셀 병합 해제된 셀의 서식 확인

위의 코드를 실행한 후 merged_cells.xlsx를 열어보면 아래 그림과 같습니다.

그림 5. openpyxl 셀 병합 및 서식 테스트 결과
그림 5. openpyxl 셀 병합 및 서식 테스트 결과

그리고 unmerged_cells.xlsx를 열어보면 아래와 같은 것을 확인할 수 있습니다.

그림 6. openpyxl 셀 병합 해제 및 서식 테스트 결과
그림 6. openpyxl 셀 병합 해제 및 서식 테스트 결과

여기까지 간략하게 merge_cells와 unmerge_cells 메서드의 사용법에 대해 알아보았습니다.

관련 자료

merge_cells()unmerge_cells() 문서를 참조했습니다.

같이 읽으면 좋은 글

Leave a Comment