Post

파이썬으로 파워포인트 자동화 – 슬라이드 복제/복사

파이썬으로 파워포인트 슬라이드 복제하는 방법 코드 예시. python-ppyx 라이브러리를 사용한다.

파워포인트 슬라이드 복제 – 파이썬 코드 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from pptx import Presentation
import copy

'''슬라이드 복사 함수'''
def duplicate_slide(prs, index):
    
    # 원본 슬라이드 번호 정의
    source_slide = prs.slides[index]

    # 빈 레이아웃 설정 (슬라이드 레이아웃 정의 필요)
    try:
        slide_layout = prs.slide_layouts[6]
    except:
        slide_layout = prs.slide_layouts[len(prs.slide_layouts)]

    copied_slide = prs.slides.add_slide(slide_layout)

    # 원본 슬라이드에서 shape 복제
    for shape in source_slide.shapes:
        el = shape.element
        newel = copy.deepcopy(el)
        copied_slide.shapes._spTree.insert_element_before(newel, 'p:extLst')

    return copied_slide

슬라이드를 복제하기 전에 슬라이드 레이아웃을 정해야 하는데, 빈 레이아웃으로 해주어야 잡스러운 개체 틀이 포함되지 않는다.

Office 테마 기본 레이아웃 상에서 빈 레이아웃은 기본적으로 (파이썬에서 번호는 0부터 시작하기 때문에) 6번이다.

만약 직접 슬라이드 마스터에서 레이아웃을 설정할 수 있다면, 원하는 레이아웃을 만들고 그 번호를 넣어줘도 된다.

응용

나는 엑셀에서 데이터를 불러와 그 행 개수만큼 슬라이드를 복제해놓고, 해당 슬라이드에서 텍스트를 찾아 바꾸는 작업을 했기 때문에 다음과 같이 코드를 작성해서 활용했다. (openpyxl 라이브러리 활용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from openpyxl import load_workbook
from pptx import Presentation
import copy


'''슬라이드 복사 함수'''
def duplicate_slide(prs, index):
    
    # 원본 슬라이드 번호 정의
    source_slide = prs.slides[index]

    # 빈 레이아웃 설정 (슬라이드 레이아웃 정의 필요)
    try:
        slide_layout = prs.slide_layouts[0]
    except:
        slide_layout = prs.slide_layouts[len(prs.slide_layouts)]

    copied_slide = prs.slides.add_slide(slide_layout)

    # 원본 슬라이드에서 shape 복제
    for shape in source_slide.shapes:
        el = shape.element
        newel = copy.deepcopy(el)
        copied_slide.shapes._spTree.insert_element_before(newel, 'p:extLst')

    return copied_slide


'''슬라이드에서 텍스트 찾아 바꾸기 함수'''
def replace_text_in_silde(prs, index, content):
    for 찾을내용, 바꿀내용 in sorted(content.items(), reverse=True):
        for shape in prs.slides[index].shapes:
            # 텍스트박스에서
            if shape.has_text_frame:
                for paragraph in shape.text_frame.paragraphs:
                    for run in paragraph.runs:
                        if 찾을내용 in run.text:
                            run.text = run.text.replace(찾을내용, str(바꿀내용))
            # 표에서
            if shape.has_table:
                for row in shape.table.rows:
                    for cell in row.cells:
                        for paragraph in cell.text_frame.paragraphs:
                            for run in paragraph.runs:
                                if 찾을내용 in run.text:
                                    run.text = run.text.replace(찾을내용, str(바꿀내용))


'''엑셀에서 데이터 불러오기'''
wb = load_workbook("./data.xlsx", data_only=True)
ws = wb.active

contents = []
keys = [row.value for row in ws["1:1"]]
for row in ws.iter_rows(min_row=2):
    content = dict(zip(keys, [cell.value for cell in row]))
    contents.append(content)


'''파워포인트 작업'''
prs = Presentation("./template.pptx")

# 개수-1 만큼 슬라이드 복제
for number in range(len(contents)-1):
    duplicate_slide(prs, 0)

# 각 슬라이드마다 데이터 찾아바꾸기 
for index, content in enumerate(contents):
    replace_text_in_silde(prs, index, content)

# 저장
prs.save('./output.pptx')

참고

This post is licensed under CC BY 4.0 by the author.