파이썬 openpyxl로 엑셀 파일을 만들고, 읽고, 수정하고, 저장하는 기본 흐름을 초보자 기준으로 정리합니다. 자주 발생하는 오류와 사용 시 주의할 점도 함께 다룹니다.
엑셀 파일을 매번 열어서 값을 붙여넣고, 날짜를 바꾸고, 합계를 확인하는 작업이 반복된다면 openpyxl을 써볼 만합니다. 파이썬으로 .xlsx 파일을 만들고, 읽고, 수정하고, 다시 저장할 수 있기 때문입니다.
다만 처음부터 “회사 업무 전체를 자동화하겠다”는 식으로 접근하면 금방 막힙니다. 먼저 엑셀 파일 구조를 파이썬 코드로 어떻게 다루는지 이해하는 게 중요합니다.
이 글은 openpyxl을 처음 쓰는 사람을 기준으로, 가장 기본이 되는 흐름만 정리합니다.
- 엑셀 파일 새로 만들기
- 셀에 값 입력하기
- 기존 엑셀 파일 읽기
- 기존 파일 수정 후 저장하기
- 자주 발생하는 오류 확인하기
openpyxl은 버전에 따라 일부 사용법이 달라질 수 있습니다. 이 글은 2026년 6월 기준으로 공개된 openpyxl 문서와 PyPI 정보를 바탕으로 작성했습니다.
openpyxl은 언제 쓰면 좋을까?
openpyxl은 파이썬에서 엑셀 파일을 다룰 때 많이 쓰는 라이브러리입니다. 특히 .xlsx 파일을 직접 만들거나 수정할 때 유용합니다.
예를 들면 이런 작업에 사용할 수 있습니다.
- 매일 같은 양식의 엑셀 보고서 만들기
- 기존 엑셀 파일에서 특정 셀 값 읽기
- 여러 행의 데이터를 자동으로 추가하기
- 엑셀 파일의 시트 이름, 셀 값, 간단한 스타일 수정하기
- 반복적인 정산표, 재고표, 목록 파일 생성하기
여기서 중요한 점은 openpyxl이 “엑셀 프로그램을 대신 클릭해주는 도구”는 아니라는 점입니다.
엑셀 앱을 자동으로 실행해서 마우스로 조작하는 방식이 아니라, .xlsx 파일 자체를 파이썬 코드로 읽고 쓰는 방식에 가깝습니다.
그래서 단순한 반복 파일 작업에는 잘 맞지만, 엑셀 화면에서 버튼을 누르거나 매크로를 실행하는 자동화와는 성격이 다릅니다.
openpyxl 설치하기
먼저 터미널에서 openpyxl을 설치합니다.
pip install openpyxl
가상환경을 사용 중이라면 가상환경을 먼저 활성화한 뒤 설치하는 것이 좋습니다.
예를 들어 macOS나 Linux에서는 다음처럼 사용할 수 있습니다.
python -m venv .venv
source .venv/bin/activate
pip install openpyxl
Windows PowerShell에서는 보통 다음 흐름을 사용합니다.
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install openpyxl
설치가 잘 되었는지 확인하려면 파이썬에서 import 해보면 됩니다.
import openpyxl
print(openpyxl.__version__)
이 코드에서 에러가 나지 않으면 기본 설치는 완료된 상태입니다.
openpyxl의 기본 구조 이해하기
openpyxl을 쓰기 전에 엑셀 파일 구조를 간단히 정리하면 이해가 쉬워집니다.
엑셀 파일은 대략 이런 구조입니다.
엑셀 파일 Workbook
└── 시트 Worksheet
└── 셀 Cell
예를 들어 sales.xlsx라는 파일 안에 1월매출, 2월매출 같은 시트가 있고, 각 시트 안에 A1, B2 같은 셀이 있는 구조입니다.
openpyxl 코드에서도 이 구조를 그대로 다룹니다.
Workbook: 엑셀 파일 전체Worksheet: 엑셀 파일 안의 시트Cell: 시트 안의 개별 셀
이 구조를 알고 있으면 코드가 훨씬 덜 낯설게 보입니다.
새 엑셀 파일 만들기
가장 먼저 새 엑셀 파일을 만들어보겠습니다.
파일명은 create_excel.py로 작성합니다.
# create_excel.py
from openpyxl import Workbook
# 새 엑셀 파일 생성
workbook = Workbook()
# 현재 활성화된 시트 선택
sheet = workbook.active
# 시트 이름 변경
sheet.title = "매출현황"
# 셀에 값 입력
sheet["A1"] = "상품명"
sheet["B1"] = "수량"
sheet["C1"] = "단가"
sheet["A2"] = "키보드"
sheet["B2"] = 3
sheet["C2"] = 50000
sheet["A3"] = "마우스"
sheet["B3"] = 5
sheet["C3"] = 20000
# 엑셀 파일 저장
workbook.save("sales_report.xlsx")
실행합니다.
python create_excel.py
실행 후 같은 폴더에 sales_report.xlsx 파일이 만들어졌다면 성공입니다.
실제로는 여기서부터 엑셀 자동화가 시작됩니다. 사람이 직접 엑셀을 열고 표를 만드는 대신, 파이썬 코드가 정해진 형식으로 파일을 만들어주는 방식입니다.
셀 값 입력 방식: A1 방식과 row/column 방식
openpyxl에서는 셀을 지정하는 방법이 크게 두 가지입니다.
첫 번째는 엑셀에서 익숙한 A1, B2 방식입니다.
sheet["A1"] = "이름"
sheet["B1"] = "점수"
두 번째는 행 번호와 열 번호를 사용하는 방식입니다.
sheet.cell(row=1, column=1).value = "이름"
sheet.cell(row=1, column=2).value = "점수"
처음에는 A1 방식이 더 직관적입니다. 하지만 반복문을 사용할 때는 row, column 방식이 더 편합니다.
예를 들어 여러 명의 점수를 한 번에 입력할 때는 다음처럼 작성할 수 있습니다.
# write_rows.py
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
sheet.title = "점수표"
students = [
["이름", "국어", "영어", "수학"],
["김민수", 90, 85, 88],
["이서연", 78, 92, 81],
["박지훈", 88, 76, 95],
]
for row_index, row_data in enumerate(students, start=1):
for column_index, value in enumerate(row_data, start=1):
sheet.cell(row=row_index, column=column_index).value = value
workbook.save("score.xlsx")
여기서 enumerate(..., start=1)을 사용한 이유는 엑셀의 행과 열 번호가 1부터 시작하기 때문입니다.
파이썬 리스트 인덱스는 0부터 시작하지만, 엑셀의 첫 번째 행은 1행이고 첫 번째 열은 A열입니다. 이 부분을 헷갈리면 값이 예상과 다른 위치에 들어갈 수 있습니다.
기존 엑셀 파일 읽기
이번에는 이미 존재하는 엑셀 파일을 읽어보겠습니다.
앞에서 만든 sales_report.xlsx 파일을 기준으로 설명합니다.
파일명은 read_excel.py로 작성합니다.
# read_excel.py
from openpyxl import load_workbook
workbook = load_workbook("sales_report.xlsx")
sheet = workbook["매출현황"]
print(sheet["A1"].value)
print(sheet["B2"].value)
print(sheet["C3"].value)
실행합니다.
python read_excel.py
예상 출력은 다음과 비슷합니다.
상품명
3
20000
기존 엑셀 파일을 열 때는 Workbook()이 아니라 load_workbook()을 사용합니다.
이 부분을 자주 헷갈립니다.
- 새 파일을 만들 때:
Workbook() - 기존 파일을 읽을 때:
load_workbook("파일명.xlsx")
기존 엑셀 파일 수정하기
기존 파일을 읽은 뒤 특정 값을 수정하고 다시 저장할 수도 있습니다.
# update_excel.py
from openpyxl import load_workbook
workbook = load_workbook("sales_report.xlsx")
sheet = workbook["매출현황"]
# 기존 값 수정
sheet["B2"] = 10
# 새 행 추가
sheet.append(["모니터", 2, 180000])
# 다른 이름으로 저장
workbook.save("sales_report_updated.xlsx")
여기서 sheet.append()는 시트의 마지막 행 다음에 데이터를 추가합니다.
실무에서는 원본 파일을 바로 덮어쓰기보다, 처음에는 다른 이름으로 저장하는 편이 안전합니다.
workbook.save("sales_report_updated.xlsx")
이렇게 하면 실수로 원본 파일을 망가뜨렸을 때 다시 돌아갈 수 있습니다.
여러 행을 읽는 방법
엑셀 자동화에서는 특정 셀 하나만 읽는 경우보다 여러 행을 반복해서 읽는 경우가 더 많습니다.
# read_rows.py
from openpyxl import load_workbook
workbook = load_workbook("sales_report.xlsx")
sheet = workbook["매출현황"]
for row in sheet.iter_rows(min_row=2, values_only=True):
product_name = row[0]
quantity = row[1]
price = row[2]
print(product_name, quantity, price)
min_row=2를 사용한 이유는 첫 번째 행이 제목 행이기 때문입니다.
상품명 | 수량 | 단가
이런 헤더 행까지 데이터로 처리하면 계산이나 저장 과정에서 오류가 생길 수 있습니다.
values_only=True를 사용하면 셀 객체가 아니라 셀 안의 값만 가져옵니다. 초보자 입장에서는 이 옵션을 켜고 시작하는 편이 이해하기 쉽습니다.
간단한 합계 열 추가하기
이번에는 수량과 단가를 곱해서 합계 열을 만들어보겠습니다.
# add_total.py
from openpyxl import load_workbook
workbook = load_workbook("sales_report.xlsx")
sheet = workbook["매출현황"]
# 헤더 추가
sheet["D1"] = "합계"
# 2행부터 마지막 행까지 반복
for row_number in range(2, sheet.max_row + 1):
quantity = sheet[f"B{row_number}"].value
price = sheet[f"C{row_number}"].value
total = quantity * price
sheet[f"D{row_number}"] = total
workbook.save("sales_report_with_total.xlsx")
여기서 sheet.max_row는 현재 시트에서 사용 중인 마지막 행 번호를 의미합니다.
이 예시는 단순하지만 실제 업무 자동화에 꽤 자주 쓰이는 패턴입니다.
- 기존 파일 읽기
- 특정 열 값 가져오기
- 계산하기
- 새 열에 결과 입력하기
- 새 파일로 저장하기
이 흐름만 익혀도 반복적인 엑셀 작업을 꽤 많이 줄일 수 있습니다.
엑셀 수식 입력하기
openpyxl로 엑셀 수식도 입력할 수 있습니다.
# add_formula.py
from openpyxl import load_workbook
workbook = load_workbook("sales_report.xlsx")
sheet = workbook["매출현황"]
sheet["D1"] = "합계"
sheet["D2"] = "=B2*C2"
sheet["D3"] = "=B3*C3"
workbook.save("sales_report_formula.xlsx")
주의할 점이 있습니다.
openpyxl은 수식을 “입력”할 수는 있지만, 엑셀처럼 수식을 직접 계산하는 도구는 아닙니다.
즉, =B2*C2라는 수식을 파일에 넣을 수는 있지만, 계산 결과를 바로 파이썬에서 기대하면 안 됩니다. 수식 계산은 보통 엑셀 프로그램에서 파일을 열 때 처리됩니다.
이 부분을 오해하기 쉽습니다.
계산 결과가 파이썬 코드 안에서 바로 필요하다면 수식 문자열을 넣기보다, 앞에서 본 것처럼 파이썬에서 직접 계산해서 값을 넣는 방식이 더 단순합니다.
자주 발생하는 오류와 해결 방법
1. ModuleNotFoundError: No module named 'openpyxl'
ModuleNotFoundError: No module named 'openpyxl'
openpyxl이 설치되지 않았거나, 설치한 파이썬 환경과 실행 중인 파이썬 환경이 다른 경우입니다.
먼저 다음 명령어로 설치합니다.
pip install openpyxl
그래도 안 된다면 현재 사용하는 파이썬에 직접 설치합니다.
python -m pip install openpyxl
가상환경을 사용 중이라면 가상환경이 활성화되어 있는지도 확인해야 합니다.
2. FileNotFoundError: 파일을 찾을 수 없음
FileNotFoundError: [Errno 2] No such file or directory: 'sales_report.xlsx'
이 오류는 코드에서 지정한 엑셀 파일이 현재 실행 위치에 없을 때 발생합니다.
예를 들어 코드에서는 이렇게 작성했는데,
load_workbook("sales_report.xlsx")
실제 파일이 다른 폴더에 있으면 오류가 납니다.
해결 방법은 두 가지입니다.
첫 번째는 파이썬 파일과 엑셀 파일을 같은 폴더에 두는 것입니다.
두 번째는 파일 경로를 정확히 지정하는 것입니다.
load_workbook("data/sales_report.xlsx")
처음 연습할 때는 같은 폴더에 두고 시작하는 편이 덜 헷갈립니다.
3. KeyError: Worksheet does not exist
KeyError: 'Worksheet 매출현황 does not exist.'
엑셀 파일 안에 해당 이름의 시트가 없을 때 발생합니다.
예를 들어 코드에서 이렇게 작성했는데,
sheet = workbook["매출현황"]
실제 시트 이름이 Sheet, 매출 현황, 매출현황 처럼 다르면 오류가 납니다.
시트 이름을 먼저 확인해보면 됩니다.
print(workbook.sheetnames)
출력된 이름을 그대로 복사해서 사용하는 것이 가장 안전합니다.
4. PermissionError: 파일 권한 오류
PermissionError: [Errno 13] Permission denied: 'sales_report.xlsx'
Windows 환경에서 자주 볼 수 있는 오류입니다.
대부분 엑셀 파일을 Microsoft Excel에서 열어둔 상태로 파이썬에서 저장하려고 할 때 발생합니다.
해결 방법은 간단합니다.
엑셀 프로그램에서 해당 파일을 닫고 다시 실행하면 됩니다.
운영 자동화에서는 이 문제를 막기 위해 원본 파일을 직접 덮어쓰기보다 결과 파일을 새 이름으로 저장하는 방식이 더 안전합니다.
openpyxl을 쓸 때 알아두면 좋은 제한사항
openpyxl은 편리하지만 모든 엑셀 작업에 적합한 도구는 아닙니다.
다음 상황에서는 주의가 필요합니다.
| 상황 | 주의할 점 |
|---|---|
.xls 파일 처리 |
openpyxl은 주로 .xlsx 계열 파일에 사용한다 |
| 복잡한 엑셀 수식 계산 | 수식 입력은 가능하지만 계산 엔진은 아니다 |
| 엑셀 화면 조작 | 엑셀 앱을 직접 클릭하거나 조작하는 도구는 아니다 |
| 매우 큰 파일 처리 | 파일 크기가 크면 속도와 메모리 사용량을 고려해야 한다 |
| 매크로 실행 | 매크로 실행 자동화 도구로 보면 안 된다 |
특히 .xls와 .xlsx 차이를 헷갈리는 경우가 많습니다.
요즘 엑셀 파일은 대부분 .xlsx지만, 오래된 파일은 .xls일 수 있습니다. 파일 확장자가 .xls라면 openpyxl로 바로 처리하기 어렵기 때문에 파일 형식을 먼저 확인해야 합니다.
실습 예제: 매출표 자동 생성하기
마지막으로 간단한 실습 예제를 하나로 정리해보겠습니다.
목표는 상품명, 수량, 단가 데이터를 이용해서 엑셀 매출표를 자동 생성하는 것입니다.
파일명은 sales_automation.py로 작성합니다.
# sales_automation.py
from openpyxl import Workbook
from openpyxl.styles import Font
sales_data = [
["키보드", 3, 50000],
["마우스", 5, 20000],
["모니터", 2, 180000],
["노트북 거치대", 4, 35000],
]
workbook = Workbook()
sheet = workbook.active
sheet.title = "매출현황"
# 헤더 작성
headers = ["상품명", "수량", "단가", "합계"]
sheet.append(headers)
# 헤더 글씨 굵게
for cell in sheet[1]:
cell.font = Font(bold=True)
# 데이터 작성
for item in sales_data:
product_name = item[0]
quantity = item[1]
price = item[2]
total = quantity * price
sheet.append([product_name, quantity, price, total])
# 열 너비 조정
sheet.column_dimensions["A"].width = 18
sheet.column_dimensions["B"].width = 10
sheet.column_dimensions["C"].width = 12
sheet.column_dimensions["D"].width = 12
workbook.save("monthly_sales.xlsx")
실행합니다.
python sales_automation.py
결과로 monthly_sales.xlsx 파일이 생성됩니다.
위 코드에서 Font(bold=True)는 첫 번째 행의 제목 글씨를 굵게 만드는 역할을 합니다. column_dimensions["A"].width처럼 열 너비를 지정하면 엑셀 파일을 열었을 때 값이 잘리지 않아 결과물을 확인하기 편합니다.
다만 서식 자동화는 처음부터 많이 넣기보다, 데이터 입력과 저장 흐름을 먼저 익힌 뒤 필요한 만큼만 추가하는 편이 좋습니다. 엑셀 자동화의 핵심은 화려한 디자인보다 정확한 데이터를 반복해서 안정적으로 넣는 것입니다.

