엑셀 데이터를 기반으로 수료증 슬라이드 생성하기
이번 수업에서는 수료증 파워포인트 템플릿(.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. 파워포인트 파일 및 엑셀 파일 로드
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 = []
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
파일로 저장합니다.
전체적인 흐름 요약
-
엑셀에서 데이터를 읽어옵니다.
-
첫 번째 슬라이드를 템플릿으로 사용하여 엑셀의 각 데이터를 새로운 슬라이드에 삽입합니다.
-
텍스트와 이미지를 템플릿과 동일하게 복사하면서, 텍스트 내용은 엑셀 데이터로 대체합니다.
-
템플릿 슬라이드를 삭제하고, 최종 결과를 파일로 저장합니다.
위와 같이 엑셀 파일에서 데이터를 읽어와, PPT 템플릿 내 placeholder를 바꾸면 동일한 형식의 수료증 슬라이드를 여러 개 생성할 수 있습니다.
이러한 구조를 잘 응용하면 대량의 수료증, 인증서, 명함 등 다양한 템플릿 기반의 문서를 자동으로 생성할 수 있습니다.
다음 내용이 궁금하다면?
코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!