首页 > 解决方案 > 如何使用现有的 ppt 在 power point 中使用 python 创建多张幻灯片

问题描述

我想自动创建 PowerPoint 幻灯片,每张幻灯片每个学生一张证书。为此,我从 Excel 电子表格中获取学生姓名,并将它们放入现有的 PowerPoint 中。例如,我有 100 名学生,因此我的 PowerPoint 中需要 100 个不同的证书。这是我到目前为止所做的:

from pptx import Presentation
import pandas as pd

dataframe = pd.read_excel('normal.xlsx')



prs = Presentation('C:\\Users\\xyz\\Desktop\\demo.pptx')

repl_str_u = 'Jhon cena'
repl_str_y = 'Dec-2019'
repl_str_l = 'Tom curze'

users = []
for i in dataframe['Nominee Name']:
    users.append(i)

x = len(users)

Manager = []
for i in dataframe['LPM']:
    Manager.append(i)

Month = []
for i in dataframe['Period']:
    Month.append(i)

for slide in prs.slides:
    for shape in slide.shapes:
        if shape.has_text_frame:
            for i in range(x):
                shape.text = shape.text.replace(search_str_username, users[i])
                shape.text = shape.text.replace(search_str_formonth, Month[i])
                shape.text = shape.text.replace(search_str_lpm, Manager[i])


prs.save('C:\\Users\\suraj\\Desktop\\op.pptx') 

标签: pythonexcelpython-3.xautomationpowerpoint

解决方案


我使用只有 3 个文本框的模板 (demo.pptx) 制作了这个示例。结果是一个包含 10 张幻灯片的演示文稿,每张幻灯片都有不同的文本。我使用了一个函数来复制我在这篇文章中找到的幻灯片。在您的用例中可能需要进行一些更改,但这是总体思路。

from pptx import Presentation
import pandas as pd
import copy
import six

def duplicate_slide(pres,index):
    template = pres.slides[index]
    try:
        blank_slide_layout = pres.slide_layouts[6]
    except:
        blank_slide_layout = pres.slide_layouts[len(pres.slide_layouts)-1]

    copied_slide = pres.slides.add_slide(blank_slide_layout)

    for shp in template.shapes:
        el = shp.element
        newel = copy.deepcopy(el)
        copied_slide.shapes._spTree.insert_element_before(newel, 'p:extLst')

    for _, value in six.iteritems(template.part.rels):
        # Make sure we don't copy a notesSlide relation as that won't exist
        if "notesSlide" not in value.reltype:
            copied_slide.part.rels.add_relationship(value.reltype,
                                            value._target,
                                            value.rId)

    return copied_slide

data = {'user': ['U0', 'U1', 'U2', 'U3', 'U4', 'U5', 'U6', 'U7', 'U8', 'U9'],
        'Manager': ['M0', 'M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9'],
        'Month': ['D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8', 'D9']}

df = pd.DataFrame(data)

prs = Presentation('demo.pptx')
x = df.shape[0]

for u in range(x-1):
    copied_slide = duplicate_slide(prs, 0)

for i, slide in enumerate(prs.slides):
    for j, shape in enumerate(slide.shapes):
        if shape.has_text_frame:
            shape.text = df.iloc[i, j]

prs.save('op.pptx')

这是“demo.pptx”的样子: 在此处输入图像描述


推荐阅读