python批量制作ppt_实例25_批量生成PPT版荣誉证书

到学期末,幼儿园的小朋友除了让家长带上床上用品等回家,还有一张“好孩子”的“荣誉证书”。这个不像大朋友或者成人的荣誉证书,必须是通过激烈竞争而只有少数人才能获得的。这个可是人手一份的,大家都是“好孩子”。如果有小朋友没有拿到这个荣誉证书,家长和小孩子可不愿意了,非得找老师理论不可,哈哈。

老婆所在的幼儿园每学期都要搞这个事情,整个幼儿园近400份荣誉证书,一个一个填写,专人要填几天。这不,这次园长让老婆来填,真愁死人了!老婆知道我在鼓捣编程什么的,跑来亲切地询问是否可以代劳。好吧,领导相求,必须拍胸脯保证行啊。

此处,需要用到第三方库pptx。这个是专门用来创建和修改PPT幻灯片的库(PPT文件必须是.pptx为后缀的)。我们先安装这个库,步骤如下:Windows徽标键+字母键R,输入"cmd”运行命令输入窗口

2. 输入"pip install python-pptx",耐心等待下载及安装

有时候网络太差,下载到中途会崩溃,也可以直接去这个库所在的网站(python-pptx )用迅雷下载到本地盘,再安装。比如我将这个下载好的压缩文件解压到E盘,然后打开运行cmd,输入"E:"进入E盘,再输入"cd python-pptx-0.6.18"进入其所在文件夹,最后输入"python setup.py install"进行安装。

如下是安装完成的提示,然后就可以使用了。

首先,需要在幻灯片母版的第一个版式中设置好模板,以便后面用程序调用:

此处,模板中插入了一张荣誉证书的背景图片,然后将文字部分分成了6个文本框(可根据实际情况灵活调整),在其中填入内容,设置好字体和字号。

在power point软件中设置好模板之后,需要用程序读取一下模板中的文本框所对应的编号,即占位符(placeholder)的ID。由于PPT中一页幻灯片的占位符编号随着PPT的不断更改,不一定是按1,2,3这样的顺序排列的,只有读取一下才知道。

from pptx import Presentation

prs = Presentation('data\荣誉证书模板.pptx')

slide = prs.slides.add_slide(prs.slide_layouts[0]) # 第一个模板的第0个板式

for ph in slide.placeholders: #遍历这页PPT的所有占位符

phf = ph.placeholder_format #获取占位符的格式

print(phf.idx) #打印其ID编号

ph.text = str(phf.idx)# 将编号写入PPT对应的位置中,以便后面一一对应

# 以上读取到占位符的ID方便后面调用

prs.save('data\荣誉证书模板-占位符编号.pptx')

>>

10

11

12

13

14

15

以上,我们先导入安装好的pptx库中的Presentation(演示文稿/幻灯片)模块,然后打开对应路径下的PPT模板,并存入prs变量。然后通过prs.slides.add_slide以母版中的第一个模板新增1张幻灯片。模板的版式编号是从0开始的,所以第一个版式对应的是[0]。然后遍历这页PPT的所有占位符,获取其占位符的格式,存入phf变量。然后通过phf.idx打印其ID编号。如上,我们可以看到结果。随后通过ph.text将编号写入PPT对应的位置中,以便后面一一对应。由下图可见,其编号从上到下是10~15。

模板做好,占位符ID确定后,就需要读取幼儿园所有小朋友的班级和名字信息,然后写入了。小朋友的信息存在现有的Excel表格中,使用openpyxl库读取出来即可。下面就来读取吧。

from openpyxl import load_workbook

wb = load_workbook("data\名单.xlsx")

ws = wb.active

data={}

for row in range(2,ws.max_row+1):

class_id = ws['A' + str(row)].value

name = ws['B' + str(row)].value

data.setdefault(class_id,[])

data[class_id].append(name)

data['小一'][:10]

>>['张1', '李1', '李13', '王9', '王21', '王33', '王45', '王57', '王69', '王81']

以上,将名单中的班级和姓名信息按“班级”为键,“姓名”组成的列表为值存入字典data。其中setdefault的用法在实例19中有详细解释,请参考data['小一'][:10]查看一下小一班前10个同学的数据。下面开始批量写入PPT。

import time

t0=time.time()# 程序开始运行的时间

prs = Presentation('data\荣誉证书模板.pptx')

slide_layout = prs.slide_layouts[0] #调用设置好的母版,因为是母版的第一版式,所以取[0]

for class_id in data:

for name in data[class_id]:

slide = prs.slides.add_slide(slide_layout) #以母版的版式为基础新增一页幻灯片

#往幻灯片中写入内容

slide.placeholders[10].text = "{}班{}同学:".format(class_id,name) #此处是班级和姓名

slide.placeholders[11].text = "在2019-2020学年度第一学期获得"

slide.placeholders[12].text = "“好孩子”称号。"

slide.placeholders[13].text = "特发此证,以资鼓励。"

slide.placeholders[14].text = "市幼儿园"

slide.placeholders[15].text = "2020年1月"

prs.save('data\荣誉证书(总).pptx')

t1 = time.time()

print('程序用时:',str(round(t1-t0))+'秒。')

>>程序用时: 8秒。

400名小朋友的奖状只用了8秒钟写完。以上,通过for循环先获取班级,然后第二个for循环获取该班级下面对应的姓名,对于每个姓名,通过prs.slides.add_slide新建一页幻灯片,然后按我们先前获取的占位符ID,写入内容。除了班级和姓名,其它都是固定的内容。写入完成后,保存打印即可。而且PPT里是按班级排序的,这样每个班级的荣誉证书在打印后会集中在一起,方便区分。

如果您有需要处理的问题,可发邮件到我邮箱:[email protected],一起探讨解决方案。

以上在Jupyter notebook上完成,所用到的代码及Excel 资料已上传GitHub及百度网盘, 欢迎下载到本地随意玩。

Python版本:Python 3.6 64bit

操作系统:Windows 7

GitHub:Office_Automation_by_Using_Python

百度Pan:“pan.baidu”加上“.com/s/1WXcoYts_uNJmccfJ0lrmWg” 提取码: kry7

WeiXin:Python操作Office软件高效工作

你可能感兴趣的:(python批量制作ppt)