카테고리: 업무 자동화

파이썬 업무 자동화#1엑셀 자동화 입문 (openpyxl)!

목차9개 항목

안녕하세요! Mojangcam입니다 😎

오늘부터 새 시리즈, 파이썬 업무 자동화를 시작해요! 매일 반복하는 지루한 컴퓨터 작업들 — 엑셀 정리, 파일 이름 바꾸기, 웹에서 자료 모으기 같은 걸 파이썬에게 대신 시키는 시리즈예요. 코딩을 몰라도 따라오면 돌아가도록 천천히 갈게요!

첫 편은 업무 자동화의 왕도, 엑셀 자동화입니다. 이번 편을 다 읽으면 지점별 판매 엑셀 파일 3개를 파이썬이 알아서 합치고, 합계까지 계산해서 보고서 파일을 만들어주는 스크립트를 손에 넣게 돼요. 매주 30분씩 하던 취합 작업이 1초로 끝나는 거죠!

📌 준비물

  • Python 3.8 이상
  • openpyxl 3.1.x (2026-07 기준 최신 3.1.5)
터미널
pip install openpyxl

openpyxl은 엑셀 설치 없이도 .xlsx 파일을 읽고 쓸 수 있는 라이브러리예요. 즉, 엑셀이 없는 서버에서도 돌아간다는 말이죠!

실습용으로 서울지점.xlsx, 부산지점.xlsx, 대전지점.xlsx 세 파일을 준비할게요. 각 파일에는 "상품명 / 수량 / 금액" 세 열이 있다고 가정합니다.

📌 1단계 - 엑셀 파일 읽기

먼저 엑셀 파일 하나를 열어서 내용을 출력해볼게요.

Python
# openpyxl 3.1.5 / Python 3.8+
from openpyxl import load_workbook

wb = load_workbook("서울지점.xlsx")
ws = wb.active  # 첫 번째 시트

for row in ws.iter_rows(min_row=2, values_only=True):
    print(row)  # ('키보드', 3, 45000) 처럼 튜플로 나와요

하나씩 뜯어볼게요 💡

  • load_workbook() : 이미 있는 엑셀 파일을 여는 함수예요.
  • wb.active : 지금 선택된(보통 첫 번째) 시트를 가져와요. wb["시트1"]처럼 이름으로도 가능해요.
  • iter_rows(min_row=2, values_only=True) : 2행부터(1행은 제목이니까!) 값만 뽑아서 한 줄씩 돌려줘요. values_only=True를 빼면 셀 객체가 나와서 초보자는 헷갈려요.
  • 특정 셀 하나만 읽을 때는 ws["B2"].value 처럼 쓰면 돼요.

📌 2단계 - 새 엑셀 파일 만들어 쓰기

이번엔 반대로 파이썬이 엑셀 파일을 만들어볼게요.

Python
# openpyxl 3.1.5 / Python 3.8+
from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "요약"

ws.append(["상품명", "수량", "금액"])  # 제목 행
ws.append(["키보드", 3, 45000])
ws.append(["마우스", 5, 25000])

wb.save("요약.xlsx")
print("저장 완료!")

하나씩 뜯어볼게요 💡

  • Workbook() : 빈 엑셀 파일을 새로 만드는 클래스예요.
  • ws.append(리스트) : 리스트 하나가 한 행이 돼서 맨 아래에 추가돼요. 제일 많이 쓰게 될 메서드입니다!
  • wb.save() : 이걸 호출해야 실제 파일로 저장돼요. 까먹으면 아무 일도 안 일어나요 😅

📌 3단계 - 서식과 합계 수식 넣기

보고서답게 제목을 굵게 하고, 합계 수식도 넣어볼게요.

Python
# openpyxl 3.1.5 / Python 3.8+
from openpyxl.styles import Font

# 제목 행(1행) 굵게
for cell in ws[1]:
    cell.font = Font(bold=True)

# 열 너비 조절
ws.column_dimensions["A"].width = 20

# 마지막 행 아래에 합계 수식 추가
last = ws.max_row
ws[f"A{last + 1}"] = "합계"
ws[f"C{last + 1}"] = f"=SUM(C2:C{last})"

하나씩 뜯어볼게요 💡

  • Font(bold=True) : 글꼴 서식 객체예요. 색상(color), 크기(size)도 줄 수 있어요.
  • ws.max_row : 데이터가 있는 마지막 행 번호예요. 행 수가 매번 달라도 알아서 맞춰줍니다.
  • =SUM(...) : 문자열로 수식을 넣으면 엑셀이 열 때 진짜 수식으로 동작해요!

📌 전체 코드 (복붙 OK)

지점별 파일 3개를 합쳐서 서식·합계까지 들어간 전체요약.xlsx를 만드는 완성본이에요. 엑셀 파일들과 같은 폴더에서 실행하세요!

Python
# openpyxl 3.1.5 / Python 3.8+
# 파일명: merge_excel.py
import glob

from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font

wb_out = Workbook()
ws_out = wb_out.active
ws_out.title = "전체 요약"
ws_out.append(["지점", "상품명", "수량", "금액"])

# 폴더의 모든 지점 파일 병합
for path in glob.glob("*지점.xlsx"):
    branch = path.replace(".xlsx", "")
    ws = load_workbook(path).active
    for row in ws.iter_rows(min_row=2, values_only=True):
        if row[0] is None:  # 빈 행 건너뛰기
            continue
        ws_out.append([branch, *row])
    print(f"{path} 처리 완료")

# 서식: 제목 행 굵게 + 열 너비
for cell in ws_out[1]:
    cell.font = Font(bold=True)
