파이썬 엑셀 자동화, openpyxl로 시작하기
엑셀 파일에 데이터를 일일이 옮겨 적다가 야근해 보신 적, 다들 한 번쯤은 있으시잖아요. 거래처에서 보내준 PDF 보면서 셀에 숫자 옮기고, 월말 되면 부서별 명단 정리하고, 그러다 보면 어느새 시계는 9시.
저도 처음 회사 들어갔을 때 매주 그 짓을 했거든요. 그러다 파이썬을 알게 되고 나서 제일 먼저 검색한 게 "파이썬 엑셀 자동화"였어요.
앞에서 변수, 자료형, 조건문, 반복문까지 익히셨으니까 이제 진짜 써먹을 차례예요. 직장인이 가장 빨리 효과를 보는 영역이 바로 이 엑셀 자동화거든요.
openpyxl 설치하기
파이썬에서 엑셀을 다루려면 openpyxl이라는 외부 라이브러리(파이썬 기본 기능에 없어서 따로 깔아 쓰는 도구)를 설치해야 해요. 터미널이나 명령 프롬프트를 열고 한 줄만 입력하시면 됩니다.
pip install openpyxl
한 가지 미리 말씀드릴게요. openpyxl은 .xlsx 파일만 지원해요. 옛날 .xls 형식은 못 읽습니다. 회사에 굴러다니는 양식이 .xls라면, 엑셀에서 한 번 열어서 "다른 이름으로 저장 → .xlsx"로 바꿔주셔야 해요.
워크북, 시트, 셀 (python excel의 기본 단위)
코드 보기 전에 용어 세 개만 짚고 갈게요.
- 워크북(Workbook): 엑셀 파일 한 개. 노트 한 권이라고 생각하시면 돼요.
- 시트(Worksheet): 워크북 안의 시트 한 장. 노트의 한 페이지죠.
- 셀(Cell): 시트 안의 한 칸. 노트 위 네모 칸 하나.
노트 한 권(워크북) 안에 여러 페이지(시트)가 있고, 각 페이지에 네모 칸(셀)이 있는 구조예요. 이 셋의 관계만 머릿속에 있으면 나머지는 다 응용입니다.
새 엑셀 파일 만들기
가장 기본부터 해볼게요. 빈 엑셀 하나 만들어서 셀에 글자 써넣고 저장하는 코드입니다.
from openpyxl import Workbook # 워크북 만드는 도구 가져오기
wb = Workbook() # 빈 엑셀 파일 한 권 만들기
ws = wb.active # 자동으로 생긴 첫 번째 시트 가져오기
ws["A1"] = "이름" # A1 셀에 "이름" 쓰기
ws["B1"] = "부서" # B1 셀에 "부서" 쓰기
wb.save("직원.xlsx") # 디스크에 저장 (이거 안 하면 아무 일도 안 일어나요)
실행하면 같은 폴더에 직원.xlsx 파일이 생겨요. 열어보면 A1에 "이름", B1에 "부서"가 적혀 있을 거예요.
여기서 진짜 자주 빠뜨리는 게 wb.save()예요. 저장 명령을 안 부르면 메모리에서만 바뀌고 파일은 그대로거든요. 책을 다 썼으면 덮어서 책장에 다시 꽂아야 하잖아요. 그게 save라고 생각하시면 편해요.
셀에 접근하는 두 가지 방법
openpyxl에서 셀을 가리키는 방법이 두 가지 있어요. 처음에 이게 진짜 헷갈리실 거예요.
ws["A1"] = "홍길동" # 엑셀 주소 그대로
ws.cell(row=1, column=1, value="홍길동") # 행/열 번호 좌표
둘 다 똑같은 칸을 가리킵니다. 사람이 직접 보면서 코딩할 때는 "A1" 표기가 직관적이고, 반복문 돌릴 때는 숫자 좌표가 편해요.
여기서 진짜 중요한 함정 하나. 파이썬 리스트는 0번부터 시작하잖아요. 근데 openpyxl은 엑셀 화면처럼 1번부터 시작해요. ws.cell(row=0, column=0) 이렇게 쓰시면 바로 에러납니다. 저도 처음에 이거 때문에 30분은 헤맸어요.
행 단위로 데이터 추가하기
한 줄씩 추가하고 싶을 때는 append가 제일 편해요.
ws.append(["김영희", "개발팀"]) # 다음 빈 행에 자동으로 추가
ws.append(["이철수", "인사팀"])
ws.append(["박민수", "영업팀"])
wb.save("직원.xlsx")
리스트 하나가 한 행이 돼요. 어디에 추가할지 신경 안 써도 알아서 마지막 데이터 다음 줄에 붙여줍니다.
기존 엑셀 파일 읽기
이미 있는 파일을 열 때는 load_workbook을 씁니다.
from openpyxl import load_workbook
wb = load_workbook("직원.xlsx") # 기존 파일 열기
print(wb.sheetnames) # 시트 이름 목록
ws = wb["Sheet"] # 시트 이름으로 접근
print(ws["A1"].value) # 셀의 실제 값 읽기
# 실행 결과:
# ['Sheet']
# 이름
여기서 또 한 가지 주의하실 점. ws["A1"] 자체는 셀 객체예요. 안에 들어있는 진짜 값을 꺼내려면 .value를 붙이셔야 합니다. 안 붙이면 <Cell 'Sheet'.A1> 같은 정체불명의 문자열이 나와서 당황하실 거예요.
모든 행 한꺼번에 읽기
실무에서 제일 많이 쓰는 패턴이에요. 엑셀을 위에서부터 아래로 한 줄씩 훑는 코드입니다.
for row in ws.iter_rows(values_only=True): # 값만 튜플로 꺼내기
print(row)
# 실행 결과:
# ('이름', '부서')
# ('김영희', '개발팀')
# ('이철수', '인사팀')
# ('박민수', '영업팀')
values_only=True를 꼭 챙기세요. 이거 빼먹으면 값이 아니라 셀 객체가 줄줄이 나와서 또 .value를 붙여야 해요. 귀찮아지거든요.
자주 만나는 에러
직장인이 백 번은 만나게 될 에러가 두 개 있어요.
PermissionError: [Errno 13] Permission denied
엑셀에서 그 파일을 열어둔 채로 파이썬에서 저장하려고 하면 무조건 이 에러가 떠요. 해결법은 단순해요. 엑셀 창에서 파일을 닫고 다시 실행하시면 됩니다. 저는 코드 돌리기 전에 엑셀부터 끄는 게 습관이 됐어요.
openpyxl does not support the old .xls file format
.xls 옛날 파일을 열려고 할 때 나와요. 엑셀에서 한번 연 다음에 .xlsx로 다시 저장해 주시면 끝납니다.
실습 과제
본인 부서나 가족 명단으로 직접 만들어 보세요.
- 새 워크북 만들기
- A1, B1, C1에 "이름", "나이", "역할" 헤더 넣기
append로 3명 이상 데이터 추가명단.xlsx로 저장- 다시
load_workbook으로 열어서iter_rows로 전부 출력
힌트: 위 코드들을 순서대로 이어 붙이기만 하면 됩니다. 너무 깊게 생각 안 하셔도 돼요.
이제 엑셀 파일 한 개를 자유자재로 다루실 수 있게 됐어요. 근데 회사 일이라는 게 보통 파일 한 개로 안 끝나잖아요. 월별로 흩어진 매출 엑셀 12개를 한 파일로 합쳐야 할 때가 옵니다. 다음에는 여러 엑셀 파일을 한 번에 모으는 작업을 해볼 거예요.
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
'Application > Python' 카테고리의 다른 글
| [Python] 07. 파이썬으로 엑셀 자동 보고서 만들기 (서식과 차트) (0) | 2026.06.17 |
|---|---|
| [Python] 06. 파이썬으로 여러 엑셀 파일 하나로 합치기 (0) | 2026.06.16 |
| [Python] 04. 파이썬으로 폴더별 파일 자동 분류하기 (확장자별 정리) (0) | 2026.06.12 |
| [Python] 03. 파이썬으로 파일 이름 일괄 변경 자동화하기 (0) | 2026.06.11 |
| [Python] 02. 파이썬으로 폴더와 파일 다루기: os, pathlib 완벽 정리 (0) | 2026.06.10 |