반응형

openpyxl 셀 색상, 폰트, 너비 설정하는 방법

openpyxl 셀 스타일을 익혀두면 엑셀 자동화 결과를 훨씬 보기 좋게 만들 수 있습니다. 단순히 데이터를 넣는 것에서 끝나지 않고 제목 행 색상, 글자 폰트, 열 너비까지 자동으로 맞추면 실무에서 바로 쓸 수 있는 보고서 형태가 됩니다. 이번 글에서는 openpyxl 셀 스타일을 이용해 셀 색상, 폰트, 열 너비를 설정하는 방법을 예제와 함께 정리해보겠습니다.

왜 openpyxl 셀 스타일이 중요할까?

엑셀 자동화를 처음 할 때는 값만 잘 들어가면 된다고 생각하기 쉽습니다. 하지만 실제 업무에서는 보기 좋은 형식까지 맞춰야 다시 손으로 수정하는 일을 줄일 수 있습니다.

  • 제목 행을 강조해서 가독성을 높일 수 있습니다.
  • 열 너비를 자동으로 넓혀 데이터가 잘리지 않게 만들 수 있습니다.
  • 폰트 크기와 굵기를 조정해 보고서 형태를 깔끔하게 맞출 수 있습니다.

예제 준비: openpyxl 설치

pip install openpyxl

설치가 끝났다면 바로 아래 예제로 셀 스타일을 적용해볼 수 있습니다.

openpyxl로 셀 색상, 폰트, 너비 설정하기

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter

wb = Workbook()
ws = wb.active
ws.title = "매출보고서"

data = [
    ["상품명", "수량", "금액"],
    ["키보드", 3, 90000],
    ["마우스", 5, 75000],
    ["모니터", 2, 400000],
]

for row in data:
    ws.append(row)

# 제목 행 스타일 적용
header_fill = PatternFill(fill_type="solid", fgColor="D9EAF7")
header_font = Font(name="맑은 고딕", bold=True, size=11)
header_alignment = Alignment(horizontal="center")

for cell in ws[1]:
    cell.fill = header_fill
    cell.font = header_font
    cell.alignment = header_alignment

# 데이터 영역 폰트 적용
for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
    for cell in row:
        cell.font = Font(name="맑은 고딕", size=10)

# 열 너비 자동 비슷하게 조정
for column_cells in ws.columns:
    max_length = 0
    column = column_cells[0].column
    column_letter = get_column_letter(column)

    for cell in column_cells:
        if cell.value:
            max_length = max(max_length, len(str(cell.value)))

    ws.column_dimensions[column_letter].width = max_length + 4

wb.save("styled_sales.xlsx")

코드 설명

1. 셀 색상 넣기

PatternFill은 셀 배경색을 지정할 때 사용합니다. 아래 코드처럼 제목 행에 연한 파란색을 넣으면 표 구조가 더 잘 보입니다.

header_fill = PatternFill(fill_type="solid", fgColor="D9EAF7")

여기서 fgColor는 색상 코드입니다. 원하는 색으로 바꾸면 다른 느낌의 표도 쉽게 만들 수 있습니다.

2. 폰트 설정하기

Font를 사용하면 글꼴, 굵기, 크기 등을 조정할 수 있습니다. 제목 행은 굵게, 본문은 일반 글씨로 나누면 보고서 형태가 훨씬 정리됩니다.

header_font = Font(name="맑은 고딕", bold=True, size=11)

실무에서는 보통 제목은 bold=True로 강조하고, 데이터 행은 조금 작은 크기로 맞추는 경우가 많습니다.

3. 열 너비 설정하기

자동화로 엑셀을 만들면 가장 자주 생기는 문제가 셀 내용이 잘려 보이는 것입니다. 이럴 때 열 너비를 넉넉하게 잡아주면 바로 읽을 수 있는 파일이 됩니다.

ws.column_dimensions["A"].width = 20

위처럼 직접 지정할 수도 있고, 이번 예제처럼 데이터 길이를 기준으로 비슷하게 자동 조정할 수도 있습니다.

4. 정렬까지 같이 맞추기

표 제목 행은 가운데 정렬을 자주 씁니다. Alignment를 함께 적용하면 더 깔끔한 결과를 만들 수 있습니다.

header_alignment = Alignment(horizontal="center")

