파이썬 업무 자동화#1엑셀 자동화 입문 (openpyxl)!
목차9개 항목
안녕하세요! Mojangcam입니다 😎
오늘부터 새 시리즈, 파이썬 업무 자동화를 시작해요! 매일 반복하는 지루한 컴퓨터 작업들 — 엑셀 정리, 파일 이름 바꾸기, 웹에서 자료 모으기 같은 걸 파이썬에게 대신 시키는 시리즈예요. 코딩을 몰라도 따라오면 돌아가도록 천천히 갈게요!
첫 편은 업무 자동화의 왕도, 엑셀 자동화입니다. 이번 편을 다 읽으면 지점별 판매 엑셀 파일 3개를 파이썬이 알아서 합치고, 합계까지 계산해서 보고서 파일을 만들어주는 스크립트를 손에 넣게 돼요. 매주 30분씩 하던 취합 작업이 1초로 끝나는 거죠!

📌 준비물
- Python 3.8 이상
- openpyxl 3.1.x (2026-07 기준 최신 3.1.5)
pip install openpyxlopenpyxl은 엑셀 설치 없이도 .xlsx 파일을 읽고 쓸 수 있는 라이브러리예요. 즉, 엑셀이 없는 서버에서도 돌아간다는 말이죠!
실습용으로 서울지점.xlsx, 부산지점.xlsx, 대전지점.xlsx 세 파일을 준비할게요. 각 파일에는 "상품명 / 수량 / 금액" 세 열이 있다고 가정합니다.
📌 1단계 - 엑셀 파일 읽기
먼저 엑셀 파일 하나를 열어서 내용을 출력해볼게요.
# openpyxl 3.1.5 / Python 3.8+
from openpyxl import load_workbook
wb = load_workbook("서울지점.xlsx")
ws = wb.active # 첫 번째 시트
for row in ws.iter_rows(min_row=2, values_only=True):
print(row) # ('키보드', 3, 45000) 처럼 튜플로 나와요하나씩 뜯어볼게요 💡
- load_workbook() : 이미 있는 엑셀 파일을 여는 함수예요.
- wb.active : 지금 선택된(보통 첫 번째) 시트를 가져와요.
wb["시트1"]처럼 이름으로도 가능해요. - iter_rows(min_row=2, values_only=True) : 2행부터(1행은 제목이니까!) 값만 뽑아서 한 줄씩 돌려줘요. values_only=True를 빼면 셀 객체가 나와서 초보자는 헷갈려요.
- 특정 셀 하나만 읽을 때는
ws["B2"].value처럼 쓰면 돼요.
📌 2단계 - 새 엑셀 파일 만들어 쓰기
이번엔 반대로 파이썬이 엑셀 파일을 만들어볼게요.
# openpyxl 3.1.5 / Python 3.8+
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "요약"
ws.append(["상품명", "수량", "금액"]) # 제목 행
ws.append(["키보드", 3, 45000])
ws.append(["마우스", 5, 25000])
wb.save("요약.xlsx")
print("저장 완료!")하나씩 뜯어볼게요 💡
- Workbook() : 빈 엑셀 파일을 새로 만드는 클래스예요.
- ws.append(리스트) : 리스트 하나가 한 행이 돼서 맨 아래에 추가돼요. 제일 많이 쓰게 될 메서드입니다!
wb.save(): 이걸 호출해야 실제 파일로 저장돼요. 까먹으면 아무 일도 안 일어나요 😅
📌 3단계 - 서식과 합계 수식 넣기
보고서답게 제목을 굵게 하고, 합계 수식도 넣어볼게요.
# openpyxl 3.1.5 / Python 3.8+
from openpyxl.styles import Font
# 제목 행(1행) 굵게
for cell in ws[1]:
cell.font = Font(bold=True)
# 열 너비 조절
ws.column_dimensions["A"].width = 20
# 마지막 행 아래에 합계 수식 추가
last = ws.max_row
ws[f"A{last + 1}"] = "합계"
ws[f"C{last + 1}"] = f"=SUM(C2:C{last})"하나씩 뜯어볼게요 💡
- Font(bold=True) : 글꼴 서식 객체예요. 색상(color), 크기(size)도 줄 수 있어요.
- ws.max_row : 데이터가 있는 마지막 행 번호예요. 행 수가 매번 달라도 알아서 맞춰줍니다.
- =SUM(...) : 문자열로 수식을 넣으면 엑셀이 열 때 진짜 수식으로 동작해요!
📌 전체 코드 (복붙 OK)
지점별 파일 3개를 합쳐서 서식·합계까지 들어간 전체요약.xlsx를 만드는 완성본이에요. 엑셀 파일들과 같은 폴더에서 실행하세요!
# openpyxl 3.1.5 / Python 3.8+
# 파일명: merge_excel.py
import glob
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font
wb_out = Workbook()
ws_out = wb_out.active
ws_out.title = "전체 요약"
ws_out.append(["지점", "상품명", "수량", "금액"])
# 폴더의 모든 지점 파일 병합
for path in glob.glob("*지점.xlsx"):
branch = path.replace(".xlsx", "")
ws = load_workbook(path).active
for row in ws.iter_rows(min_row=2, values_only=True):
if row[0] is None: # 빈 행 건너뛰기
continue
ws_out.append([branch, *row])
print(f"{path} 처리 완료")
# 서식: 제목 행 굵게 + 열 너비
for cell in ws_out[1]:
cell.font = Font(bold=True)
for col in ["A", "B", "C", "D"]:
ws_out.column_dimensions[col].width = 15
# 합계 행 (데이터가 있을 때만!)
last = ws_out.max_row
if last >= 2:
ws_out[f"A{last + 1}"] = "합계"
ws_out[f"D{last + 1}"] = f"=SUM(D2:D{last})"
ws_out[f"A{last + 1}"].font = Font(bold=True)
else:
print("⚠️ 지점 파일을 못 찾았어요! 이 스크립트를 엑셀 파일들과 같은 폴더에 두고 실행하세요.")
wb_out.save("전체요약.xlsx")
print("전체요약.xlsx 생성 완료!")📌 실행 결과
실행하면 터미널에 파일별 처리 로그가 출력되고, 폴더에 전체요약.xlsx가 생깁니다. 열어보면 세 지점 데이터가 지점명과 함께 한 시트에 모여 있고, 맨 아래 합계 행은 엑셀 수식이라 데이터를 수정하면 자동으로 다시 계산돼요.

