openpyxl, pandas, xlwings 뭐가 다를까? 파이썬 엑셀 라이브러리 3종 비교
openpyxl, pandas, xlwings 뭐가 다를까? 파이썬 엑셀 라이브러리 3종 비교
이 블로그에서 엑셀 자동화 글을 30편 가까이 쓰면서 openpyxl과 pandas를 상황에 따라 섞어 사용했습니다. "왜 어떤 글은 openpyxl을 쓰고 어떤 글은 pandas를 쓰는지" 궁금하셨던 분들이 계실 것 같아, 이번에는 완성 코드를 공개하는 대신 세 라이브러리의 차이를 직접 비교해 정리해보려 합니다. 파이썬으로 엑셀을 처음 다뤄보는 분이라면 이 글 하나로 어떤 도구를 배워야 할지 방향을 잡을 수 있을 것입니다.
세 라이브러리, 한 줄 요약
먼저 각각이 무엇을 위해 만들어졌는지부터 명확히 하고 시작하겠습니다.
openpyxl → 엑셀 파일을 "직접 읽고 쓰는" 라이브러리. 셀 하나하나를 세밀하게 제어. pandas → 엑셀을 "데이터 표"로 취급해서 분석·가공하는 라이브러리. 통계·집계에 최적화. xlwings → 설치된 엑셀 프로그램 자체를 "리모컨처럼" 조작하는 라이브러리. 실시간 연동.
셋 다 "파이썬으로 엑셀을 다룬다"는 목적은 같지만, 접근 방식이 완전히 다릅니다. 아래에서 같은 작업을 세 가지 방식으로 각각 구현해보면 차이가 명확해집니다.
비교 1 — 셀에 값 쓰고 서식 적용하기
가장 기본적인 "A1 셀에 제목을 쓰고 굵게 표시하기" 작업을 세 라이브러리로 각각 구현하면 이렇게 다릅니다.
openpyxl (가장 세밀한 제어)
from openpyxl import Workbook
from openpyxl.styles import Font
wb = Workbook()
ws = wb.active
ws["A1"] = "월간 매출 보고서"
ws["A1"].font = Font(bold=True, size=14, color="2E5090")
wb.save("report.xlsx")
pandas (데이터 중심, 서식은 약함)
import pandas as pd
df = pd.DataFrame({"제목": ["월간 매출 보고서"]})
df.to_excel("report.xlsx", index=False, header=False)
# ⚠ pandas만으로는 굵게 표시 같은 서식 적용이 불가능함
# (서식이 필요하면 결국 openpyxl을 함께 써야 함)
xlwings (엑셀이 설치돼 있어야 하지만 실시간 반영)
import xlwings as xw
app = xw.App(visible=True) # 실제 엑셀 창이 화면에 뜸
wb = app.books.add()
ws = wb.sheets[0]
ws["A1"].value = "월간 매출 보고서"
ws["A1"].font.bold = True
wb.save("report.xlsx")
💡 여기서 알 수 있는 것: 셀 서식(굵기, 색상, 테두리)을 세밀하게 다루려면 pandas만으로는 부족합니다. 이 블로그의 엑셀 데이터 자동 입력 편이나 엑셀 대시보드 편에서 openpyxl을 사용한 이유가 바로 이것입니다.
비교 2 — 수천 행 데이터 합계·평균 구하기
이번엔 "매출금액 열의 합계와 평균을 구하는" 데이터 분석 작업을 비교합니다.
pandas (압도적으로 간단)
import pandas as pd
df = pd.read_excel("매출데이터.xlsx")
total = df["매출금액"].sum()
average = df["매출금액"].mean()
print(f"합계: {total:,} / 평균: {average:,.0f}")
openpyxl (직접 반복문으로 계산)
from openpyxl import load_workbook
wb = load_workbook("매출데이터.xlsx")
ws = wb.active
values = [cell.value for cell in ws["D"][1:] if cell.value is not None]
total = sum(values)
average = total / len(values)
print(f"합계: {total:,} / 평균: {average:,.0f}")
💡 여기서 알 수 있는 것: 합계·평균·필터링·정렬 같은 데이터 분석 작업은 pandas가 압도적으로 편합니다. 이 블로그의 엑셀 정렬·필터링 편, 피벗 테이블 편이 모두 pandas 중심으로 작성된 이유입니다. openpyxl로도 가능하지만 코드가 훨씬 길어집니다.
비교 3 — 매크로처럼 엑셀을 실시간으로 조작하기
"엑셀 파일을 열어서 사용자가 보는 동안 실시간으로 값을 갱신"하는 것은 openpyxl과 pandas 둘 다 할 수 없는 영역입니다.
import xlwings as xw
import time
wb = xw.Book("실시간대시보드.xlsx") # 이미 열려 있는 엑셀 파일에 연결
ws = wb.sheets["대시보드"]
for i in range(5):
ws["B2"].value = f"업데이트 {i+1}회차"
time.sleep(2) # 2초마다 화면에 실시간으로 값이 바뀌는 것이 보임
💡 여기서 알 수 있는 것: openpyxl과 pandas는 파일을 저장한 후에야 결과를 확인할 수 있습니다. 반면 xlwings는 사용자가 화면으로 보고 있는 엑셀을 실시간으로 조작할 수 있습니다. 대신 반드시 PC에 엑셀 프로그램이 설치되어 있어야 하고, 서버 환경(엑셀이 없는 환경)에서는 사용할 수 없다는 제약이 있습니다. 이 블로그의 엑셀 암호 설정 편에서 유사한 이유로 win32com을 사용했던 것도 같은 맥락입니다.
한눈에 보는 종합 비교표
openpyxl pandas xlwings 엑셀 설치 필요 ✗ 불필요 ✗ 불필요 ✓ 필수 서버에서 사용 ✓ 가능 ✓ 가능 ✗ 불가능 서식 제어 ✓ 매우 세밀 ✗ 거의 불가 ✓ 세밀 데이터 분석 △ 번거로움 ✓ 매우 편리 △ 번거로움 대용량 처리 속도 △ 보통 ✓ 빠름 ✗ 느림 (엑셀 구동) 실시간 화면 반영 ✗ 불가능 ✗ 불가능 ✓ 가능 차트·피벗 삽입 ✓ 지원 △ 제한적 ✓ 완벽 지원(엑셀 자체) 배우기 난이도 보통 쉬움 보통
결론 — 상황별 선택 기준
세 라이브러리 중 무엇을 배워야 할지 고민된다면, 아래 기준으로 판단하시면 됩니다.
pandas를 선택하세요, 만약:
데이터를 읽어서 계산·필터링·집계·병합하는 것이 목적이라면. 이 블로그에서 가장 많이 사용된 라이브러리이기도 합니다. 엑셀을 "표 형태의 데이터"로만 다루고 싶다면 pandas 하나로 충분한 경우가 많습니다.
openpyxl을 선택하세요, 만약:
글자 색상, 셀 배경, 테두리, 수식, 조건부 서식처럼 엑셀 파일 자체의 모양을 세밀하게 제어해야 한다면. 서버나 자동화 스크립트 환경(엑셀이 설치되지 않은 곳)에서도 동작해야 한다면 openpyxl이 유일한 선택지입니다.
xlwings를 선택하세요, 만약:
사람이 실제로 엑셀 화면을 보면서 작업 중일 때 파이썬이 실시간으로 개입해야 하거나, VBA 매크로가 하던 일을 완전히 대체하면서 엑셀 자체 기능(피벗, 차트 마법사 등)을 그대로 활용해야 한다면. 다만 반드시 로컬 PC에 엑셀이 설치되어 있어야 하는 제약을 감안해야 합니다.
실무에서는 섞어서 씁니다.
이 블로그의 많은 글도 실제로는 pandas로 데이터를 분석한 뒤, 서식이 필요한 부분만 openpyxl로 넘겨 처리하는 방식을 사용했습니다. 하나만 배우고 끝내기보다, pandas로 데이터 다루는 법을 먼저 익히고 서식이 필요할 때 openpyxl을 추가로 배우는 순서를 권장합니다.
핵심 요약
- pandas: 데이터 분석·집계·필터링에 최적, 서식 제어는 약함
- openpyxl: 셀 서식·수식·차트를 세밀하게 제어, 서버 환경에서도 동작
- xlwings: 실제 엑셀 프로그램을 실시간 조작, 반드시 엑셀 설치 필요
- 실무 팁: pandas로 데이터를 처리하고 openpyxl로 서식을 입히는 조합이 가장 흔한 패턴