실무에서 언제 많이 쓸까?

  • 매출 보고서나 재고 목록을 매일 자동 생성할 때
  • 팀원에게 바로 전달할 엑셀 파일을 꾸며야 할 때
  • CSV 데이터를 엑셀로 옮긴 뒤 보기 좋은 표로 정리할 때
  • 여러 파일을 같은 양식으로 맞춰야 할 때

즉, 단순 저장이 아니라 “바로 전달 가능한 엑셀 결과물”이 필요할 때 openpyxl 셀 스타일이 유용합니다.

주의할 점

색상 코드만 바꿔도 결과 느낌이 달라진다

배경색은 너무 진하면 오히려 가독성이 떨어질 수 있습니다. 제목 행은 연한 색 위주로 시작하는 것이 무난합니다.

폰트 이름은 환경에 따라 다를 수 있다

맑은 고딕처럼 시스템에 있는 폰트를 지정하면 보통 무난하지만, 환경에 따라 다르게 보일 수도 있습니다. 여러 PC에서 공유할 파일이라면 너무 특수한 글꼴은 피하는 편이 좋습니다.

열 너비 자동 조정은 완벽한 자동 맞춤이 아니다

엑셀 프로그램의 실제 자동 맞춤처럼 완전히 동일하게 동작하지는 않습니다. 한글과 숫자 길이가 섞인 경우에는 약간 넉넉하게 값을 주는 편이 안정적입니다.

조금 더 응용해보기

제목 행 테두리까지 넣고 싶을 때

이번 글에서는 색상, 폰트, 너비 중심으로 설명했지만, 다음 단계에서는 테두리와 숫자 서식까지 함께 적용하면 더 완성도 높은 문서를 만들 수 있습니다.

특정 열만 따로 강조하고 싶을 때

예를 들어 금액 열만 굵게 처리하거나, 합계 행만 다른 배경색으로 넣는 식으로도 확장할 수 있습니다. 이런 방식은 월별 정산표나 매출 요약표에서 자주 쓰입니다.

FAQ

Q1. openpyxl로 셀 배경색과 글자색을 같이 바꿀 수 있나요?

A. 가능합니다. PatternFill로 배경색을, Font로 글자색과 굵기 등을 함께 지정할 수 있습니다.

Q2. 열 너비를 자동으로 정확하게 맞출 수 있나요?

A. 완전히 엑셀의 자동 맞춤과 같지는 않지만, 문자열 길이를 기준으로 대부분 충분히 보기 좋게 맞출 수 있습니다.

Q3. 제목 행 말고 특정 셀만 따로 꾸밀 수도 있나요?

A. 가능합니다. 예를 들어 ws["C2"]처럼 특정 셀을 지정해서 개별 스타일을 적용할 수 있습니다.

Q4. openpyxl 셀 스타일은 기존 파일에도 적용할 수 있나요?

A. 가능합니다. load_workbook()으로 기존 파일을 열고 필요한 셀에 스타일을 다시 지정한 뒤 저장하면 됩니다.

정리

openpyxl 셀 스타일을 익히면 단순히 엑셀 파일을 생성하는 수준에서 한 단계 더 나아갈 수 있습니다. 제목 행 배경색, 폰트, 열 너비만 자동으로 맞춰도 결과물이 훨씬 실무형 문서처럼 보입니다.

특히 보고서, 재고표, 명단 파일처럼 다른 사람에게 바로 전달해야 하는 엑셀을 만든다면 스타일 자동화는 생각보다 큰 차이를 만듭니다. 먼저 제목 행 꾸미기부터 적용해보고, 익숙해지면 정렬과 숫자 서식까지 확장해보는 것을 추천합니다.

함께 보면 좋은 글

먼저 엑셀 파일을 새로 만들고 값을 넣는 기본 흐름이 필요하다면 파이썬 엑셀 자동화 방법 글과 함께 보면 이해가 더 쉽습니다.

엑셀과 함께 자주 다루는 텍스트 데이터 흐름이 궁금하다면 파이썬 CSV 한글 깨짐 해결 방법도 이어서 읽어보면 좋습니다.

파일 입출력 기본기가 아직 익숙하지 않다면 파이썬 파일 열어서 읽기 글도 같이 참고해보세요.

반응형

+ Recent posts