40대 비전공자 직장인의 파이썬 독학기 6편: openpyxl로 실제 엑셀(.xlsx) 파일 읽고 쓰기 자동화

지금까지 우리는 파이썬의 핵심 문법인 변수, 리스트, 조건문, 반복문, 함수를 차근차근 익혔습니다.

하지만 여전히 화면 터미널 창에서만 결과를 확인하다 보니, “이걸로 진짜 내 바탕화면에 있는 엑셀 파일을 건드릴 수 있는 건가?” 하는 의문이 드셨을 겁니다.

이제 준비 운동은 끝났습니다. 이번 글부터는 파이썬 전용 엑셀 제어 도구인 openpyxl 라이브러리를 활용해, 내 컴퓨터 속 실제 엑셀(.xlsx) 파일을 열고, 데이터를 가공한 뒤, 새로운 엑셀 보고서로 저장하는 진짜 업무 자동화를 실습해 봅니다.

1. 외부 라이브러리 설치: pip install openpyxl

파이썬 기본 엔진에는 엑셀 파일을 직접 열고 닫는 기능이 포함되어 있지 않습니다. 전 세계 개발자들이 만들어 둔 무료 확장 부품(라이브러리)을 설치해야 합니다.

  1. VS Code를 열고 상단 메뉴의 터미널 → 새 터미널 (Ctrl + `)을 엽니다.
  2. 하단 터미널 창에 아래 명령어를 입력하고 Enter를 누릅니다.

Bash

pip install openpyxl

Successfully installed openpyxl-... 문구가 뜨면 엑셀 조작 준비가 끝난 것입니다.

  • VS Code 터미널에서 openpyxl 라이브러리 설치 완료 화면
  • pip 명령어를 사용하면 엑셀 자동화에 필요한 외부 라이브러리를 한 줄로 손쉽게 설치할 수 있습니다.

2. 파이썬으로 새 엑셀 파일 만들고 데이터 쓰기

새로운 엑셀 워크북(통합 문서)을 생성하고, 특정 셀에 데이터를 입력한 뒤 파일로 저장해 보겠습니다.

Python

from openpyxl import Workbook

# 1. 새 엑셀 통합 문서(Workbook) 생성
wb = Workbook()

# 2. 현재 활성화된 시트(Sheet) 선택
ws = wb.active
ws.title = "매출현황"  # 시트 이름 변경

# 3. 셀 좌표에 데이터 직접 입력
ws["A1"] = "품목명"
ws["B1"] = "단가"
ws["C1"] = "수량"

ws["A2"] = "무선 키보드"
ws["B2"] = 45000
ws["C2"] = 10

# 4. 파일 저장하기
wb.save("2026_상반기_매출현황.xlsx")
print("엑셀 파일이 성공적으로 생성되었습니다!")

코드를 실행하면 파이썬 파일이 저장된 폴더에 2026_상반기_매출현황.xlsx 파일이 실제로 생성되며, 더블클릭해 열어보면 우리가 지정한 A1, B2 셀에 값이 정확히 들어가 있는 것을 확인할 수 있습니다.

  • 파이썬 코드로 자동 생성된 엑셀 파일 열기 화면
  • 파이썬 코드를 실행하는 순간 백그라운드에서 실제 엑셀 파일이 만들어지고 서식이 적용됩니다.

3. 기존 엑셀 파일 불러와서 데이터 읽기

이번에는 기존에 보관 중이던 엑셀 파일을 파이썬으로 불러와 데이터를 한 줄씩 읽는 방법입니다.

Python

from openpyxl import load_workbook

# 1. 기존 엑셀 파일 불러오기
wb = load_workbook("2026_상반기_매출현황.xlsx")
ws = wb["매출현황"]

# 2. 특정 셀 값 읽기
item_name = ws["A2"].value
item_price = ws["B2"].value

print(f"2행 품목: {item_name}, 가격: {item_price:,}원")

# 3. for 반복문으로 1행부터 끝까지 전체 행 순회하기
print("\n--- 전체 시트 데이터 출력 ---")
for row in ws.iter_rows(values_only=True):
    print(row)
  • load_workbook("파일명.xlsx"): 기존 엑셀 문서를 메모리로 로드합니다.
  • .value: 셀 좌표 뒤에 .value를 붙여야 셀 안의 실제 텍스트나 숫자 데이터를 가져옵니다.
  • iter_rows(values_only=True): 시트의 모든 데이터를 행(Row) 단위 튜플로 한 번에 꺼내옵니다.

4. 실전 자동화: 수백 줄 엑셀 견적서 일괄 계산 및 새 파일 저장

이제 실무에서 가장 유용한 예제를 실습합니다.

기존 엑셀 원장에서 ‘단가’와 ‘수량’을 읽어와 ‘합계 금액’과 ‘부가세(10%)’를 자동으로 계산해 D열과 E열에 채워 넣는 작업입니다.

Python

from openpyxl import load_workbook

# 1. 원본 엑셀 파일 로드
wb = load_workbook("2026_상반기_매출현황.xlsx")
ws = wb.active

# 2. 새로운 열 머리글(Header) 추가
ws["D1"] = "공급가액"
ws["E1"] = "부가세(10%)"

# 3. 2행부터 마지막 행까지 돌며 자동 계산 (1행은 머리글이므로 제외)
for row_idx in range(2, ws.max_row + 1):
    price = ws.cell(row=row_idx, column=2).value   # B열 (단가)
    quantity = ws.cell(row=row_idx, column=3).value # C열 (수량)
    
    if price and quantity:
        total_price = price * quantity
        vat = total_price * 0.1
        
        # D열(4번째 열), E열(5번째 열)에 계산 결과 입력
        ws.cell(row=row_idx, column=4, value=total_price)
        ws.cell(row=row_idx, column=5, value=vat)

# 4. 가공된 내용을 '정산완료' 새 파일로 저장
wb.save("2026_상반기_매출현황_정산완료.xlsx")
print("데이터 일괄 정산 및 저장이 완료되었습니다!")
  • ws.max_row: 엑셀 시트에서 데이터가 적혀 있는 맨 마지막 행 번호를 자동으로 감지합니다.
  • ws.cell(row=행, column=열): 영문 알파벳 좌표 대신 숫자 번호(row=2, column=4)로 셀을 지정할 수 있어 반복문 돌리기에 최적입니다.
  • Alt 텍스트: openpyxl로 엑셀 데이터 일괄 연산 후 저장된 결과 비교
  • 이미지 캡션: 수천 줄의 데이터도 반복문을 통해 1초 만에 새로운 열을 계산하여 채워 넣을 수 있습니다.

40대 직장인을 위한 실무 요약

  • pip install openpyxl: 파이썬 엑셀 조작용 공식 필수 라이브러리 설치
  • Workbook() / load_workbook(): 새 엑셀 만들기 / 기존 엑셀 불러오기
  • ws["A1"].value: 특정 셀의 데이터 읽기 및 대입
  • ws.cell(row=r, column=c, value=v): 행/열 번호 기반으로 반복문 자동화 수행
  • wb.save("파일명.xlsx"): 작업 완료 후 반드시 파일로 저장

자주 묻는 질문 (FAQ)

Q1. PermissionError: [Errno 13] Permission denied 에러가 발생합니다.

  • A. 파이썬이 수정하거나 덮어쓰려는 엑셀 파일이 컴퓨터에 열려 있을 때(실행 중) 발생하는 에러입니다. 엑셀 창을 완전히 닫은 후 파이썬 코드를 다시 실행하세요.

Q2. 엑셀 파일 내에 수식(=SUM(A1:A10))이 들어있는 셀을 읽으면 어떻게 되나요?

  • A. 기본적으로는 수식 문자열 자체가 읽힙니다. 계산된 실제 결괏값을 읽어오려면 load_workbook("파일.xlsx", data_only=True) 옵션을 주어 열어야 합니다.

Q3. 수십 개의 엑셀 파일도 한 번에 모아서 처리할 수 있나요?

  • A. 네. 파이썬의 기본 내장 모듈인 osglob을 활용해 특정 폴더 내의 모든 .xlsx 파일 목록을 가져온 뒤, for 문으로 묶어 처리하면 100개 파일 취합도 단 몇 초 만에 끝납니다.

▶ Next Step · 파이썬 독학기 7편

매월 말 야근을 없애주는 끝판왕! 폴더 내 수십 개 엑셀 파일 1초 만에 하나로 통합하기

👉 7편: 폴더 안의 여러 엑셀 파일 하나로 자동 병합(Merge)하기 완벽 가이드 보러가기 →

댓글 남기기