엑셀파일, 파워포인트 템플릿 읽기
기존 Excel파일 및 PPT파일이 만들어져 있는 상황에서 수정이 필요할 때 파이썬으로 파일 읽는 방법
import pandas as pd
from pptx import Presentation
#Excel파일 읽기
file_path = "./profile.xlsx"
df = pd.read_excel(file_path)
#PPT파일 읽기
prs_read = Presentation("./PPT_read.pptx")
source_slid = prs_read.slides[0]
for shape in source_slid.shapes:
print(shape.name)
print(shape.shape_type)
print(shape.text)
print()
템플릿 슬라이드 복제
python-pptx라이브러리는 슬라이드를 통째 복사하는 함수를 기본으로 제공하지 않음.
원본 슬라이드의 shape를 하나씩 복사하여 사용하여야 한다.
이 과정을 pptx내부구조 XML기반으로 코드가 짜져있는걸 복사해서 사용하여야 한다.
XML기반 복사과정 코드
for shape in source_slide.shapes:
el = shape.element
newel = copy.deepcopy(el)
copy_slide.shapes._spTree.insert_element_before(newel,'p:extLst')
return copy_slide
템플릿 복제 전체 코드
#결과 객체 생성
prs = Presentation()
#슬라이드 크기 설정
prs.slide_width = prs_read.slide_width
prs.slide_height = prs_read.slide_heigh
timport copy
def duplicate_slide(prs, source_slide): #사용자정의함수로 복제된 슬라이드를 반환하는 함수
slide_layout = prs.slide_layouts[6] #빈 레이아웃 생성
copy_slide = prs.slides.add_slide(slide_layout) #생성한 빈 레이아웃을 복사하여 또 다른 레이아웃을 생성
#XML기반 복제코드
for shape in source_slide.shapes:
el = shape.element
newel = copy.deepcopy(el)
copy_slide.shapes._spTree.insert_element_before(newel,'p:extLst')
return copy_slide
복제한 슬라이드 엑셀 데이터 삽입
for idx,row in df.iterrows(): #df의 행 하나씩 접근
new_slide = duplicate_slide(prs, prs_read.slides[0]) #새로운 슬라이드 생성
#추가된 정보들 해당 정보에 맞게 박스 수정
team_text_frame = new_slide.shapes[1].text_frame
team_p = team_text_frame.paragraphs[0]
team_p.text = row["team"] + "/" + row["role"]
name_text_frame = new_slide.shapes[2].text_frame
name_p = name_text_frame.paragraphs[0]
name_p.text = " ".join(row["name"])
prs.save("./output_workshop.pptx")
이 글은 제가 공부하면서 개념정리 겸 작성하는 글입니다.
틀린점이 있을 수도 있습니다.
[파이썬 업무자동화] 여섯번째. 지도 불러오기, 데이터를 이용한 지도 시각화, 지도를 이미지로 변환 (2) | 2025.06.02 |
---|---|
[파이썬 업무자동화] 다섯번째 - 이미지 불러오기, 편집, 저장(워터마크) (2) | 2025.06.02 |
[파이썬 업무자동화] 세번째. 파이썬으로 PPT제작 그리고 수정 - python-pptx라이브러리 (1) | 2025.05.31 |
[파이썬 업무자동화] 두번째. pandas모듈 이용한 엑셀 파일병합,저장 - 자동화 (0) | 2025.05.30 |
[파이썬 업무 자동화] 첫번째. 라이브러리 와 os모듈 (1) | 2025.05.30 |