for col in ["A", "B", "C", "D"]:
    ws_out.column_dimensions[col].width = 15

# 합계 행 (데이터가 있을 때만!)
last = ws_out.max_row
if last >= 2:
    ws_out[f"A{last + 1}"] = "합계"
    ws_out[f"D{last + 1}"] = f"=SUM(D2:D{last})"
    ws_out[f"A{last + 1}"].font = Font(bold=True)
else:
    print("⚠️ 지점 파일을 못 찾았어요! 이 스크립트를 엑셀 파일들과 같은 폴더에 두고 실행하세요.")

wb_out.save("전체요약.xlsx")
print("전체요약.xlsx 생성 완료!")

📌 실행 결과

실행하면 터미널에 파일별 처리 로그가 출력되고, 폴더에 전체요약.xlsx가 생깁니다. 열어보면 세 지점 데이터가 지점명과 함께 한 시트에 모여 있고, 맨 아래 합계 행은 엑셀 수식이라 데이터를 수정하면 자동으로 다시 계산돼요.

파일이 10개가 되든 100개가 되든 코드는 그대로예요. 이게 자동화의 맛입니다 😎

📌 자주 나는 에러

  1. ModuleNotFoundError: No module named 'openpyxl'
    • 원인: openpyxl 미설치, 또는 다른 파이썬에 설치됨
    • 해결: python -m pip install openpyxl 로 지금 쓰는 파이썬에 정확히 설치
  2. PermissionError: [Errno 13] Permission denied: '전체요약.xlsx'
    • 원인: 저장하려는 파일이 엑셀에서 열려 있음
    • 해결: 엑셀 창을 닫고 다시 실행 (제일 많이 겪는 에러예요!)
  3. InvalidFileException: openpyxl does not support the old .xls file format
    • 원인: 구버전 엑셀 형식(.xls)은 openpyxl이 열지 못함
    • 해결: 엑셀에서 "다른 이름으로 저장 → .xlsx"로 변환 후 사용
  4. 열자마자 "순환 참조" 경고가 떠요 (데이터 없이 합계만 있음)
    • 원인: 스크립트와 같은 폴더에 ○○지점.xlsx가 없어서 0행이 병합됨 → 합계 수식 =SUM(D2:D1)이 자기 자신(D2)을 포함해버려요
    • 해결: 엑셀 파일들이 있는 폴더에서 실행하세요. 위 전체 코드처럼 데이터가 있을 때만 합계 행을 넣으면 예방됩니다!

📌 마무리

오늘은 새 시리즈 첫 편으로 openpyxl로 엑셀을 읽고, 쓰고, 서식과 수식까지 넣어서 여러 파일을 한 방에 합치는 스크립트를 만들어봤어요. 다음 편에서는 웹사이트에서 자료를 자동으로 긁어오는 웹 크롤링(requests + BeautifulSoup)을 배워볼 거예요. 기대해주세요 🙌

📚 파이썬 업무 자동화 시리즈

  • #1 - 엑셀 자동화 입문 (openpyxl) ← 지금 이 글!
  • #2 - 웹 크롤링 입문 (requests + BeautifulSoup) (예정)
  • #3 - 파일 정리 자동화 (예정)
  • #4 - 디스코드 웹훅 알림 보내기 (예정)
  • #5 - ChatGPT API로 업무 자동화 (예정)
  • #6 - 예약 실행 자동화 (예정)
  • #7 - 동적 페이지·로그인 자동화 (Selenium) (예정)
  • #8 - PDF 자동 처리 (예정)
  • #9 - 마우스·키보드 GUI 자동화 (PyAutoGUI) (예정)

연재 · 14편 중 1번째

파이썬 업무 자동화

  1. #1엑셀 자동화 입문 (openpyxl)!지금 읽는 글
  2. #2웹 크롤링 입문 (requests + BeautifulSoup)!
  3. #3파일 정리 자동화 (이름 일괄 변경)!
  4. #4디스코드 웹훅(Webhook)으로 알림 보내기 (requests)!
  5. #5로컬 LLM(LM Studio)으로 고객 문의 자동 분류·요약하기! (무료 AI)
  6. #6예약 실행 자동화! 매일 정해진 시간에 스크립트 돌리기 (schedule·APScheduler)
  7. #7동적 페이지·로그인 자동화! requests로 안 되는 사이트 긁기 (Selenium)
  8. #8PDF 자동 처리! 여러 파일 병합·분할부터 비밀번호까지 (pypdf) 📄
  9. #9마우스·키보드 GUI 자동화! 클릭·타이핑을 파이썬이 대신하게 하기 (PyAutoGUI)
  10. #10워드(Word) 문서 자동 생성! 엑셀 명단으로 계약서·안내문 100장 뽑기 (python-docx) 📄
  11. #11개인화 대량 메일 자동 발송! 명단별 첨부파일·발송 로그·재시도까지 (smtplib 실전편) 📬
  12. #12구글 시트 연동하기! 팀원과 같이 보는 자동 시트 (gspread) 📗
  13. #13파이썬 자동화 로그·재시도·디스코드 실패 알림 만들기 - 조용히 멈추는 스크립트 잡기
  14. #14파워포인트(PowerPoint) 보고서 자동 생성! 엑셀 숫자만 바꾸면 발표자료 완성 (python-pptx) 📊
전체 14편 보기접기

글쓴이

Mojangcam

직접 코드를 짜고, 서버를 돌리고, 막힌 에러를 해결하며 배운 것들을 기록하는 개발·IT 실전 기록 블로그