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之入门(五)缩进和选择
May 27 Python
Python3 正在毁灭 Python的原因分析
Nov 28 Python
详解Python中的__new__()方法的使用
Apr 09 Python
用Python实现web端用户登录和注册功能的教程
Apr 30 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
python生成n个元素的全组合方法
Nov 13 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
django中的图片验证码功能
Sep 18 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
python反爬虫方法的优缺点分析
Nov 25 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 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
dedecms模板标签代码官方参考
2007/03/17 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
php类的定义与继承用法实例
2015/07/07 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
字符串的replace方法应用浅析
2011/12/06 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
vue实现分页加载效果
2019/12/24 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
Python httplib模块使用实例
2015/04/11 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
SQL Server笔试题
2012/01/10 面试题
小学班主任培训方案
2014/06/04 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
个人自荐书范文
2015/03/09 职场文书