Как я могу создать несколько слайдов, используя существующий PPT, используя python в Power Point - PullRequest
0 голосов
/ 19 марта 2020

Я хочу автоматизировать создание слайдов PowerPoint с одним сертификатом на каждого студента на слайд. Для этого я беру имена учеников из таблицы Excel и помещаю их в существующую PowerPoint. У меня, например, 100 студентов, и поэтому мне нужно 100 различных сертификатов в моей PowerPoint. Вот что я сделал до сих пор:

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') 

1 Ответ

0 голосов
/ 19 марта 2020

Я сделал этот пример, используя шаблон (demo.pptx) только с 3 текстовыми полями. Результатом является презентация с 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": enter image description here

...