엑셀 시트 100개도 문제없다! 파이썬으로 여러 시트 한 번에 처리하기
엑셀 시트 100개도 문제없다! 파이썬으로 여러 시트 한 번에 처리하기 (완성 코드 공개)
"1월, 2월, 3월… 12월 시트가 각각 나뉜 엑셀에서 연간 합계를 구해야 한다", "전국 30개 지점 데이터가 시트별로 나뉜 파일에서 지점별 요약표를 만들어야 한다"…
시트 탭을 하나씩 클릭하며 데이터를 확인하고, 복사해서 취합 시트에 붙여넣는 작업은 시트 수가 많을수록 실수가 납니다. 파이썬을 한 번만 세팅해두면 엑셀 파일 안의 모든 시트를 한꺼번에 읽고, 하나로 합치거나 시트별 요약 통계를 자동으로 만들어 저장할 수 있습니다.
1단계: 준비물 설치
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install pandas openpyxl
pandas는 엑셀의 여러 시트를 읽고 합치고 요약하는 모든 작업을 처리합니다. openpyxl은 .xlsx 파일을 읽고 쓰는 엔진입니다.
💡 이 코드로 할 수 있는 것: 엑셀 파일의 모든 시트 이름 자동 확인, 전체 시트 데이터를 하나로 합치기, 시트별 합계·평균·최대·최소 요약표 자동 생성, 결과를 새 엑셀 파일로 저장까지 처리합니다.
2단계: 엑셀 파일 준비
코드를 실행하기 전에 처리할 엑셀 파일의 구조를 확인합니다. 아래처럼 시트마다 동일한 열 구조를 가져야 합니다.
시트명: 1월 거래처명 매출금액 수량 A주식회사 5,200,000 12 B기술연구소 980,000 3 시트명: 2월 거래처명 매출금액 수량 C물산 3,100,000 8 D상사 7,400,000 21
시트 이름이 달라도 열 구조(헤더)만 동일하면 됩니다. 열 순서도 같아야 합니다.
3단계: 완성 코드
아래 코드를 그대로 복사해서 메모장에 붙여넣고, multi_sheet.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
import pandas as pd
from pathlib import Path
# ① 설정
INPUT_PATH = r"C:\Users\내이름\Desktop\월별매출.xlsx" # ← 원본 엑셀 경로
OUTPUT_PATH = r"C:\Users\내이름\Desktop\월별매출_처리결과.xlsx" # ← 저장 경로
SKIP_SHEETS = ["요약", "README"] # ← 처리에서 제외할 시트명 목록
SUM_COLUMN = "매출금액" # ← 요약 시 합계를 낼 열 이름
# ② 모든 시트 이름 확인
xl = pd.ExcelFile(INPUT_PATH, engine="openpyxl")
all_sheets = xl.sheet_names
target_sheets = [s for s in all_sheets if s not in SKIP_SHEETS]
print(f" ✔ 전체 시트: {len(all_sheets)}개")
print(f" ✔ 처리할 시트: {len(target_sheets)}개 → {target_sheets}")
# ③ 전체 시트 읽기
all_data = []
sheet_map = {}
for sheet in target_sheets:
try:
df = pd.read_excel(INPUT_PATH, sheet_name=sheet, engine="openpyxl")
df["시트명"] = sheet # 어느 시트에서 왔는지 추적
all_data.append(df)
sheet_map[sheet] = df
print(f" ✔ '{sheet}' 시트: {len(df)}행 읽기 완료")
except Exception as e:
print(f" ✘ '{sheet}' 시트 읽기 실패: {e}")
# ④ 전체 합치기 (통합 시트)
combined = pd.concat(all_data, ignore_index=True)
print(f"\n ✔ 전체 합치기 완료: 총 {len(combined)}행")
# ⑤ 시트별 요약표 생성
summary_rows = []
for sheet, df in sheet_map.items():
if SUM_COLUMN in df.columns:
col = pd.to_numeric(df[SUM_COLUMN], errors="coerce")
summary_rows.append({
"시트명": sheet,
"데이터수": len(df),
"합계": col.sum(),
"평균": round(col.mean(), 0),
"최대": col.max(),
"최소": col.min(),
})
df_summary = pd.DataFrame(summary_rows)
# ⑥ 결과를 새 엑셀 파일로 저장 (시트별로 분리)
with pd.ExcelWriter(OUTPUT_PATH, engine="openpyxl") as writer:
# 통합 데이터 시트
combined.to_excel(writer, sheet_name="전체통합", index=False)
print(f" ✔ '전체통합' 시트 저장 완료")
# 요약 시트
if not df_summary.empty:
df_summary.to_excel(writer, sheet_name="시트별요약", index=False)
print(f" ✔ '시트별요약' 시트 저장 완료")
# 원본 시트 그대로 복사
for sheet, df in sheet_map.items():
df.drop(columns=["시트명"], errors="ignore").to_excel(
writer, sheet_name=sheet, index=False)
print(f"\n✅ 완료! 결과 저장 → {OUTPUT_PATH}")
4단계: 실행 방법
- 코드 ① 설정의
INPUT_PATH에 처리할 엑셀 파일 경로를 입력합니다. SKIP_SHEETS에 처리하지 않을 시트명을 입력합니다. 모든 시트를 처리하려면 빈 리스트([])로 두세요.SUM_COLUMN에 요약 시 합계를 낼 열 이름을 입력합니다.- 터미널에서 아래 명령어로 실행합니다:
python multi_sheet.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 전체 시트: 13개 ✔ 처리할 시트: 12개 → ['1월', '2월', '3월', ..., '12월'] ✔ '1월' 시트: 45행 읽기 완료 ✔ '2월' 시트: 52행 읽기 완료 ... ✔ '12월' 시트: 38행 읽기 완료 ✔ 전체 합치기 완료: 총 531행 ✔ '전체통합' 시트 저장 완료 ✔ '시트별요약' 시트 저장 완료 ✅ 완료! 결과 저장 → C:\Users\내이름\Desktop\월별매출_처리결과.xlsx
결과 엑셀 파일에는 전체통합 시트(모든 데이터 합침), 시트별요약 시트(시트마다 합계·평균·최대·최소), 그리고 원본 시트들이 함께 저장됩니다.
5단계: 자주 발생하는 오류와 해결법
오류 1: KeyError: '매출금액'
SUM_COLUMN에 입력한 열 이름이 일부 시트에 없거나 이름이 다를 때 발생합니다. 모든 시트의 헤더(1행) 열 이름이 동일한지 확인하세요. 코드에 errors="coerce"가 포함되어 있어 숫자가 아닌 값은 자동으로 건너뜁니다.
오류 2: 합쳐진 데이터에 열이 너무 많고 빈 값이 많음
시트마다 열 이름이 조금씩 다를 때 발생합니다. 예를 들어 한 시트는 "매출금액", 다른 시트는 "매출 금액"(공백 포함)으로 저장된 경우입니다. 엑셀에서 각 시트의 1행을 직접 확인해 통일하세요.
오류 3: 시트 이름에 특수문자가 있어 저장 실패
엑셀 시트명에 / \ ? * [ ] 같은 특수문자가 포함되면 저장 시 오류가 납니다. 시트명을 읽은 후 저장 전에 특수문자를 제거하세요:
import re safe_name = re.sub(r'[\\/*?\[\]:]', '_', sheet)[:31]
응용: 특정 시트만 골라서 처리하고 싶다면
전체 시트 중 이름에 특정 키워드가 포함된 시트만 골라 처리할 수 있습니다. 코드 ② 아래에 필터 조건을 추가하세요.
# 예시 1: "월" 글자가 포함된 시트만 처리 (1월~12월) target_sheets = [s for s in all_sheets if "월" in s] # 예시 2: 특정 시트 목록만 처리 target_sheets = ["1월", "2월", "3월"] # 예시 3: 앞에서 5개 시트만 처리 target_sheets = all_sheets[:5]
💡 이전 게시글과 결합하면: 합쳐진 전체 데이터를 엑셀 자동 정렬·필터링 편으로 추가 가공하거나, 차트 자동 저장 편으로 시트별 요약을 차트로 시각화하는 것도 가능합니다.
핵심 요약
- 준비물: Python + pandas + openpyxl 설치 (pip install pandas openpyxl)
- 설정: INPUT_PATH, OUTPUT_PATH, SKIP_SHEETS, SUM_COLUMN만 수정
- 실행: 터미널에서 python multi_sheet.py 입력
- 결과: 전체통합 시트 + 시트별요약 시트 + 원본 시트가 포함된 새 엑셀 파일 자동 생성
이 코드를 응용하면 시트별로 다른 서식을 적용하거나, 특정 시트의 데이터만 비교 분석하는 것도 가능합니다.
