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

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

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


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

라이브러리 불러오기
import openpyxl
from pptx import Presentation
from io import BytesIO
from pptx.enum.shapes import MSO_SHAPE_TYPE
  • openpyxl: 엑셀 파일을 읽고 수정하는 파이썬 라이브러리입니다.

  • pptx: 파워포인트 파일을 생성, 수정할 수 있는 라이브러리입니다.

  • io.BytesIO: 이미지 같은 이진 데이터를 처리할 때 사용되는 메모리 버퍼입니다.

  • 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:
image_stream = sub_shape.image.blob
new_slide.shapes.add_picture(
BytesIO(image_stream), sub_shape.left, sub_shape.top, sub_shape.width, sub_shape.height
)
elif shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
image_stream = shape.image.blob
new_slide.shapes.add_picture(
BytesIO(image_stream), shape.left, shape.top, shape.width, shape.height
)
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()
new_paragraph.text = paragraph.text
new_paragraph.alignment = paragraph.alignment
if len(paragraph.runs) > 0:
new_paragraph.font.size = paragraph.runs[0].font.size
new_paragraph.font.bold = paragraph.runs[0].font.bold
new_paragraph.font.italic = paragraph.runs[0].font.italic
  • 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. 템플릿 슬라이드를 삭제하고, 최종 결과를 파일로 저장합니다.

다음 내용이 궁금하다면?

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