Python办公自动化PPT批量转换操作


Posted in Python onSeptember 15, 2021

如果你有一堆 PPT 要做,他们的格式是一样的,只是填充的内容不一样,那你就可以使用 Python 来减轻你的负担。

PPT 分为内容和格式,用 Python 操作 PPT,就是利用 Python 对 PPT 的内容进行获取和填充,修改 PPT 的格式并不是 Python 的强项。因此,当你有一堆 PPT 要做的时候,先做好一个带格式的 PPT,然后用 Python 复制这个 PPT 文件,然后再对其进行读写。

python-pptx 模块的安装

pip install python-pptx

读取 PPT

假如文件「测试.pptx」的内容如下:

Python办公自动化PPT批量转换操作

那么以下代码可以读取其内容:

from pptx import Presentation
prs = Presentation("测试.pptx")
for index, slide in enumerate(prs.slides):
    print(f"第 {index+1} 页")
    for shape in slide.shapes:
        if shape.has_text_frame:
            text_frame = shape.text_frame
            # print(text_frame.text)
            # 如果分段读就用下面的代码
            for paragraph in text_frame.paragraphs:
                print(paragraph.text)

执行结果如下所示:

Python办公自动化PPT批量转换操作 

写入 PPT

先来个简单点的。

假如要生成如下图所示的 PPT 页

Python办公自动化PPT批量转换操作

代码可以这样写:

from pptx import Presentation
prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"
prs.save('test.pptx')

添加一张幻灯片

幻灯片都有板式,同样的,pptx 提供了 9 种版式让我们选择,分别是:

  • Title (presentation title slide)
  • Title and Content
  • Section Header (sometimes called Segue)
  • Two Content (side by side bullet textboxes)
  • Comparison (same but additional title for each side by side content box)
  • Title Only
  • Blank
  • Content with Caption
  • Picture with Caption

分别对应 PPT 的如下版式,我已经用数据一一标出:

Python办公自动化PPT批量转换操作

比如现在要添加一张标题和内容的版式,就可以这样写代码:

from pptx import Presentation
prs = Presentation()
SLD_LAYOUT_TITLE_AND_CONTENT = 1  ##标题和内容版式的序号
slide_layout = prs.slide_layouts[SLD_LAYOUT_TITLE_AND_CONTENT]
slide = prs.slides.add_slide(slide_layout)

为幻灯片添加内容

添加内容之前先理解一下形状。从技术上讲,可以在幻灯片上放置 9 种类型的形状:

  • 形状 - 带有填充和轮廓的自动形状
  • 文本框 - 没有填充和轮廓的自动形状
  • 占位符 - 可以出现在幻灯片布局或母版上的自动形状,并在使用该布局的幻灯片上继承,允许添加采用占位符格式的内容
  • 线路/连接器
  • 图片
  • 表格 - 行和列的东西
  • 图表 ? 饼图、折线图等。
  • 智能艺术 - 尚不支持,但如果存在则保留
  • 媒体剪辑——视频或音频

每一个幻灯片都有由一个形状树来组织,之所以称为树,是因为它在一般情况下是分层的;形状树中的节点可以是一个组形状,它本身可以包含形状并具有与形状树相同的语义。对于大多数用途,形状树具有列表语义。

获取幻灯片中的形状:

shapes = slide.shapes

自动形状是规则形状。正方形、圆形、三角形、星星之类的。有 182 种不同的形状可供选择。其中 120 个具有调整“手柄”,您可以使用它来改变形状。

许多形状类型共享一组公共属性。我们将在此处介绍其中的许多形状,因为其中一些形状只是 AutoShape 的一种特殊形式。

添加自动形状

以下代码添加一个圆角矩形形状,一英寸见方,并放置在距幻灯片左上角一英寸处:

from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches
shapes = slide.shapes
left = top = width = height = Inches(1.0)
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)
prs.save('新建幻灯片.pptx')

有关所有 182 种自动形状类型的列表,具体请参阅官方文档 MSO_AUTO_SHAPE_TYPE 枚举项。

占位符

占位符也是一种形状,有 18 种类型的占位符。标题、中心标题、副标题、正文,内容,图片,剪贴画,图表、表格、智能艺术,日期、页脚、幻灯片编号,媒体剪辑,标题,垂直正文、垂直对象、垂直标题。

幻灯片上的占位符可以为空或已填充。这在图片占位符中最为明显。未填充时,占位符会显示可自定义的提示文本。内容丰富的占位符在为空时也会显示一个或多个内容插入按钮。

