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 相关文章推荐
window下eclipse安装python插件教程
Apr 24 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
Python定时器实例代码
Nov 01 Python
python实现汽车管理系统
Nov 30 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
Django 实现图片上传和显示过程详解
Jul 18 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
如何基于Python批量下载音乐
Nov 11 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 Python
python字典按照value排序方法
Dec 28 Python
Python3压缩和解压缩实现代码
Mar 01 Python
Python装饰器详细介绍
Mar 25 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 ADODB使用方法集锦
2008/03/25 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
Python 学习笔记
2008/12/27 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
python判断完全平方数的方法
2018/11/13 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
Python多进程编程常用方法解析
2020/03/26 Python
python属于解释型语言么
2020/06/15 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
满月酒答谢词
2014/01/14 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
小学生考试获奖感言
2014/01/30 职场文书
体育教师个人的自我评价
2014/02/16 职场文书
学校社会实践活动总结
2014/07/03 职场文书
新店开张活动方案
2014/08/24 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
博士生专家推荐信
2015/03/25 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
导游词之大雁塔景区
2019/09/17 职场文书