赞
踩
python-pptx包是用来自动化处理ppt的。
使用的第一步是安装
pip install python-pptx
相比python-docx,python-pptx的使用更为麻烦一些,原因有很多,比如说,正常人不会在docx里花里胡哨调格式,但是pptx则正好相反。
读取/修改已有PPT内的内容,从0开始创建一个新的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的基础上做介绍。
简单生成一页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 Presentation
prs = Presentation()
# prs.slide_layouts[]表示的是ppt中不同的版式
slide = prs.slides.add_slide(prs.slide_layouts[0])
for shape in slide.placeholders:
phf = shape.placeholder_format
print(f"{phf.idx}--{shape.name}--{phf.type}") # f表示字符串内支持大括号内的python表达式
shape.text = f"{phf.idx}--{shape.name}--{phf.type}"
prs.save('占位符.pptx')
怎么拿幻灯片页里的所有文字?
from pptx import Presentation prs = 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: continue for paragraph in shape.text_frame.paragraphs: for run in paragraph.runs: text_runs.append(run.text)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。