매월 말이나 분기 결산 시기가 돌아오면 직장인들을 가장 괴롭히는 작업 중 하나가 바로 '엑셀 데이터 취합'입니다. 각 부서나 지점에서 작성하여 보낸 수십, 수백 개의 엑셀 파일, 혹은 하나의 파일 안에 수십 개로 쪼개져 있는 시트들을 일일이 클릭하여 복사하고 붙여넣는 일은 지루하고 소모적인 작업입니다.

손가락과 눈이 피로해질수록 데이터를 빼먹거나 다른 칸에 붙여넣는 실수가 발생하기 쉽습니다. 저 역시 과거에 50개가 넘는 지점별 매출 시트를 손수로 합치다가 중간에 2개 지점 데이터를 누락하여 보고서를 다시 작성했던 아찔한 경험이 있습니다.

오늘은 파이썬과 openpyxl 라이브러리를 활용해 수백 개로 나뉘어 있는 엑셀 시트의 데이터를 클릭 한 번으로 단 5초 만에 하나의 통합 시트로 합치고, 내가 원하는 특정 조건의 데이터만 쏙 뽑아내는 자동화 스크립트 작성법을 알려드립니다.


1. 엑셀 시트 합치기의 기본 원리: 반복문(for문) 활용

파이썬으로 여러 시트를 하나로 합치는 원리는 생각보다 아주 간단합니다.

  1. 통합 엑셀 파일(Workbook)을 새로 하나 만듭니다.

  2. 원본 엑셀 파일의 모든 시트 목록을 가져옵니다.

  3. 반복문(for문)을 돌면서 각 시트의 데이터를 한 줄씩 읽어와 통합 파일에 연달아 추가(append)합니다.

이때 핵심이 되는 메서드가 바로 ws.append()입니다. append() 메서드는 리스트 형태로 된 데이터 세트를 시트의 가장 마지막 빈 행에 알아서 차곡차곡 쌓아주는 고마운 기능입니다.


2. 실전 코딩: 여러 시트의 데이터 하나로 통합하기

아래는 하나의 엑셀 파일 안에 있는 여러 지점별 시트 데이터를 '통합_매출' 시트로 합치는 실전 코드입니다.

Python
import openpyxl

# 1. 원본 파일 및 통합 저장할 새 워크북 준비
wb = openpyxl.load_workbook("2026_지점별_매출현황.xlsx")
merged_wb = openpyxl.Workbook()
merged_ws = merged_wb.active
merged_ws.title = "통합_매출"

# 헤더(제목 행) 최초 1회 입력
merged_ws.append(["지점명", "상품명", "판매량", "매출액"])

# 2. 모든 시트를 순회하며 데이터 합치기
for sheet_name in wb.sheetnames:
    ws = wb[sheet_name]
    
    # 각 시트의 2번째 행(데이터 시작 위치)부터 끝까지 읽기
    for row in ws.iter_rows(min_row=2, values_only=True):
        # 행에 데이터가 존재하는 경우에만 추가
        if row[0] is not None:
            merged_ws.append(row)

# 3. 통합 파일 저장
merged_wb.save("2026_전체_매출_통합.xlsx")
print("모든 시트 통합이 완료되었습니다!")

코드의 핵심 포인트: values_only=True와 iter_rows()

  • iter_rows(min_row=2): 1번째 행은 "상품명", "판매량" 같은 제목(헤더) 줄이므로 중복을 피하기 위해 min_row=2를 지정하여 2번째 행부터 읽어옵니다.

  • values_only=True: 셀의 복잡한 설정값(색상, 폰트 등)을 제외하고 오직 안에 들어있는 알맹이 데이터(값)만 튜플 형태로 가져와 속도를 비약적으로 높여줍니다.


3. 특정 조건에 맞는 데이터만 자동 추출하기

모든 데이터를 합치는 것뿐만 아니라, 수천 개의 데이터 중 "판매량이 50개 이상인 상품" 또는 "서울 지점 데이터"처럼 특정 조건에 맞는 데이터만 걸러내어 저장해야 하는 상황도 자주 발생합니다.

이럴 때는 반복문 내부에 조건문(if문)을 조합하면 됩니다.

Python
# 판매량이 50개 이상인 우수 매출 데이터만 추출하기
filtered_wb = openpyxl.Workbook()
filtered_ws = filtered_wb.active
filtered_ws.title = "우수_매출_목록"
filtered_ws.append(["지점명", "상품명", "판매량", "매출액"])

for row in merged_ws.iter_rows(min_row=2, values_only=True):
    # row[2]는 '판매량' 데이터 위치
    sales_volume = row[2]
    
    if sales_volume is not None and sales_volume >= 50:
        filtered_ws.append(row)

filtered_wb.save("2026_우수매출_추출.xlsx")

이렇게 간단한 if문 한 줄만 추가해주면, 사람이 엑셀 필터 기능을 켜고 일일이 눈으로 확인하며 데이터 복사-붙여넣기를 할 필요 없이 컴퓨터가 정확하게 조건에 맞는 데이터만별도 파일로 뽑아내어 줍니다.


4. 실무에서 자꾸 터지는 빈 행(None) 처리 주의사항

실제 업무에서 사용되는 엑셀 파일들을 다루다 보면, 중간에 서식이 깨져있거나 눈에는 보이지 않지만 빈 데이터(None)가 들어있는 행이 많습니다.

이 빈 행을 검증하지 않고 무작정 merged_ws.append(row)를 실행하면, 통합된 파일 중간중간에 허공만 가득한 빈 줄이 수십 개씩 끼어드는 현상이 발생합니다.

따라서 데이터를 추가하기 전에는 항상 if row[0] is not None: 또는 if any(row):와 같은 유효성 검사 조건문을 넣어 데이터가 실제로 존재하는 행만 필터링하여 합치는 습관을 들이는 것이 좋습니다.


핵심요약

  • openpyxl의 iter_rows(values_only=True)와 append() 메서드를 조합하면 수백 개의 엑셀 시트 데이터를 순식간에 하나로 통합할 수 있습니다.

  • 데이터 합치기 과정에 if 조건문을 결합하면 원하는 기준(숫자 범위, 특정 단어 포함 등)에 부합하는 정제된 데이터만 자동 추출이 가능합니다.

  • 엑셀 파일 내부의 불필요한 빈 행(None)으로 인한 오작동을 방지하기 위해 데이터 유효성 검사 코드를 포함하는 것이 안전합니다.