python - 如何使用现有的 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')
解决方案
我使用只有 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')
推荐阅读
- python - 视觉模拟量表精神病
- reactjs - DropdownMenu 在每次点击时重新呈现所有下拉项
- html - flexbox 的媒体查询问题
- image - 检测图像中的重复图案
- python - Python 'pandas' 在 0.23.0 版上没有属性 'ewm' 但在 0.18.0 版上没问题
- django - 在 windows 的 django 中设置一个 cron 作业
- java - Maven Dependency Plugin 如何确定使用的依赖项
- javascript - ElectronJS Webview cookie 没有被清除
- google-maps-api-3 - 聚合物 3 - 谷歌地图
- angular - 如何使用 Angular 2+ 基于动态数据创建和导出文本文件