엑셀 데이터를 기반으로 수료증 슬라이드 생성하기
이번 수업에서는 수료증 파워포인트 템플릿(.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
-
openpyxl
: 엑셀 파일을 읽고 수정하는 파이썬 라이브러리입니다. -
pptx
: 파워포인트 파일을 생성, 수정할 수 있는 라이브러리입니다. -
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
파일로 저장합니다.
전체적인 흐름 요약
-
엑셀에서 데이터를 읽어옵니다.
-
첫 번째 슬라이드를 템플릿으로 사용하여 엑셀의 각 데이터를 새로운 슬라이드에 삽입합니다.
-
텍스트와 이미지를 템플릿과 동일하게 복사하면서, 텍스트 내용은 엑셀 데이터로 대체합니다.
-
템플릿 슬라이드를 삭제하고, 최종 결과를 파일로 저장합니다.
Run the code and check the results.
Guidelines
AI Tutor
Publish
Design
Upload
Notes
Favorites
Help
Code Editor
Execution Result
The document is empty.
Try running the code.