7. Python으로 엑셀 자동화하기 — openpyxl 완벽 가이드

저도 매주 월요일마다 전국 50개 매장의 주간 매출 데이터를 다운받아 하나의 파일로 취합하고 정산하는 업무를 맡았습니다. 파일 누락을 체크하고 수식을 맞추다 보면 오전 4시간이 통째로 날아가곤 했죠. 하지만 파이썬으로 단 5줄짜리 병합 코드를 짠 이후로는, 오전 내내 붙잡고 있던 4시간의 정산 작업이 단 5초 만에 완벽하게 끝납니다.


이 글에서는 Python으로 엑셀 파일을 읽고 쓰는 기본부터, 셀 서식 지정, 수식 입력, 시트 관리, 그리고 실무에서 바로 쓸 수 있는 자동화 예제까지 — openpyxl 라이브러리를 중심으로 단계별로 안내해 드리겠습니다.


왜 엑셀 자동화인가 — 복사·붙여넣기에서 해방되는 방법

직장인이 하루에 엑셀을 여닫는 횟수를 세어보면, 놀랍도록 많은 시간이 반복 작업에 낭비되고 있습니다. 매월 같은 양식에 숫자만 바꾸는 보고서, 수십 개 파일에서 특정 컬럼만 뽑아서 합치는 작업, 조건에 맞는 행에 색을 칠하는 작업 — 사람이 손으로 하면 1시간이 걸리는 일을 Python은 3초 만에 처리합니다.

Python의 엑셀 자동화를 공장 컨베이어 벨트에 비유할 수 있습니다. 작업자가 매번 손으로 하나씩 조립하던 방식에서, 한 번 설계해 두면 버튼 하나로 수천 개를 동일하게 처리하는 자동화 라인으로 전환하는 것입니다. 초기 설계에 시간이 들지만, 이후로는 반영구적으로 그 시간을 돌려받습니다.

Python 엑셀 자동화가 필요한 상황

  • 매월 반복되는 보고서 작성 — 데이터만 바뀌고 양식은 동일한 경우
  • 여러 파일에서 데이터 취합 — 부서별 파일을 하나로 합치는 작업
  • 조건부 서식 일괄 적용 — 특정 값 이상인 셀에 색상 자동 표시
  • 대량 데이터 정제 — 빈 행 제거, 중복 삭제, 날짜 형식 통일 등

openpyxl vs pandas — 어떤 도구를 선택해야 하나

Python에서 엑셀을 다루는 도구는 여러 가지입니다. 상황에 맞는 선택이 중요합니다.

상황 추천 도구
엑셀 서식(색상, 폰트, 테두리) 유지가 필요한 경우 openpyxl
데이터 분석·집계·필터링이 주목적인 경우 pandas
엑셀 차트를 코드로 생성해야 하는 경우 openpyxl
수십만 행의 대용량 데이터를 빠르게 처리해야 하는 경우 pandas
.xlsx 파일을 읽고 특정 셀에 값을 입력해야 하는 경우 openpyxl

이 글에서는 서식과 구조를 다루는 **openpyxl**을 중심으로 설명하고, 데이터 처리가 필요한 부분은 pandas와 함께 활용하는 방법을 안내합니다.


openpyxl 설치하기

가상환경이 활성화된 상태에서 설치합니다.

pip install openpyxl

설치 확인:

pip show openpyxl


엑셀 파일 생성하고 데이터 입력하기

새 엑셀 파일 만들기

from openpyxl import Workbook

# 새 워크북 생성
wb = Workbook()

# 기본 시트 선택
ws = wb.active
ws.title = "월간보고"

# 셀에 데이터 입력
ws["A1"] = "담당자"
ws["B1"] = "항목"
ws["C1"] = "금액"

# 데이터 행 입력
data = [
    ["김현욱", "노트북", 1200000],
    ["이하늘", "마우스", 35000],
    ["박지수", "키보드", 85000],
]

for row in data:
    ws.append(row)

