Я сделал этот пример, используя шаблон (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":