엑셀 데이터를 기반으로 수료증 슬라이드 생성하기
이번 수업에서는 파워포인트(.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. 파워포인트 파일 및 엑셀 파일 로드
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:
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
파일로 저장합니다.
전체적인 흐름 요약
-
엑셀에서 데이터를 읽어옵니다.
-
첫 번째 슬라이드를 템플릿으로 사용하여 엑셀의 각 데이터를 새로운 슬라이드에 삽입합니다.
-
텍스트와 이미지를 템플릿과 동일하게 복사하면서, 텍스트 내용은 엑셀 데이터로 대체합니다.
-
템플릿 슬라이드를 삭제하고, 최종 결과를 파일로 저장합니다.
다음 내용이 궁금하다면?
코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!