如果你有一堆 ppt 要做,他们的格式是一样的,只是填充的内容不一样,那你就可以使用 python 来减轻你的负担。
ppt 分为内容和格式,用 python 操作 ppt,就是利用 python 对 ppt 的内容进行获取和填充,修改 ppt 的格式并不是 python 的强项。因此,当你有一堆 ppt 要做的时候,先做好一个带格式的 ppt,然后用 python 复制这个 ppt 文件,然后再对其进行读写。
python-pptx 模块的安装
pip install python-pptx
读取 ppt
假如文件「测试.pptx」的内容如下:
那么以下代码可以读取其内容:
1
2
3
4
5
6
7
8
9
10
11
|
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) |
执行结果如下所示:
写入 ppt
先来个简单点的。
假如要生成如下图所示的 ppt 页
代码可以这样写:
1
2
3
4
5
6
7
8
9
|
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 的如下版式,我已经用数据一一标出:
比如现在要添加一张标题和内容的版式,就可以这样写代码:
1
2
3
4
5
|
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 的一种特殊形式。
添加自动形状
以下代码添加一个圆角矩形形状,一英寸见方,并放置在距幻灯片左上角一英寸处:
1
2
3
4
5
6
7
8
|
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 种类型的占位符。标题、中心标题、副标题、正文,内容,图片,剪贴画,图表、表格、智能艺术,日期、页脚、幻灯片编号,媒体剪辑,标题,垂直正文、垂直对象、垂直标题。
幻灯片上的占位符可以为空或已填充。这在图片占位符中最为明显。未填充时,占位符会显示可自定义的提示文本。内容丰富的占位符在为空时也会显示一个或多个内容插入按钮。
纯文本占位符在输入文本的第一个字符时进入“填充”模式,并在删除文本的最后一个字符时返回“未填充”模式。内容丰富的占位符在插入图片等内容时进入填充模式,并在删除该内容时返回未填充模式。为了删除填充的占位符,形状必须被删除两次。第一次删除删除内容并将占位符恢复到未填充模式。额外的删除将删除占位符本身。可以通过重新应用布局来恢复已删除的占位符。
访问占位符
1
2
3
4
5
6
7
8
|
>>> 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 |
如果已经知道占位符的索引,也可通过索引来访问:
1
2
3
4
|
>>> slide.placeholders[ 1 ] <pptx.parts.slide.pictureplaceholder object at 0x10d094590 > >>> slide.placeholders[ 2 ].name 'text placeholder 3' |
将内容插入占位符
1
2
3
4
5
6
7
8
|
>>> 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' ) |
如果要插入表格:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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' ) |
如果要插入图表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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
1
2
3
4
5
6
7
8
9
10
|
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办公自动化的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/somenzz/article/details/119466361