#python #파이썬 #업무자동화 #openpyxl
지난 포스팅에서는 openpyxl 패키지를 이용해 python으로 엑셀 작업을 자동화하는 기본적인 방법에 대해 알아보았다. 엑셀 파일을 만들거나 불러와 시트와 셀에 접근하고 값을 입력하거나 가져오는 방법 등이다.
이번에는 openpyxl 심화편으로, 폰트나 테두리, 배경 등 셀 서식 등을 지정해서 엑셀 파일을 스타일링하는 방법을 정리해보자.
목차
1. 셀 서식 지정하기
1.1 글꼴 설정
•
openpyxl.styles 모듈의 Font 클래스를 사용해 텍스트의 폰트, 사이즈 등 글꼴을 설정할 수 있다.
•
Font 객체를 생성하고 셀의 font 속성에 할당하면 해당 스타일이 적용됨
◦
객체 생성에 사용되는 글꼴 속성
속성 | 설명 |
name | 글꼴 이름 |
size | 글꼴 크기 |
bold | 굵게 |
italic | 기울임 |
color | 색상 (16진수 색상코드 사용) |
underline | 밑줄 |
•
예시 코드
from openpyxl import Workbook
from openpyxl.styles import Font
# workbook 생성하고 데이터 입력
wb = Workbook()
sh = wb.active # 기본 시트 선택
cell1 = sh.cell(row=2, column=2) # B2셀 선택
cell1.value = '폰트 테스트 1'
cell2 = sh['B3'] # B3셀 선택
cell2.value = '폰트 테스트 2'
# cell1, cell2에 글꼴 설정
cell1.font = Font(name='굴림',
color='4B0082',
italic=True,
bold=True,
size=14)
cell2.font = Font(name='맑은고딕',
color='FF6347',
italic=False,
bold=False,
size=20)
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
1.2 셀 배경색 지정
•
openpyxl.styles의 PatternFill 클래스 사용한 단색 배경
◦
PatternFill 객체를 생성하여 셀의 fill 속성에 할당하면 해당 스타일이 적용됨
◦
객체 생성에 사용되는 셀 배경색 속성
속성 | 설명 |
fill_type | - 단일 색일 경우 ‘solid’
- 기타: ‘darkGray’, ‘darkUp’, ‘lightDown’, ‘darkGrid’, ‘darkHorizontal’, ‘lightTrellis’, ‘lightVertical’, ‘gray0625’, ‘gray125’, ‘lightGray’, ‘lightUp’, ‘darkDown’, ‘darkTrellis’, ‘lightGrid’, ‘mediumGray’, ‘darkVertical’, ‘lightHorizontal’ |
start_color / end_color | 색상 (16진수 색상코드 사용) |
fgColor | 패턴 색상 (16진수 색상코드 사용) |
bgColor | 배경 색상 (16진수 색상코드 사용) |
◦
예시 코드
from openpyxl.styles import PatternFill
sh["C2"].fill = PatternFill(fill_type='solid', fgColor="00FF00")
sh["C4"].fill = PatternFill(fill_type='solid', start_color="000000")
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
•
GradientFill 클래스를 사용한 그라데이션 배경
◦
Gradient(stop=('왼쪽 색상', '오른쪽 색상') 객체를 생성해 셀의 fill 속성에 할당
◦
예시 코드
from openpyxl.styles import GradientFill
sh["C6"].fill = GradientFill(stop=("00FF00", "000000"))
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
1.3 셀 테두리 설정
•
openpyxl.styles의 Side 와 Border 객체 이용
•
Side 객체를 사용해 테두리 스타일을 설정하고,
Border 객체로 스타일을 어디에 적용할지 지정해서 셀의 border 속성에 지정
•
예시 코드
from openpyxl.styles import Border, Side
sh["E2"].border = Border(top=Side(border_style='thin', color='00FF00'),
right=Side(border_style='dashed', color='FFC7CE'),
bottom=Side(border_style='thick', color='008000'),
left=Side(border_style='dotted', color='000000')
)
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
1.4 셀 정렬
•
openpyxl.styles의 Alignment 클래스 활용
•
왼쪽/가운데/오른쪽 정렬, 들여쓰기, 텍스트 회전 설정 가능
•
셀 객체의 alignment 속성에 Alignment 객체를 할당하면 해당 스타일이 적용됨
•
코드 예시
from openpyxl.styles import Alignment
sh['G2'].value = '왼쪽정렬과 들여쓰기'
sh['G2'].alignment = Alignment(horizontal='left', ## 왼쪽 정렬
indent=1, ## 한칸 들여쓰기
)
sh['G4'].value = '가운데정렬과 텍스트회전'
sh['G4'].alignment = Alignment(horizontal='center', ## 가운데 정렬
text_rotation=45, ## 텍스트 회전
)
sh['G6'].value = '오른쪽정렬과 수직가운데정렬'
sh['G6'].alignment = Alignment(horizontal='right', ## 오른쪽 정렬
vertical='center' ## 수직 가운데 정렬
)
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
1.5 셀 크기 조정
•
셀 너비 설정
◦
시트의 column_dimensions 속성으로 열의 너비를 지정
◦
코드 예시
# B 열의 너비를 50으로 설정
sh.column_dimensions['B'].width = 50
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
•
셀 높이 설정
◦
시트의 row_dimensions 속성으로 행의 높이를 설정
◦
코드 예시
# 2 행의 높이를 50으로 설정
sh.row_dimensions[2].height = 50
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
2. 숫자 형식 지정
•
셀의 numer_format 속성을 활용하여 날짜, 시간, 통화 등의 형식 설정
•
주요 형식 패턴
구분 | 패턴 | 설명 |
숫자 | '0' | 소수점 없는 정수 |
숫자 | '0.00' | 소수점 둘째 자리까지 표시 |
숫자
| '#,##0' | 천 단위 구분 기호가 있는 정수 |
숫자 | '#,##0.00' | 천 단위 구분 기호와 소수점 둘째 자리까지 표시 |
백분율 | '0%' | 정수 백분율 |
백분율 | '0.00%' | 소수점 둘째 자리까지의 백분율 |
통화 | '"$"#,##0.00' | 달러 기호와 소수점 둘째 자리까지 표시 |
통화 | '#,##0.00€' | 유로 기호와 소수점 둘째 자리까지 표시 |
날짜와 시간 | 'yyyy-mm-dd' | 연-월-일 형식 |
날짜와 시간 | 'd-mmm-yy' | 일-월(축약형)-년(끝 두 자리) 형식 |
날짜와 시간 | 'h:mm AM/PM' | 시:분 오전/오후 형식 |
날짜와 시간 | 'h:mm:ss' | 시:분:초 형식 |
과학적 표기법 | '0.00E+00' | 지수 표기법 |
•
코드 예시
# 새로운 시트 생성
sh_num = wb.create_sheet()
# 일반 숫자 형식
sh_num['B1'] = 1234.5678
sh_num['B1'].number_format = '#,##0.00'
# 백분율 형식
sh_num['B2'] = 0.4567
sh_num['B2'].number_format = '0.00%'
# 통화 형식
sh_num['B3'] = 9876.54
sh_num['B3'].number_format = '"$"#,##0.00'
# 날짜 형식
from datetime import datetime
sh_num['B4'] = datetime(2025, 1, 24)
sh_num['B4'].number_format = 'yyyy-mm-dd'
# 과학적 표기법
sh['B5'] = 0.000123
sh['B5'].number_format = '0.00E+00'
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
3. 조건부 서식
조건부 서식을 사용하면 엑셀에서 데이터를 더욱 시각적으로 표현하고 중요한 정보를 강조할 수 있는데, openpyxl으로도 다양한 조건부 서식 옵션을 활용하여 엑셀 문서의 가독성과 분석 효율성을 높일 수 있다.
openpyxl에서 조건부 서식을 사용하는 방법은 다음과 같다.
아래와 같은 시트를 추가하고서 파일을 읽은 후에 조건부 서식을 지정해보자
3.1 CellIsRule
•
특정 조건에 따라 셀 서식을 지정
•
예시 코드
from openpyxl.styles import PatternFill
from openpyxl.formatting.rule import CellIsRule
wb = op.load_workbook(filename = "test_excel_2.xlsx")
ws = wb["조건부서식 테스트"]
# 빨간색 배경 정의
red_fill = PatternFill(start_color="FFEE1111", end_color="FFEE1111", fill_type="solid")
# 40보다 큰 값에 대해 빨간색 배경 적용
ws.conditional_formatting.add('A1:A10',
CellIsRule(operator='greaterThan',
formula=['40'],
stopIfTrue=True,
fill=red_fill))
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
3.2 ColorScaleRule
•
값의 범위에 따라 색상 그라데이션을 적용
•
코드 예시
from openpyxl.formatting.rule import ColorScaleRule
# 최소값(노란색)에서 최대값(파란색)까지 색상 스케일 적용
ws.conditional_formatting.add('B1:B10',
ColorScaleRule(start_type='min', start_color='FFFF00',
end_type='max', end_color='0000FF'))
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
3.3 FormulaRule
•
사용자 정의 수식을 기반으로 서식을 적용
•
코드 예시
from openpyxl.formatting.rule import FormulaRule
# 짝수 행에 파란색 배경 적용
blue_fill = PatternFill(start_color="0000FF", end_color="0000FF", fill_type="solid")
ws.conditional_formatting.add('A1:C10',
FormulaRule(formula=['MOD(ROW(),2)=0'], fill=blue_fill))
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
3.4 기타
1) 데이터 막대
•
데이터 값을 시각적으로 표현하는 막대를 셀 내에 표시
•
코드 예시
from openpyxl.formatting.rule import DataBarRule
ws.conditional_formatting.add('D1:D10',
DataBarRule(start_type='min', end_type='max',
color="00AA00"))
Python
복사
2) 아이콘 세트
•
값의 범위에 따라 다른 아이콘을 표시
•
코드 예시
from openpyxl.formatting.rule import IconSetRule
ws.conditional_formatting.add('E1:E10',
IconSetRule('3Arrows', 'num', [80, 100, 120]))
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
4. 셀 병합과 분할
4.1 셀 병합
•
worksheet.merge_cells() 메서드 사용
•
코드 예시
# A12부터 D12까지 셀 병합
ws.merge_cells('A12:D12')
# 병합된 셀에 값 입력
ws['A12'] = '병합된 셀'
# 행과 열 번호로 셀 병합
ws.merge_cells(start_row=13, start_column=1, end_row=14, end_column=4)
ws['A13'] = '다른 병합된 셀'
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
4.2 셀 분할
•
worksheet.unmerge_cells() 메서드 사용
•
코드 예시
# A12부터 D12까지 병합된 셀 분할
ws.unmerge_cells('A12:D12')
# 행과 열 번호로 병합된 셀 분할
ws.unmerge_cells(start_row=13, start_column=1, end_row=14, end_column=4)
# Save the workbook
wb.save(filename="test_excel_2.xlsx")
Python
복사
이상 openpyxl의 모듈들을 이용해 엑셀 파일의 서식을 원하는대로 지정할 수 있는 방법에 대해 알아보았다.
특히 반복적으로 엑셀 보고서 등을 만들거나 할 때 유용하게 쓰일 수 있을 것이다. 