# 파일 저장
wb.save("report.xlsx")
print("엑셀 파일이 생성되었습니다.")

특정 셀에 값 입력하는 두 가지 방법

# 방법 1 — 셀 주소로 입력
ws["A1"] = "제목"

# 방법 2 — 행·열 번호로 입력 (행, 열 순서)
ws.cell(row=1, column=1, value="제목")

반복문으로 대량 데이터를 입력할 때는 방법 2가 더 편리합니다.


기존 엑셀 파일 읽기

from openpyxl import load_workbook

# 기존 파일 열기
wb = load_workbook("report.xlsx")
ws = wb.active

# 모든 행 읽기
for row in ws.iter_rows(values_only=True):
    print(row)

실행 결과:

('담당자', '항목', '금액')
('김현욱', '노트북', 1200000)
('이하늘', '마우스', 35000)
('박지수', '키보드', 85000)

특정 범위만 읽기

# B2부터 C4 범위만 읽기
for row in ws.iter_rows(min_row=2, max_row=4, min_col=2, max_col=3, values_only=True):
    print(row)




셀 서식 지정하기 — 색상, 폰트, 테두리

데이터를 넣는 것에서 한 단계 나아가, 실제 보고서처럼 서식을 입히는 방법입니다.

폰트 스타일 설정

from openpyxl.styles import Font

# 헤더에 굵은 글씨, 파란색 폰트 적용
ws["A1"].font = Font(bold=True, color="0070C0", size=12)
ws["B1"].font = Font(bold=True, color="0070C0", size=12)
ws["C1"].font = Font(bold=True, color="0070C0", size=12)

셀 배경색 설정

from openpyxl.styles import PatternFill

# 헤더 행에 하늘색 배경 적용
header_fill = PatternFill(start_color="BDD7EE", end_color="BDD7EE", fill_type="solid")

for col in ["A", "B", "C"]:
    ws[f"{col}1"].fill = header_fill

테두리 설정

from openpyxl.styles import Border, Side

thin = Side(style="thin")
border = Border(left=thin, right=thin, top=thin, bottom=thin)

for row in ws.iter_rows(min_row=1, max_row=4, min_col=1, max_col=3):
    for cell in row:
        cell.border = border

열 너비 자동 조정

# 열 너비 수동 설정
ws.column_dimensions["A"].width = 15
ws.column_dimensions["B"].width = 15
ws.column_dimensions["C"].width = 12
wb.save("report.xlsx")



수식 입력하기

Python으로 엑셀 수식을 셀에 직접 입력할 수 있습니다.

# C열 합계 수식 입력
ws["C5"] = "=SUM(C2:C4)"
ws["C5"].font = Font(bold=True)

wb.save("report.xlsx")

엑셀에서 파일을 열면 수식이 그대로 계산되어 표시됩니다.


시트 관리 — 추가, 복사, 삭제

from openpyxl import Workbook

wb = Workbook()

# 시트 추가
ws1 = wb.active
ws1.title = "1월"

ws2 = wb.create_sheet("2월")
ws3 = wb.create_sheet("3월", 0)  # 맨 앞에 삽입

# 시트 목록 확인
print(wb.sheetnames)

# 시트 삭제
del wb["3월"]

wb.save("multi_sheet.xlsx")

실전 예제 — 월간 보고서 자동 생성기

매월 데이터만 바뀌는 보고서를 자동으로 생성하는 예제입니다. CSV 파일에서 데이터를 읽어 서식이 완성된 엑셀 보고서로 변환합니다.

import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment

# 1. 데이터 읽기 (CSV → pandas)
df = pd.read_csv("sales.csv", encoding="utf-8-sig")

# 2. 담당자별 집계
summary = df.groupby("담당자")["금액"].sum().reset_index()
summary.columns = ["담당자", "총매출"]
summary = summary.sort_values("총매출", ascending=False)

# 3. 엑셀 보고서 생성
wb = Workbook()
ws = wb.active
ws.title = "월간 매출 보고"

