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 09 Python
Python实现的一个自动售饮料程序代码分享
Aug 25 Python
详解Python Socket网络编程
Jan 05 Python
Python卸载模块的方法汇总
Jun 07 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
python实现人民币大写转换
Jun 20 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
python对常见数据类型的遍历解析
Aug 27 Python
Python调用接口合并Excel表代码实例
Mar 31 Python
python 提取html文本的方法
May 20 Python
Django+Celery实现定时任务的示例
Jun 23 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设计模式中的工厂模式
2008/06/12 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
javascript读取xml
2006/11/04 Javascript
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
深入了解js原型模式
2019/05/30 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
2014两会学习心得:时代的发展
2014/03/17 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
鲁迅故居导游词
2015/02/05 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
企业宣传语大全
2015/07/13 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL