文章目录
- 简介
- 能做什么
- PPT要素介绍
- 官方demo
- 高阶引申
- 参考文献
202201笔记迁移
简介
python-pptx包是用来自动化处理ppt的。
使用的第一步是安装
pip install python-pptx
相比python-docx,python-pptx的使用更为麻烦一些,原因有很多,比如说,正常人不会在docx里花里胡哨调格式,但是pptx则正好相反。
能做什么
读取/修改已有PPT内的内容,从0开始创建一个新的PPT,并可以实现所有你平时手动做的所有内容,甚至如果你不怕麻烦的话,你还可以用它生成图表,修改图表数据。
PPT要素介绍
在使用python操作PPT之前,首先要清楚PPT的结构,以便于后续更好的理解代码的编写。
所以直接从网上download了一张图:
有这么几个比较重要的要素:
Presentation:即PPT对象,类似docx中的Document对象;
Slide:即幻灯片页,每一张幻灯片就是一个Slide对象。可以说,一个Presentation对象是由一堆Slide对象组成的。
Shape:即内容框,一个Slide对象是由一堆Shape对象组成的;
Paragraph:从某种意义上来讲,每个shape有点像是自成一个docx文档,因为每个Shape由一堆Paragraph组成,而Paragraph又是由一堆run组成。
run:见上。对run块的理解,可以参考之前在python-docx一文中对run的介绍;
Placeholder:即占位符,算是幻灯片母版中的一个概念,你生成一个空白幻灯片之后,总会出现“单击此处添加文本”之类的,这些方框就被叫做占位符,按照我的理解,其实就是一些特殊的Shape。(后来在官方文档里也看到了这样的描述,即A placeholder is a shape¶)
官方demo
老规矩,还是从官方demo的基础上做介绍。
简单生成一页PPT:
from pptx import Presentation# 生成ppt对象
prs = Presentation()
# 生成幻灯片样式对象,slide_layouts是母版样式,索引表示选择第几个母版样式
title_slide_layout = prs.slide_layouts[0]
# 基于所选择的样式对象,生成一个slide(幻灯片页)
slide = prs.slides.add_slide(title_slide_layout)# 取出该slide的标题对象
title = slide.shapes.title
# 取出索引为1的占位符对象,第0个占位符对象其实就是上面的title对象
subtitle = slide.placeholders[1]
# 为其文本属性赋值
title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"# 保存文件
prs.save('test.pptx')
需要说一下母版样式slide_layouts,每个PPT默认带有11个母版版式,即:
可以在代码中用以下做验证:
# 一个空白的PPTX模板有多少个母版样式
print(len(prs.slide_layouts))
简单的已经过了,再上个稍微有点难度的。
高阶引申
如何查看占位符ID?
下面实例里,把每个占位符的ID等信息直接打在了text上。
from pptx import Presentationprs = Presentation()
# prs.slide_layouts[]表示的是ppt中不同的版式
slide = prs.slides.add_slide(prs.slide_layouts[0])
for shape in slide.placeholders:phf = shape.placeholder_formatprint(f"{phf.idx}--{shape.name}--{phf.type}") # f表示字符串内支持大括号内的python表达式shape.text = f"{phf.idx}--{shape.name}--{phf.type}"prs.save('占位符.pptx')
怎么拿幻灯片页里的所有文字?
from pptx import Presentationprs = Presentation(path_to_presentation)# text_runs will be populated with a list of strings,
# one for each text run in presentation
text_runs = []for slide in prs.slides:for shape in slide.shapes:# 并不是所有的shape都有text_frame,所以如果你不想有exception的话,就需要手动check一下if not shape.has_text_frame:continuefor paragraph in shape.text_frame.paragraphs:for run in paragraph.runs:text_runs.append(run.text)
参考文献
- python-pptx官方文档
- python自动化办公手册之python操作PPT 不错的样例讲解
- python自动化办公——python操作Excel、Word、PDF集合大全 比较全面的样例讲解,唯一的问题是网页的黑色背景,感觉不是很好看哈哈哈哈哈