반응형

IT·디지털 생활형 블로그 · 파이썬 엑셀 자동화
환경 확인과 샘플 파일
가상환경을 활성화한 뒤 openpyxl을 설치합니다.
pip install --upgrade pip
pip install openpyxl
예제에서 사용할 기본 파일을 생성합니다.
# file: 00_bootstrap.py
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "매출"
ws.append(["월","매출","비용","이익","상태","메모","날짜"])
base = [
("1월",120,80,"","","","2025-01-31"),
("2월",150,90,"","","","2025-02-28"),
("3월",180,110,"","","","2025-03-31"),
]
for r in base:
ws.append(list(r))
wb.save("셀수정_실습.xlsx")
print("초기 파일 생성 완료")
단일 셀 값 수정
특정 셀을 지정해 값을 덮어쓰는 가장 기본적인 패턴입니다.
# file: 01_single_edit.py
from openpyxl import load_workbook
wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]
ws["F2"] = "신규 프로모션 반영"
ws["B2"] = 130 # 1월 매출 수정
ws["C2"] = 75 # 1월 비용 수정
wb.save("셀수정_실습.xlsx")
print("단일 셀 수정 완료")
대량 입력과 범위 채우기
iter_rows와 append를 활용하면 빠르게 범위를 채울 수 있습니다.
# file: 02_bulk_input.py
from openpyxl import load_workbook
wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]
# 월별 이익 계산 값을 한번에 입력
for row in ws.iter_rows(min_row=2, max_col=4):
month, sales, cost, profit = row
profit.value = (sales.value or 0) - (cost.value or 0)
# 상태 컬럼 대량 입력
status_map = {"1월":"확정","2월":"확정","3월":"잠정"}
for r in range(2, ws.max_row+1):
ws[f"E{r}"] = status_map.get(ws[f"A{r}"].value, "")
wb.save("셀수정_실습.xlsx")
print("대량 입력 완료")
날짜·숫자 서식과 정렬
보고서 품질을 높이는 핵심은 일관된 서식입니다.
# file: 03_formats.py
from openpyxl import load_workbook
from openpyxl.styles import Alignment
wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]
# 숫자 서식
for r in range(2, ws.max_row+1):
ws[f"B{r}"].number_format = "#,##0"
ws[f"C{r}"].number_format = "#,##0"
ws[f"D{r}"].number_format = "#,##0"
# 날짜 서식과 가운데 정렬
for r in range(2, ws.max_row+1):
ws[f"G{r}"].number_format = "yyyy-mm-dd"
ws[f"A{r}"].alignment = Alignment(horizontal="center")
wb.save("셀수정_실습.xlsx")
print("서식 적용 완료")
수식 적용과 합계 계산
엑셀 수식은 문자열로 입력합니다. 저장 후 엑셀에서 열면 자동 계산됩니다.
# file: 04_formulas.py
from openpyxl import load_workbook
wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]
# 이익을 수식으로 다시 지정
for r in range(2, ws.max_row+1):
ws[f"D{r}"] = f"=B{r}-C{r}"
# 합계 행 추가
total_row = ws.max_row + 1
ws[f"A{total_row}"] = "합계"
ws[f"B{total_row}"] = f"=SUM(B2:B{total_row-1})"
ws[f"C{total_row}"] = f"=SUM(C2:C{total_row-1})"
ws[f"D{total_row}"] = f"=SUM(D2:D{total_row-1})"
wb.save("셀수정_실습.xlsx")
print("수식 적용 완료")
드롭다운(데이터 유효성) 만들기
입력 오류를 줄이려면 데이터 유효성 검사를 활용하세요.
# file: 05_validation.py
from openpyxl import load_workbook
from openpyxl.worksheet.datavalidation import DataValidation
wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]
dv = DataValidation(type="list", formula1='"확정,잠정,보류"', allow_blank=True)
ws.add_data_validation(dv)
dv.add("E2:E100") # 상태 컬럼 범위
wb.save("셀수정_실습.xlsx")
print("드롭다운 적용 완료")
조건부 서식으로 강조
이익이 음수이거나 특정 기준을 넘는 값을 시각적으로 표시할 수 있습니다.
# file: 06_conditional_format.py
from openpyxl import load_workbook
from openpyxl.formatting.rule import ColorScaleRule, CellIsRule
wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]
# 이익 컬럼 색상 스케일
ws.conditional_formatting.add("D2:D100",
ColorScaleRule(start_type="min", start_color="FCA5A5",
mid_type="percentile", mid_value=50, mid_color="FDE68A",
end_type="max", end_color="86EFAC"))
# 비용이 매출보다 큰 경우 빨간 글씨
ws.conditional_formatting.add("C2:C100",
CellIsRule(operator="greaterThan", formula=["B2"], stopIfTrue=True, font={"color":"9B1C1C"}))
wb.save("셀수정_실습.xlsx")
print("조건부 서식 적용 완료")
찾기·치환으로 일괄 수정
메모나 텍스트 열에서 특정 단어를 치환합니다.
# file: 07_find_replace.py
from openpyxl import load_workbook
wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]
for cell in ws["F"]:
if cell.row == 1:
continue
text = str(cell.value or "")
text = text.replace("프로모션", "행사")
cell.value = text
wb.save("셀수정_실습.xlsx")
print("찾기·치환 완료")
셀 잠금과 시트 보호
계산식이나 헤더는 잠그고, 입력 칸만 열어두면 안전합니다.
# file: 08_protect.py
from openpyxl import load_workbook
from openpyxl.styles import Protection
wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]
# 전체 잠금 후 입력 칸만 해제
for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=7):
for c in row:
c.protection = Protection(locked=True)
for r in range(2, ws.max_row+1):
for col in ["B","C","E","F","G"]: # 입력 허용
ws[f"{col}{r}"].protection = Protection(locked=False)
ws.protection.sheet = True
ws.protection.password = "1234" # 필요시 변경
wb.save("셀수정_실습.xlsx")
print("시트 보호 설정 완료")
체크리스트
- openpyxl 설치 및 예제 파일 생성 완료
- 단일 셀 수정과 대량 입력 패턴 숙지
- 숫자·날짜 서식과 정렬 일관성 유지
- 수식으로 합계·계산 자동화
- 드롭다운과 조건부 서식으로 입력 품질 향상
- 찾기·치환으로 텍스트 일괄 정리
- 중요 셀 잠금 및 시트 보호 적용
다음 글 예고: 시트 자동 생성과 템플릿 복제
다음 편에서는 템플릿 시트를 복제해 월별 시트를 자동 생성하고, 각 시트에 데이터와 서식을 한 번에 배포하는 방법을 다룹니다.
관련 읽을거리: openpyxl 완벽 정리 · 엑셀 자동화 환경 설정 가이드
반응형