纯文本占位符在输入文本的第一个字符时进入“填充”模式,并在删除文本的最后一个字符时返回“未填充”模式。内容丰富的占位符在插入图片等内容时进入填充模式,并在删除该内容时返回未填充模式。为了删除填充的占位符,形状必须被删除两次。第一次删除删除内容并将占位符恢复到未填充模式。额外的删除将删除占位符本身。可以通过重新应用布局来恢复已删除的占位符。

访问占位符

>>> prs = Presentation()
>>> slide = prs.slides.add_slide(prs.slide_layouts[8])
>>> for shape in slide.placeholders:
...     print('%d %s' % (shape.placeholder_format.idx, shape.name))
...
0  Title 1
1  Picture Placeholder 2
2  Text Placeholder 3

如果已经知道占位符的索引,也可通过索引来访问:

>>> slide.placeholders[1]
<pptx.parts.slide.PicturePlaceholder object at 0x10d094590>
>>> slide.placeholders[2].name
'Text Placeholder 3'

将内容插入占位符

>>> prs = Presentation()
>>> slide = prs.slides.add_slide(prs.slide_layouts[8])
>>> placeholder = slide.placeholders[1]  # idx key, not position
>>> placeholder.name
'Picture Placeholder 2'
>>> placeholder.placeholder_format.type
PICTURE (18)
>>> picture = placeholder.insert_picture('my-image.png')

如果要插入表格:

from pptx import Presentation
from pptx.util import Inches
prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapes
shapes.title.text = 'Adding a Table'
rows = cols = 2
left = top = Inches(2.0)
width = Inches(6.0)
height = Inches(0.8)
table = shapes.add_table(rows, cols, left, top, width, height).table
# set column widths
table.columns[0].width = Inches(2.0)
table.columns[1].width = Inches(4.0)
# write column headings
table.cell(0, 0).text = 'Foo'
table.cell(0, 1).text = 'Bar'
# write body cells
table.cell(1, 0).text = 'Baz'
table.cell(1, 1).text = 'Qux'
prs.save('write_ppt_table.pptx')

如果要插入图表:

from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
# create presentation with 1 slide ------
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])
# define chart data ---------------------
chart_data = CategoryChartData()
chart_data.categories = ['East', 'West', 'Midwest']
chart_data.add_series('Series 1', (19.2, 21.4, 16.7))
# add chart to slide --------------------
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
) 
prs.save('write_ppt_chart.pptx')

PPT 转 Pdf

以下方法仅适用于 windows

def PPTtoPDF2(inputFileName, outputFileName, formatType = 32):
    import comtypes.client
    powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
    powerpoint.Visible = 1
    if outputFileName[-3:] != 'pdf':
        outputFileName = outputFileName + ".pdf"
    deck = powerpoint.Presentations.Open(inputFileName)
    deck.SaveAs(outputFileName, formatType) # formatType = 32 for ppt to pdf
    deck.Close()
    powerpoint.Quit()

最后的话

本文抛砖引玉,更多复杂的 PPT 操作,请移步至文末的官方文档。

参考文档:

https://python-pptx.readthedocs.io/en/latest/user/quickstart.html

以上就是Python办公自动化PPT批量转换操作的详细内容,更多关于Python办公自动化的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python 文件重命名工具代码
Jul 26 Python
Python批量修改文本文件内容的方法
Apr 29 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
Python实现购物车购物小程序
Apr 18 Python
儿童编程python入门
May 08 Python
详解Django的CSRF认证实现
Oct 09 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
python 实现多维数组转向量
Nov 30 Python
Django REST Swagger实现指定api参数
Jul 07 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 Python
python实现学员管理系统(面向对象版)
Jun 05 Python
Python办公自动化解决world文件批量转换
Sep 15 #Python
Python函数式编程中itertools模块详解
Sep 15 #Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 #Python
Python3.10的一些新特性原理分析
Sep 15 #Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 #Python
Python编程编写完善的命令行工具
Sep 15 #Python
python可视化之颜色映射详解
You might like
PHP 函数执行效率的小比较
2010/10/17 PHP
php 生成文字png图片的代码
2011/04/17 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHP pear安装配置教程
2016/05/14 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
js单词形式的运算符
2014/05/06 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
2019/09/23 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
python3制作捧腹网段子页爬虫
2017/02/12 Python
Python开发的实用计算器完整实例
2017/05/10 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
投资意向书范本
2014/04/01 职场文书
派出所所长先进事迹
2014/05/19 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
高校教师个人总结
2015/02/10 职场文书