본문으로 건너뛰기
실습하기

엑셀 데이터를 기반으로 수료증 슬라이드 생성하기

이번 수업에서는 수료증 파워포인트 템플릿(.pptx)과 학생 정보를 담은 엑셀(.xlsx) 파일을 읽고, 엑셀에서 가져온 데이터를 반영한 새로운 파워포인트 슬라이드를 생성해 보겠습니다.

참고 : 컴퓨터에서 실습으로 제공된 파이썬 프로그램을 직접 실행할 경우, 템플릿 PPT(input_file.pptx)와 학생 정보(input_file.xlsx) 파일이 파이썬 프로그램과 동일한 폴더 내 있어야 합니다.


1. 필수 라이브러리 임포트

라이브러리 불러오기
import openpyxl
from pptx import Presentation
from io import BytesIO
from pptx.enum.shapes import MSO_SHAPE_TYPE
  • io.BytesIO : 컴퓨터의 저장 공간인 메모리 내에 바이트 데이터(0과 1로 이루어진 데이터)를 저장하고, 이를 파일처럼 사용할 수 있게 해주는 클래스입니다.

  • pptx.enum.shapes.MSO_SHAPE_TYPE : 파워포인트에서 다양한 도형의 타입을 정의하는 상수입니다. 도형, 이미지, 텍스트 박스 등의 타입을 구분할 때 사용됩니다.


2. 파워포인트 파일 및 엑셀 파일 로드

pptx, xlsx 파일 불러오기
presentation = Presentation("input_file.pptx")
wb = openpyxl.load_workbook("input_file.xlsx")
sheet = wb.active
  • Presentation("input_file.pptx") : 파워포인트 파일을 불러옵니다.

  • openpyxl.load_workbook("input_file.xlsx") : 엑셀 파일을 불러옵니다.

  • wb.active : 엑셀 파일의 첫 번째 시트를 선택합니다.


3. 엑셀 데이터 읽기

data_sets 리스트 생성
data_sets = []

for row in sheet.iter_rows(min_row=2, values_only=True):
data = {
"AWARD_NAME": row[0],
"NAME": row[1],
"CONTENT": row[2],
"DATE": row[3],
"ORGANIZATION": row[4],
}
data_sets.append(data)
  • sheet.iter_rows() : 엑셀 시트의 각 행을 반복해서 읽어옵니다. 여기서는 2번째 행(min_row=2)부터 읽습니다.

  • values_only=True : 셀의 값을 직접 가져옵니다.

  • data_sets.append(data) : 각 행의 데이터를 data라는 딕셔너리로 저장하고, 리스트에 추가합니다.


4. 슬라이드 템플릿 선택

템플릿 슬라이드 선택
template_slide = presentation.slides[0]
  • presentation.slides[0] : 파워포인트의 첫 번째 슬라이드를 템플릿으로 선택합니다. 이 슬라이드를 바탕으로 새 슬라이드를 생성합니다.

5. 슬라이드 복사 및 이미지, 텍스트 처리

슬라이드 요소 복사
for data in data_sets:
# 템플릿 슬라이드를 복사하여 새로운 슬라이드 생성
new_slide = presentation.slides.add_slide(template_slide.slide_layout)

for shape in template_slide.shapes:
# 그룹 도형 처리
if shape.shape_type == MSO_SHAPE_TYPE.GROUP:
for sub_shape in shape.shapes:
if sub_shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
# ...중략...

# 이미지 도형 처리
elif shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
image_stream = shape.image.blob
# ...중략...

# 텍스트 도형 처리
elif shape.has_text_frame:
new_shape = new_slide.shapes.add_textbox(shape.left, shape.top, shape.width, shape.height)
new_shape.text_frame.clear()

# 텍스트 복사
for paragraph in shape.text_frame.paragraphs:
new_paragraph = new_shape.text_frame.add_paragraph()
# ...중략...
  • presentation.slides.add_slide() : 템플릿 슬라이드를 사용해 새로운 슬라이드를 추가합니다.

  • shape.shape_type == MSO_SHAPE_TYPE.GROUP : 그룹으로 묶여 있는 도형을 처리할 때 그룹 내부의 도형들을 따로 처리합니다.

  • shape.shape_type == MSO_SHAPE_TYPE.PICTURE : 이미지 도형을 처리할 때 이미지를 새 슬라이드에 복사합니다.

  • shape.has_text_frame : 텍스트가 있는 도형을 복사할 때, 텍스트 박스를 새로 만들어서 그 안의 텍스트를 복사합니다. 텍스트의 크기, 굵기, 기울임도 유지합니다.


6. 엑셀 데이터로 텍스트 대체

텍스트 데이터로 대체
for shape in new_slide.shapes:
if shape.has_text_frame:
for paragraph in shape.text_frame.paragraphs:
if "<AWARD_NAME>" in paragraph.text:
paragraph.text = data["AWARD_NAME"]
elif "<NAME>" in paragraph.text:
paragraph.text = data["NAME"]
elif "<CONTENT>" in paragraph.text:
paragraph.text = data["CONTENT"]
elif "<DATE>" in paragraph.text:
paragraph.text = data["DATE"]
elif "<ORGANIZATION>" in paragraph.text:
paragraph.text = data["ORGANIZATION"]
  • 엑셀 데이터(data)를 파워포인트 슬라이드에 있는 특정 텍스트와 교체합니다. 예를 들어, <AWARD_NAME>라는 텍스트는 엑셀에서 읽은 AWARD_NAME 데이터로 대체됩니다.

7. 템플릿 슬라이드 제거 및 결과 저장

템플릿 슬라이드 제거 및 저장
presentation.slides._sldIdLst.remove(presentation.slides._sldIdLst[0])
presentation.save("output_file.pptx")
  • _sldIdLst.remove() : 처음 사용한 템플릿 슬라이드를 삭제합니다.

  • presentation.save() : 최종 결과를 output_file.pptx 파일로 저장합니다.


전체적인 흐름 요약

  1. 엑셀에서 데이터를 읽어옵니다.

  2. 첫 번째 슬라이드를 템플릿으로 사용하여 엑셀의 각 데이터를 새로운 슬라이드에 삽입합니다.

  3. 텍스트와 이미지를 템플릿과 동일하게 복사하면서, 텍스트 내용은 엑셀 데이터로 대체합니다.

  4. 템플릿 슬라이드를 삭제하고, 최종 결과를 파일로 저장합니다.


위와 같이 엑셀 파일에서 데이터를 읽어와, PPT 템플릿 내 placeholder를 바꾸면 동일한 형식의 수료증 슬라이드를 여러 개 생성할 수 있습니다.

이러한 구조를 잘 응용하면 대량의 수료증, 인증서, 명함 등 다양한 템플릿 기반의 문서를 자동으로 생성할 수 있습니다.

다음 내용이 궁금하다면?

코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!