一、Python处理PPT
使用Python处理PPT文件通常需要使用第三方库来简化对PPT文件的读取、写入和修改操作。下面介绍一些常用的Python库和它们的功能:
- python-pptx:这是一个流行的Python库,用于创建、读取和修改PPTX(Office Open XML格式)文件。您可以使用它创建新的幻灯片、添加文本、图像和形状,还可以修改幻灯片的样式和布局。
- python-pptx-template:这个库在python-pptx的基础上增加了对模板的支持。您可以使用预定义的PPTX文件作为模板,然后在模板的基础上进行修改和生成新的演示文稿。
- python-com-pptx:这是一个用于操作PPT文件的Windows COM库。它可以与Microsoft PowerPoint应用程序进行交互,允许您通过Python脚本控制和修改PPT文件。
- pptx2pdf:这个库用于将PPT文件转换为PDF格式。它依赖于LibreOffice来进行转换,因此需要确保系统中已安装LibreOffice。
这里是一个使用python-pptx库创建简单幻灯片的示例:
from pptx import Presentation # 创建一个新的PPT文件 presentation = Presentation() # 添加一张幻灯片 slide = presentation.slides.add_slide(presentation.slide_layouts[5]) # 在幻灯片中添加标题和内容 title = slide.shapes.title content = slide.placeholders[1] title.text = "欢迎使用Python处理PPT" content.text = "这是一个使用python-pptx库创建的演示文稿示例。" # 保存PPT文件 presentation.save("example.pptx")
请注意,您需要在运行脚本之前先安装相应的库。您可以使用pip
来安装这些库:
pip install python-pptx pip install python-pptx-template pip install comtypes # 用于python-com-pptx
使用Python处理PPT文件有许多好处:
- 自动化:Python可以帮助您自动完成与PowerPoint有关的重复性任务,比如创建演示文稿、更新内容、添加幻灯片或格式化元素。这可以节省大量时间和精力。
- 灵活性:Python提供了许多可以操作PPT文件的库和模块,让您可以进行各种操作,包括读取、写入、修改和提取数据。
- 库支持:有特定的Python库,如python-pptx,可以简化处理PowerPoint文件的复杂性,提供简单的API供开发人员使用。
- 定制化:使用Python,您可以根据动态数据或用户输入来定制PowerPoint演示文稿。例如,您可以将来自不同来源的数据合并到预先设计好的模板中,创建个性化的报告或演示文稿。
- 集成性:Python可以轻松与在数据分析、数据处理和报告流程中常用的其他工具和系统集成。这样,您可以将PPT生成与数据处理和分析结合起来,创建全面且有见地的演示文稿。
- 文本处理和数据提取:Python强大的文本处理能力使您可以从现有的PowerPoint演示文稿中提取信息。您可以搜索特定文本,从幻灯片中提取数据,甚至生成结构化数据以进行进一步的分析。
- 协作:使用Python处理PPT文件,您可以促进团队成员之间的协作,使他们可以以编程方式生成和更新演示文稿,减少手动错误并确保一致性。
- 跨平台:Python是一种跨平台语言,这意味着您的PPT处理脚本可以在不同的操作系统上运行,提供了灵活性和便捷性。
- 节省成本:Python是一种开源语言,用于PPT处理的库也是免费提供的。这使得Python成为处理PowerPoint文件的一种经济高效的解决方案。
总的来说,Python的简单性、丰富的库支持和自动化任务的能力使其成为处理PowerPoint文件的优秀选择,无论您是想自动化演示文稿、从幻灯片中分析数据还是生成动态报告。
二、批量生成PPT版荣誉证书
技术工具:
Python版本:3.9
代码编辑器:jupyter notebook
每到学期末,幼儿园的小朋友除了让家长带上床上用品等回家,还有一张“好孩子”的“荣誉证书”。这个不像大朋友或者成人的荣誉证书,必须是通过激烈竞争而只有少数人才能获得的。这个可是人手一份的,大家都是“好孩子”。如果有小朋友没有拿到这个荣誉证书,家长和小孩子可不愿意了,非得找老师理论不可,哈哈。朋友所在的幼儿园每学期都要搞这个事情,整个幼儿园近400份荣誉证书,一个一个填写,专人要填几天。这不,这次园长让朋友来填,真愁死人了!于是朋友跑来亲切地询问我是否可以代劳。好吧,朋友相求,必须拍胸脯保证行啊。
此处,需要用到第三方库`pptx`。这个是专门用来创建和修改PPT幻灯片的库(PPT文件必须是.pptx为后缀的)。我们先安装这个库,步骤如下:
1. Windows徽标键+字母键R,输入"cmd”运行命令输入窗口
2. 输入"pip install python-pptx",耐心等待下载及安装
有时候网络太差,下载到中途会崩溃,也可以直接去这个库所在的网站
(https://pypi.org/project/python-pptx/#files )用迅雷下载到本地盘,再安装。比如我将这个下载好的压缩文件解压到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')
以上,我们先导入安装好的`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]
以上,将名单中的班级和姓名信息按“班级”为键,“姓名”组成的列表为值存入字典`data`。通过`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))+'秒。')
400名小朋友的奖状只用了8秒钟写完。以上,通过`for`循环先获取班级,然后第二个`for`循环获取该班级下面对应的姓名,对于每个姓名,通过`prs.slides.add_slide`新建一页幻灯片,然后按我们先前获取的占位符ID,写入内容。除了班级和姓名,其它都是固定的内容。写入完成后,保存打印即可。而且PPT里是按班级排序的,这样每个班级的荣誉证书在打印后会集中在一起,方便区分。