본문 바로가기
카테고리 없음

openpyxl 완벽 정리: 엑셀 파일을 읽고 쓰는 첫 단계

by jbparkbill 2025. 10. 29.
반응형

 

openpyxl은 파이썬으로 엑셀(xlsx)을 읽고 쓰는 표준 라이브러리입니다. 이 글에서는 설치, 워크북/시트 생성, 셀 읽기·쓰기, 서식, 수식, 차트, 저장까지 실무에 바로 쓰이는 기초를 단계별로 설명합니다. 각 절의 코드는 그대로 복사해 실행할 수 있도록 구성했습니다.

왜 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)로 값 처리
  • 서식·테두리·열 너비 조정으로 가독성 향상
  • 수식 입력과 합계 계산 검증
  • 차트 생성

openpyxl 완벽 정리
openpyxl 완벽 정리

 

 

반응형