파이썬으로 엑셀 매크로 대체하기: 자동화 예제 3가지
개발 환경 준비
- Python 3.7 이상
- 터미널에서 라이브러리 설치
pip install pandas openpyxl xlwings glob2
이제 본격적으로 “엑셀 자동화” 스크립트를 작성해볼게요.
예제 1: 행 단위 금액 합계 자동 계산
- 목표
- 기존 엑셀(
sales_data.xlsx
)의 “단가” 열과 “수량” 열을 곱한 뒤 - “총합계” 열을 만들어 결과를 새 파일로 저장
- 기존 엑셀(
- 사용 라이브러리
- pandas
- openpyxl (백엔드로 자동 선택됨)
- 단계별 코드
import pandas as pd
# 1. 엑셀 파일을 불러와 DataFrame으로 변환
df = pd.read_excel("sales_data.xlsx", sheet_name="Sheet1")
# 2. 각 행의 단가 * 수량 값을 “총합계”라는 새 열로 추가
df["총합계"] = df["단가"] * df["수량"]
# 3. 계산된 DataFrame을 새 엑셀 파일로 저장
df.to_excel("sales_data_with_total.xlsx", index=False)
read_excel
: 파일과 시트를 지정해 데이터를 읽어옵니다.df["총합계"] = …
: 기존 DataFrame에 새 열을 바로 추가합니다.to_excel
: 결과를 다시 엑셀 파일로 덮어쓰기 없이 생성합니다.
예제 2: 조건별 셀 서식(글꼴 색상) 변경
- 목표
report.xlsx
의 “Summary” 시트에서- 세 번째 열(C열)의 값이 50 미만인 셀을 빨간 글씨로 강조
- 사용 라이브러리
- openpyxl
- 단계별 코드
from openpyxl import load_workbook
from openpyxl.styles import Font
# 1. 워크북과 시트 열기
wb = load_workbook("report.xlsx")
ws = wb["Summary"]
# 2. 2행부터 마지막 행까지 순회하며 C열 값 체크
for row in ws.iter_rows(min_row=2, max_col=3):
cell = row[2] # row[2] == C열
if isinstance(cell.value, (int, float)) and cell.value < 50:
# 3. 조건 충족 시 빨간 글꼴로 변경
cell.font = Font(color="FF0000")
# 4. 변경된 워크북을 새 파일로 저장
wb.save("report_highlighted.xlsx")
load_workbook
: 원본 엑셀 파일을 객체 형태로 불러옵니다.iter_rows
: 범위를 지정해 셀을 이터레이션합니다.Font(color="FF0000")
: 헥스 코드로 색상을 지정합니다.
예제 3: 폴더 내 다수 엑셀 파일 병합 후 요약 리포트
- 목표
data_folder
폴더 안에 있는 모든 .xlsx 파일을 읽어서- 하나의 테이블로 합친 뒤
- 카테고리별 매출 합계를 요약해 새로운 리포트 생성
- 사용 라이브러리
- pandas
- glob2
- 단계별 코드
import pandas as pd
import glob
# 1. 와일드카드(*)로 폴더 내 xlsx 파일 목록 수집
file_list = glob.glob("data_folder/*.xlsx")
# 2. 비어 있는 DataFrame 준비
combined_df = pd.DataFrame()
# 3. 각 파일을 읽어 기존 DataFrame에 순차 추가
for file in file_list:
temp_df = pd.read_excel(file)
combined_df = combined_df.append(temp_df, ignore_index=True)
# 4. 피벗 테이블로 카테고리별 매출 합계 계산
summary = combined_df.pivot_table(
index="Category",
values="Sales",
aggfunc="sum"
)
# 5. 최종 요약 리포트를 엑셀로 저장
summary.to_excel("summary_report.xlsx")
glob.glob("*.xlsx")
: 특정 폴더에서 파일 확장자별로 리스트를 가져옵니다.append(..., ignore_index=True)
: 인덱스를 새로 매겨가며 DataFrame을 합칩니다.pivot_table
: 여러 행을 그룹화해 요약된 통계 테이블을 만듭니다.