![[파이썬 05] 파이썬으로 엑셀 자동화 시작하기](https://img.thenullpage.com/posts/5383/5383_1_189c70.webp)
엑셀은 데이터 정리에 있어 거의 모든 회사에서 쓰는 표준 도구지만, 반복적인 작업에서는 한계가 뚜렷하다.
실제로 엑셀 사용자의 상당수가 여러 스프레드시트를 통합하는 데 많은 시간을 쓰고 있으며, 직원들이 매달 파일들을 합치는 데만 평균 12시간가량을 쓴다는 조사 결과도 있다. 매주 같은 형식의 파일 여러 개에 똑같은 수식과 서식을 반복 적용해야 하는 업무가 대표적이다.
이런 반복 작업을 대신 처리해주는 것이 파이썬의 openpyxl 라이브러리다.
1. openpyxl이 뭐고 왜 쓰나
openpyxl은 엑셀 2007 이후 형식(.xlsx, .xlsm)의 파일을 파이썬에서 직접 읽고 쓸 수 있게 해주는 라이브러리다.
서버 환경이나 자동화된 리포트 시스템, 대규모 데이터 처리 파이프라인에 적합한 도구로 꼽히며, 판다스(pandas)를 포함한 다른 여러 파이썬 라이브러리도 내부적으로 openpyxl을 엑셀 인터페이스로 사용할 만큼 신뢰성이 검증된 도구다. 다만 구형 .xls 포맷은 지원하지 않고, 수식을 읽고 쓸 수는 있지만 직접 계산(평가)하지는 않는다는 제약이 있다.
설치는 터미널에서 다음 명령어 한 줄이면 끝난다.
pip install openpyxl
2. 엑셀 파일 읽어오기
openpyxl에서 엑셀 파일 하나는 워크북(Workbook), 그 안의 각 탭은 워크시트(Worksheet), 그리고 각 칸은 셀(Cell)이라는 개념으로 다뤄진다. 열은 알파벳(A, B, C...), 행은 숫자(1, 2, 3...)로 표현되고, 이 둘이 만나는 지점이 셀이다.
from openpyxl import load_workbook
wb = load_workbook('데이터.xlsx')
ws = wb.active # 현재 활성화된 시트 가져오기
# 셀 하나의 값 읽기
print(ws['A1'].value)
# 행/열 개수 확인
print(ws.max_row, ws.max_column)
여러 행을 한 번에 훑어야 할 땐 반복문과 조합해서 쓴다. 이전 편에서 다룬 for문이 여기서 그대로 활용된다.
for row in range(1, ws.max_row + 1):
name = ws.cell(row=row, column=1).value
age = ws.cell(row=row, column=2).value
print(name, age)
3. 새 엑셀 파일 만들고 데이터 쓰기
기존 파일을 수정하는 것 말고, 아예 새 엑셀 파일을 코드로 생성하는 것도 가능하다.
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "직원명단"
ws['A1'] = "이름"
ws['B1'] = "부서"
ws['C1'] = "연봉"
data = [
("김철수", "영업팀", 4200),
("이영희", "개발팀", 4800),
("박민수", "마케팅팀", 4000),
]
for row in data:
ws.append(row)
wb.save("직원명단.xlsx")
append() 메서드를 쓰면 리스트나 튜플 형태의 데이터를 한 줄씩 시트에 추가할 수 있다. 앞서 다룬 "리스트 안에 튜플/딕셔너리" 구조가 실제로 엑셀 데이터를 다룰 때 이렇게 바로 쓰인다.
4. 수식과 서식도 코드로 넣을 수 있다
openpyxl은 셀에 값을 넣는 것뿐 아니라 수식도 그대로 삽입할 수 있다. 단, 앞서 언급했듯 openpyxl 자체는 그 수식을 계산하지 않고, 엑셀에서 파일을 열었을 때 엑셀이 계산해서 보여주는 방식이다.
ws['C4'] = "=SUM(C2:C3)"
폰트, 색상, 셀 크기 같은 서식도 지정할 수 있다. 예를 들어 특정 조건을 만족하는 셀에 색을 입히는 조건부 서식도 코드로 구현 가능하다. 실제로 매출 데이터에서 특정 기준값 이상인 셀만 자동으로 강조 표시하는 식의 활용이 흔히 소개된다.
5. 실전, 여러 파일 일괄 처리
openpyxl이 진가를 발휘하는 지점은 파일 하나를 다루는 게 아니라, 여러 워크시트나 여러 파일에 걸쳐 같은 작업을 반복 적용할 때다. 워크북 안의 여러 시트를 순회하면서 같은 분석 로직을 한 번에 실행하는 것도 코드 몇 줄이면 가능하고, 이 방식은 매주 반복되는 리포트 취합 작업 같은 데 특히 유용하다.
import os
from openpyxl import load_workbook
folder = "월간보고서"
for filename in os.listdir(folder):
if filename.endswith(".xlsx"):
wb = load_workbook(os.path.join(folder, filename))
ws = wb.active
total = sum(ws.cell(row=r, column=3).value for r in range(2, ws.max_row + 1))
print(f"{filename} 합계: {total}")
이 코드는 폴더 안의 모든 xlsx 파일을 순서대로 열어서 3번째 열의 합계를 자동으로 뽑아내는 예시다. 파일이 10개든 100개든 코드는 그대로 유지되고 반복 횟수만 늘어난다는 게 핵심이다.
6. openpyxl vs pandas, 뭘 써야 하나
엑셀을 다루는 파이썬 라이브러리로 pandas도 자주 언급되는데, 선택 기준은 명확하다. 셀 서식, 수식, 차트처럼 엑셀 파일 자체의 모양과 구조를 세밀하게 제어해야 한다면 openpyxl을, 데이터를 필터링하거나 집계하거나 재구성하는 분석 작업이 중심이라면 pandas를 쓰는 게 일반적으로 권장된다. 실제로 두 라이브러리를 함께 써서 pandas로 데이터를 분석한 뒤 openpyxl로 서식을 입히는 방식도 흔하다.
7. 정리
엑셀 자동화의 핵심은 "사람이 손으로 반복하던 작업을 코드가 대신 반복하게 만드는 것"이다. openpyxl은 셀 단위로 세밀하게 제어할 수 있다는 장점이 있고, 파일 하나짜리 작업보다 여러 시트·여러 파일에 걸친 반복 작업에서 효과가 극대화된다.