# 스타일 정의
header_font = Font(bold=True, color="FFFFFF", size=11)
header_fill = PatternFill(start_color="2F75B6", end_color="2F75B6", fill_type="solid")
thin = Side(style="thin")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
center = Alignment(horizontal="center")

# 헤더 입력
headers = ["순위", "담당자", "총매출(원)"]
for col_num, header in enumerate(headers, 1):
    cell = ws.cell(row=1, column=col_num, value=header)
    cell.font = header_font
    cell.fill = header_fill
    cell.border = border
    cell.alignment = center

# 데이터 입력
for rank, (_, row) in enumerate(summary.iterrows(), 1):
    ws.cell(row=rank+1, column=1, value=rank).border = border
    ws.cell(row=rank+1, column=2, value=row["담당자"]).border = border
    amount_cell = ws.cell(row=rank+1, column=3, value=row["총매출"])
    amount_cell.border = border
    amount_cell.number_format = "#,##0"  # 천 단위 쉼표

# 열 너비 설정
ws.column_dimensions["A"].width = 8
ws.column_dimensions["B"].width = 15
ws.column_dimensions["C"].width = 18

wb.save("monthly_report.xlsx")
print("월간 보고서가 생성되었습니다: monthly_report.xlsx")



이 코드를 한 번 만들어두면, 다음 달에는 sales.csv 파일만 교체하고 실행 버튼 하나만 누르면 됩니다.


자주 발생하는 오류와 해결법

오류 1 — "파일이 열려 있어서 저장할 수 없습니다"

원인: 엑셀에서 해당 파일을 열어놓은 상태에서 Python이 같은 파일에 저장을 시도
해결: 엑셀을 닫은 후 코드를 다시 실행하십시오.

오류 2 — 한글이 포함된 파일명에서 오류 발생

원인: 경로 문자열 인코딩 문제
해결: os.path를 활용해 절대 경로로 지정하거나, 파일명을 영문으로 사용

오류 3 — read_only=True 옵션으로 연 파일에서 수정 불가

원인: 읽기 전용 모드로 열어둔 상태
해결: 수정이 필요하면 load_workbook("파일.xlsx") 에서 read_only 옵션 없이 열기

# 읽기 전용 (대용량 파일 빠르게 읽기용)
wb = load_workbook("report.xlsx", read_only=True)

# 수정 가능 (기본값)
wb = load_workbook("report.xlsx")

마무리 — 핵심 요약

✅ Python 엑셀 자동화 체크리스트

  1. 설치는 pip install openpyxl — 가상환경 활성화 후 설치
  2. 새 파일은 Workbook(), 기존 파일은 load_workbook() 으로 엽니다
  3. 데이터 입력은 ws["A1"] = 값 또는 ws.cell(row, col, value) 사용
  4. 서식은 Font, PatternFill, Border 객체로 지정합니다
  5. 저장은 반드시 wb.save("파일명.xlsx") — 저장 전 엑셀에서 해당 파일을 닫으세요
  6. 데이터 분석이 필요하면 pandas와 조합 — 읽기/집계는 pandas, 서식 입히기는 openpyxl

다음으로 알아두면 좋은 것

엑셀 자동화에 익숙해졌다면, 한 단계 더 나아가 **스케줄러(schedule 라이브러리)**와 결합해 보시길 권장합니다. 매일 오전 9시에 자동으로 보고서를 생성하고, 이메일까지 자동으로 발송하는 파이프라인을 구축하면 단순한 자동화에서 완전한 업무 자동화 시스템으로 발전합니다.




댓글

이 블로그의 인기 게시물

1.Python 설치부터 실행까지 10분 만에 끝내기 — 초보자도 바로 따라 하는 완벽 가이드

30.Python pyautogui로 마우스와 키보드 자동화하기: VSCode 실전 가이드

29.Python subprocess로 외부 명령어 실행하기: VSCode 실전 활용법