엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
"매주 같은 형식의 주간 보고 슬라이드를 데이터만 바꿔서 다시 만든다", "거래처별 영업 실적 슬라이드를 30개 따로 만들어야 한다", "엑셀 데이터를 슬라이드 표로 일일이 옮겨야 한다"…
파워포인트에서 제목 텍스트박스를 클릭하고, 표를 그리고, 셀을 채우는 작업을 반복하다 보면 시간이 오래 걸립니다. 파이썬을 한 번만 세팅해두면 제목, 본문, 표, 이미지가 포함된 슬라이드를 자동으로 생성하고, 엑셀 데이터를 읽어 슬라이드 표로 그대로 변환할 수 있습니다.
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
파워포인트 생성에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install python-pptx pandas openpyxl
python-pptx는 파워포인트(.pptx) 파일을 생성하고 편집하는 라이브러리입니다. 제목, 본문, 표, 이미지, 차트까지 모두 코드로 제어할 수 있습니다. pandas와 openpyxl은 엑셀 데이터를 읽어와 슬라이드에 반영하는 데 사용합니다.
💡 이 코드로 할 수 있는 것: 표지 슬라이드, 텍스트 본문 슬라이드, 표가 포함된 데이터 슬라이드를 자동으로 생성합니다. 엑셀 파일을 읽어 거래처별로 슬라이드를 자동으로 반복 생성하는 것도 가능합니다.
아래 코드를 그대로 복사해서 메모장에 붙여넣고, make_ppt.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
import pandas as pd
from datetime import datetime
# ① 설정
EXCEL_PATH = r"C:\Users\내이름\Desktop\주간실적.xlsx" # ← 데이터 엑셀 경로
OUTPUT_PATH = r"C:\Users\내이름\Desktop\주간보고서.pptx" # ← 저장 경로
# ② 프레젠테이션 생성
prs = Presentation()
prs.slide_width = Inches(13.33) # 16:9 와이드 화면
prs.slide_height = Inches(7.5)
BLANK = prs.slide_layouts[6] # 빈 레이아웃 사용 (자유 배치)
# ③ 표지 슬라이드
slide1 = prs.slides.add_slide(BLANK)
title_box = slide1.shapes.add_textbox(Inches(1), Inches(2.8), Inches(11), Inches(1.5))
tf = title_box.text_frame
tf.text = "주간 업무 실적 보고"
tf.paragraphs[0].font.size = Pt(44)
tf.paragraphs[0].font.bold = True
tf.paragraphs[0].font.color.rgb = RGBColor(0x2E, 0x50, 0x90)
tf.paragraphs[0].alignment = PP_ALIGN.CENTER
date_box = slide1.shapes.add_textbox(Inches(1), Inches(4.3), Inches(11), Inches(0.8))
date_box.text_frame.text = datetime.now().strftime("%Y년 %m월 %d일")
date_box.text_frame.paragraphs[0].font.size = Pt(20)
date_box.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
print(f" ✔ 표지 슬라이드 생성 완료")
# ④ 텍스트 본문 슬라이드 (요약)
slide2 = prs.slides.add_slide(BLANK)
header = slide2.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
header.text_frame.text = "이번 주 핵심 요약"
header.text_frame.paragraphs[0].font.size = Pt(32)
header.text_frame.paragraphs[0].font.bold = True
content = slide2.shapes.add_textbox(Inches(0.8), Inches(1.5), Inches(11.5), Inches(5))
tf2 = content.text_frame
tf2.word_wrap = True
bullet_points = [
"전체 매출 목표 105% 달성",
"신규 거래처 3곳 계약 완료",
"미납 거래처 2건 → 추가 관리 필요",
"다음 주 목표: 신규 영업 5건 이상",
]
for i, point in enumerate(bullet_points):
p = tf2.paragraphs[0] if i == 0 else tf2.add_paragraph()
p.text = f"• {point}"
p.font.size = Pt(22)
p.space_after = Pt(16)
print(f" ✔ 요약 슬라이드 생성 완료")
# ⑤ 표 슬라이드 (엑셀 데이터를 표로 변환)
df = pd.read_excel(EXCEL_PATH, engine="openpyxl")
print(f" ✔ 엑셀 데이터 로드: {len(df)}행")
slide3 = prs.slides.add_slide(BLANK)
header3 = slide3.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
header3.text_frame.text = "거래처별 실적 현황"
header3.text_frame.paragraphs[0].font.size = Pt(32)
header3.text_frame.paragraphs[0].font.bold = True
rows, cols = len(df) + 1, len(df.columns) # +1: 헤더 행
table_shape = slide3.shapes.add_table(
rows, cols, Inches(0.8), Inches(1.5), Inches(11.5), Inches(0.5 * rows)
)
table = table_shape.table
# 헤더 입력
for col_idx, col_name in enumerate(df.columns):
cell = table.cell(0, col_idx)
cell.text = str(col_name)
cell.text_frame.paragraphs[0].font.bold = True
cell.text_frame.paragraphs[0].font.size = Pt(14)
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0x2E, 0x50, 0x90)
cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
# 데이터 입력
for row_idx, row in df.iterrows():
for col_idx, value in enumerate(row):
cell = table.cell(row_idx + 1, col_idx)
cell.text = str(value)
cell.text_frame.paragraphs[0].font.size = Pt(13)
print(f" ✔ 표 슬라이드 생성 완료")
# ⑥ 저장
prs.save(OUTPUT_PATH)
print(f"\n✅ 완료! 슬라이드 {len(prs.slides.__iter__.__self__._sldIdLst)}장 생성 → {OUTPUT_PATH}")
EXCEL_PATH에 표로 변환할 데이터 엑셀 경로를 입력합니다.OUTPUT_PATH에 저장할 파워포인트 경로를 입력합니다.bullet_points 목록을 원하는 요약 내용으로 수정합니다.python make_ppt.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 표지 슬라이드 생성 완료 ✔ 요약 슬라이드 생성 완료 ✔ 엑셀 데이터 로드: 8행 ✔ 표 슬라이드 생성 완료 ✅ 완료! 슬라이드 3장 생성 → C:\Users\내이름\Desktop\주간보고서.pptx
생성된 파워포인트 파일에는 표지, 요약, 데이터 표가 포함된 슬라이드 3장이 들어 있습니다. 파워포인트에서 열어 글꼴, 색상, 레이아웃을 추가로 다듬을 수 있습니다.
오류 1: ModuleNotFoundError: No module named 'pptx'
설치 시 pptx가 아닌 반드시 python-pptx로 입력해야 합니다.
python -m pip install python-pptx
오류 2: 표 데이터가 너무 많아 슬라이드를 벗어남
엑셀 행이 많으면 표가 슬라이드 높이를 초과합니다. 행이 15개 이상이면 여러 슬라이드로 나누는 것을 권장합니다. 아래처럼 일정 개수씩 잘라서 여러 슬라이드에 분산하세요:
chunks = [df[i:i+10] for i in range(0, len(df), 10)] # 10행씩 분할
오류 3: 마지막 줄에서 슬라이드 개수 출력 시 오류 발생
코드 ⑥의 슬라이드 개수 출력 부분이 복잡해서 오류가 날 수 있습니다. 간단하게 아래로 교체하세요:
print(f"\n✅ 완료! 슬라이드 {len(prs.slides)}장 생성 → {OUTPUT_PATH}")
엑셀에 거래처 목록이 있을 때, 거래처마다 별도의 슬라이드를 자동으로 반복 생성할 수 있습니다.
for _, row in df.iterrows():
slide = prs.slides.add_slide(BLANK)
title_box = slide.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
title_box.text_frame.text = f"{row['거래처명']} 실적 현황"
title_box.text_frame.paragraphs[0].font.size = Pt(28)
title_box.text_frame.paragraphs[0].font.bold = True
content_box = slide.shapes.add_textbox(Inches(0.8), Inches(1.5), Inches(11), Inches(4))
tf = content_box.text_frame
tf.text = f"매출: {row['매출금액']:,}원\n담당자: {row['담당자']}\n상태: {row['납부상태']}"
tf.paragraphs[0].font.size = Pt(20)
💡 이전 게시글과 결합하면: 피벗 테이블 자동 생성 편으로 데이터를 집계한 뒤 이 코드로 슬라이드 표를 만들거나, 이메일 자동 발송 편과 결합해 완성된 파워포인트를 자동으로 발송할 수 있습니다.
이 코드를 응용하면 차트 이미지를 슬라이드에 자동 삽입하거나, 회사 템플릿 디자인을 그대로 활용해 내용만 채우는 것도 가능합니다.