파일이 10개가 되든 100개가 되든 코드는 그대로예요. 이게 자동화의 맛입니다 😎
📌 자주 나는 에러
- ModuleNotFoundError: No module named 'openpyxl'
- 원인: openpyxl 미설치, 또는 다른 파이썬에 설치됨
- 해결:
python -m pip install openpyxl로 지금 쓰는 파이썬에 정확히 설치
- PermissionError: [Errno 13] Permission denied: '전체요약.xlsx'
- 원인: 저장하려는 파일이 엑셀에서 열려 있음
- 해결: 엑셀 창을 닫고 다시 실행 (제일 많이 겪는 에러예요!)
- InvalidFileException: openpyxl does not support the old .xls file format
- 원인: 구버전 엑셀 형식(.xls)은 openpyxl이 열지 못함
- 해결: 엑셀에서 "다른 이름으로 저장 → .xlsx"로 변환 후 사용
- 열자마자 "순환 참조" 경고가 떠요 (데이터 없이 합계만 있음)
- 원인: 스크립트와 같은 폴더에
○○지점.xlsx가 없어서 0행이 병합됨 → 합계 수식=SUM(D2:D1)이 자기 자신(D2)을 포함해버려요 - 해결: 엑셀 파일들이 있는 폴더에서 실행하세요. 위 전체 코드처럼 데이터가 있을 때만 합계 행을 넣으면 예방됩니다!
- 원인: 스크립트와 같은 폴더에
📌 마무리
오늘은 새 시리즈 첫 편으로 openpyxl로 엑셀을 읽고, 쓰고, 서식과 수식까지 넣어서 여러 파일을 한 방에 합치는 스크립트를 만들어봤어요. 다음 편에서는 웹사이트에서 자료를 자동으로 긁어오는 웹 크롤링(requests + BeautifulSoup)을 배워볼 거예요. 기대해주세요 🙌
📚 파이썬 업무 자동화 시리즈
- #1 - 엑셀 자동화 입문 (openpyxl) ← 지금 이 글!
- #2 - 웹 크롤링 입문 (requests + BeautifulSoup) (예정)
- #3 - 파일 정리 자동화 (예정)
- #4 - 디스코드 웹훅 알림 보내기 (예정)
- #5 - ChatGPT API로 업무 자동화 (예정)
- #6 - 예약 실행 자동화 (예정)
- #7 - 동적 페이지·로그인 자동화 (Selenium) (예정)
- #8 - PDF 자동 처리 (예정)
- #9 - 마우스·키보드 GUI 자동화 (PyAutoGUI) (예정)
연재 · 14편 중 1번째
파이썬 업무 자동화
- #1엑셀 자동화 입문 (openpyxl)!지금 읽는 글
- #2웹 크롤링 입문 (requests + BeautifulSoup)!
- #3파일 정리 자동화 (이름 일괄 변경)!
- #4디스코드 웹훅(Webhook)으로 알림 보내기 (requests)!
- #5로컬 LLM(LM Studio)으로 고객 문의 자동 분류·요약하기! (무료 AI)
- #6예약 실행 자동화! 매일 정해진 시간에 스크립트 돌리기 (schedule·APScheduler)
- #7동적 페이지·로그인 자동화! requests로 안 되는 사이트 긁기 (Selenium)
- #8PDF 자동 처리! 여러 파일 병합·분할부터 비밀번호까지 (pypdf) 📄
- #9마우스·키보드 GUI 자동화! 클릭·타이핑을 파이썬이 대신하게 하기 (PyAutoGUI)
- #10워드(Word) 문서 자동 생성! 엑셀 명단으로 계약서·안내문 100장 뽑기 (python-docx) 📄
- #11개인화 대량 메일 자동 발송! 명단별 첨부파일·발송 로그·재시도까지 (smtplib 실전편) 📬
- #12구글 시트 연동하기! 팀원과 같이 보는 자동 시트 (gspread) 📗
- #13파이썬 자동화 로그·재시도·디스코드 실패 알림 만들기 - 조용히 멈추는 스크립트 잡기
- #14파워포인트(PowerPoint) 보고서 자동 생성! 엑셀 숫자만 바꾸면 발표자료 완성 (python-pptx) 📊
