왜 openpyxl인가
openpyxl은 엑셀의 표준 포맷인 xlsx 읽기·쓰기에 최적화되어 있으며, 셀 서식, 수식, 조건부 서식, 차트 등 업무 문서에 필요한 주요 기능을 모두 제공합니다. 특히 사내 보고서 양식이 고정되어 있는 환경에서 반복 보고를 자동화하기에 적합합니다.
- 설치가 간단하고 파이썬 표준 패키지처럼 사용 가능
- 읽기, 쓰기, 서식, 수식, 차트 등 핵심 기능 지원
- pandas와 함께 사용하면 대용량 데이터 처리 효율 상승
설치와 프로젝트 준비
가상환경을 권장합니다. 프로젝트별로 라이브러리 버전을 분리하면 충돌을 예방할 수 있습니다.
# 새 폴더 생성 후 진입
mkdir excel-openpyxl && cd excel-openpyxl
# 가상환경 생성 및 활성화 (Windows)
python -m venv .venv
. .venv/Scripts/Activate.ps1
# macOS / Linux
python3 -m venv .venv
source .venv/bin/activate
# 패키지 설치
pip install --upgrade pip
pip install openpyxl
설치 확인:
python -c "import openpyxl; print(openpyxl.__version__)"
워크북과 시트 만들기
새 워크북을 만들고 시트를 추가·이름 변경하는 흐름입니다.
# file: 01_create_workbook.py
from openpyxl import Workbook
wb = Workbook() # 새 워크북
ws = wb.active # 기본 시트
ws.title = "보고서"
# 시트 추가
ws2 = wb.create_sheet("데이터")
ws3 = wb.create_sheet("요약", 0) # 맨 앞에 삽입
wb.save("openpyxl_기본.xlsx")
print("저장 완료")
팁: 시트 이름에 공백·특수문자를 피하면 다른 도구와 연동할 때 안전합니다.
데이터 쓰기와 범위 입력
셀 단위 쓰기와 행 단위로 여러 값을 한번에 쓰는 방법을 함께 익힙니다.
# file: 02_write_cells.py
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "매출"
# 1) 단일 셀 쓰기
ws["A1"] = "월"
ws["B1"] = "매출"
ws["C1"] = "비용"
# 2) 여러 행 입력 (list of lists)
rows = [
["1월", 120, 80],
["2월", 150, 90],
["3월", 180, 110],
]
for r in rows:
ws.append(r)
wb.save("openpyxl_쓰기.xlsx")
print("저장 완료")
범위에 한꺼번에 쓰기
# file: 03_write_range.py
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
wb = Workbook()
ws = wb.active
data = [
["이름","부서","점수"],
["김가람","영업",87],
["이보라","기획",92],
["박민서","개발",95],
]
for row in data:
ws.append(row)
# 열 너비 자동 비슷하게 조정
for col in range(1, 4):
letter = get_column_letter(col)
ws.column_dimensions[letter].width = 14
wb.save("openpyxl_범위쓰기.xlsx")
데이터 읽기와 반복
워크북을 열어 행·열 단위로 반복 처리하는 패턴을 익힙니다.
# file: 04_read_rows.py
from openpyxl import load_workbook
wb = load_workbook("openpyxl_쓰기.xlsx", data_only=True) # 수식 대신 값 읽기
ws = wb["매출"]
for row in ws.iter_rows(min_row=2, values_only=True):
month, sales, cost = row
profit = sales - cost
print(month, sales, cost, profit)
values_only=True로 설정하면 셀 객체 대신 실제 값이 반환되어 계산이 간단해집니다.
서식, 정렬, 테두리, 너비
보고서 품질을 좌우하는 기본 서식 처리 예시입니다.
# file: 05_formatting.py
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
from openpyxl.utils import get_column_letter
wb = Workbook()
ws = wb.active
ws.title = "보고서"
header = ["항목","수량","단가","금액"]
ws.append(header)
items = [
["A제품", 12, 3500],
["B제품", 8, 4200],
["C제품", 5, 9800],
]
for name, qty, price in items:
ws.append([name, qty, price, qty*price])
# 헤더 스타일
for cell in ws[1]:
cell.font = Font(bold=True)
cell.fill = PatternFill("solid", fgColor="E2E8F0")
cell.alignment = Alignment(horizontal="center")
# 테두리
thin = Side(style="thin", color="9CA3AF")
for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=4):
for cell in row:
cell.border = Border(top=thin, bottom=thin, left=thin, right=thin)
# 숫자 형식과 열 너비
for r in range(2, ws.max_row+1):
ws[f"B{r}"].number_format = "#,##0"
ws[f"C{r}"].number_format = "#,##0"
ws[f"D{r}"].number_format = "#,##0"
for col in range(1, 5):
ws.column_dimensions[get_column_letter(col)].width = 14
wb.save("openpyxl_서식.xlsx")
수식과 계산
엑셀 수식은 문자열로 입력합니다. 저장 후 엑셀에서 열면 자동 계산됩니다. 파이썬에서 계산된 값을 저장하려면 data_only=True로 다시 읽어야 합니다.
# file: 06_formula.py
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.append(["수량","단가","금액"])
rows = [(10, 1200), (7, 3500), (3, 9600)]
for qty, price in rows:
ws.append([qty, price, None])
# 금액 = 수량*단가 수식 입력
for r in range(2, ws.max_row+1):
ws[f"C{r}"] = f"=A{r}*B{r}"
# 합계
ws.append(["합계","", f"=SUM(C2:C{ws.max_row})"])
wb.save("openpyxl_수식.xlsx")
차트 추가
간단한 선형 차트를 추가해 추이를 한눈에 보여줍니다.
# file: 07_chart.py
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
wb = Workbook()
ws = wb.active
ws.title = "월별매출"
ws.append(["월","매출"])
for m, v in [("1월",120),("2월",150),("3월",180),("4월",160),("5월",210),("6월",240)]:
ws.append([m, v])
chart = LineChart()
chart.title = "월별 매출 추이"
data = Reference(ws, min_col=2, min_row=1, max_row=ws.max_row)
cats = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
ws.add_chart(chart, "D3")
wb.save("openpyxl_차트.xlsx")
저장과 버전 관리
파일명에 날짜를 포함하면 버전 관리가 쉬워집니다. 결과물은 구글 드라이브나 버전 관리 폴더에 자동 백업하는 것을 권장합니다.
# file: 08_save_version.py
from datetime import datetime
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws["A1"] = "버전 관리 예제"
stamp = datetime.now().strftime("%Y%m%d_%H%M")
wb.save(f"보고서_{stamp}.xlsx")
print("저장 완료")
여러 파일을 생성하는 자동화에서는 출력 폴더를 고정하고, 오래된 파일 정리 스크립트를 함께 두면 저장소를 효율적으로 관리할 수 있습니다.
자주 묻는 질문
openpyxl과 pandas는 무엇이 다른가
pandas는 데이터 분석과 변환에 강하며, 결과를 엑셀로 내보낼 때 주로 사용합니다. openpyxl은 엑셀 서식·차트·수식 등 문서 품질을 세밀하게 제어할 때 유리합니다. 두 도구를 함께 쓰면 가장 효율적입니다.
xls(옛 포맷)도 지원하나
openpyxl은 xlsx 전용입니다. xls는 다른 라이브러리나 엑셀에서 xlsx로 변환한 뒤 처리하세요.
대용량에서 속도가 느리다
셀 단위 반복 대신 ws.append를 활용하고, 서식·테두리 적용을 최소화하세요. 대량 계산은 pandas에서 처리 후 결과만 openpyxl로 쓰는 전략이 좋습니다.
체크리스트
- 가상환경 생성 및 openpyxl 설치 완료
- 워크북/시트 생성, 이름 변경 테스트
- 행 단위 입력과 범위 쓰기 확인
- 읽기 반복 패턴(iter_rows)로 값 처리
- 서식·테두리·열 너비 조정으로 가독성 향상
- 수식 입력과 합계 계산 검증
- 차트 생성
