Python自动化办公:pptx篇


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对象;

扫描二维码关注公众号,回复: 15816460 查看本文章

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 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)

参考文献

  1. python-pptx官方文档
  2. python自动化办公手册之python操作PPT 不错的样例讲解
  3. python自动化办公——python操作Excel、Word、PDF集合大全 比较全面的样例讲解,唯一的问题是网页的黑色背景,感觉不是很好看哈哈哈哈哈

猜你喜欢

转载自blog.csdn.net/wlh2220133699/article/details/131737633