위 이미지는 sales_automation.py를 실행한 뒤 생성된 monthly_sales.xlsx 파일을 열어 캡처하면 됩니다. 상품명, 수량, 단가, 합계가 표 형태로 들어간 화면을 보여주면 독자가 코드 실행 결과를 바로 이해할 수 있습니다.
이 예제는 단순하지만 엑셀 자동화의 기본 흐름을 대부분 포함합니다.
- 데이터를 리스트로 준비한다
- 새 엑셀 파일을 만든다
- 헤더를 작성한다
- 반복문으로 데이터를 넣는다
- 계산 결과를 추가한다
- 보기 좋게 일부 스타일을 적용한다
- 파일로 저장한다
실제로는 sales_data 부분을 데이터베이스, CSV 파일, API 응답, 크롤링 결과 등으로 바꿔서 사용할 수 있습니다.
openpyxl 기초 학습 순서
openpyxl을 처음 배운다면 모든 기능을 한 번에 보려고 하지 않는 편이 좋습니다.
다음 순서로 익히면 덜 막힙니다.
- 새 엑셀 파일 만들기
- 셀에 값 입력하기
- 기존 엑셀 파일 읽기
- 반복문으로 여러 행 읽고 쓰기
- 기존 파일 수정 후 다른 이름으로 저장하기
- 간단한 스타일 적용하기
- 실제 반복 업무 파일에 적용하기
처음부터 차트, 이미지, 병합 셀, 복잡한 스타일을 다루면 코드가 금방 복잡해집니다.
먼저 “값을 읽고 쓰는 자동화”부터 익히는 것이 좋습니다. 대부분의 업무 자동화는 화려한 서식보다 정확한 데이터 입력과 저장이 더 중요합니다.
마무리
openpyxl은 파이썬으로 엑셀 파일을 다룰 때 입문자가 접근하기 좋은 라이브러리입니다. 새 파일을 만들고, 기존 파일을 읽고, 셀 값을 수정하고, 반복문으로 여러 행을 처리하는 기본 흐름만 익혀도 반복적인 엑셀 작업을 줄일 수 있습니다.
다만 openpyxl을 엑셀 프로그램 자체의 대체재로 보면 안 됩니다. 수식 계산, 매크로 실행, 화면 조작까지 모두 처리하는 도구가 아니라 .xlsx 파일을 코드로 읽고 쓰는 도구에 가깝습니다.
처음에는 원본 파일을 바로 덮어쓰지 말고, 항상 다른 이름으로 저장하면서 연습하는 것이 안전합니다. 그다음 자주 반복하는 보고서나 정리 파일 하나를 골라 작은 자동화부터 적용해보면 됩니다.
'개발 > python' 카테고리의 다른 글
| 파이썬으로 반복 작업 자동화하는 예시 4가지 (0) | 2026.05.22 |
|---|---|
| 파이썬 모듈과 패키지: import로 코드를 나누고 재사용하는 방법 (0) | 2026.05.22 |
| 파이썬 파일 입출력: 텍스트 파일 읽고 쓰는 기본 방법 (0) | 2026.05.22 |
| 파이썬 예외 처리: 오류가 나도 프로그램이 멈추지 않게 하는 방법 (0) | 2026.05.22 |
| 파이썬 함수: 반복되는 코드를 줄이고 재사용하는 방법 (0) | 2026.05.22 |