pptx 批量操作幻灯片

27 篇文章 0 订阅

本文示例使用python-pptx模块批量生成幻灯片,批量修改导入幻灯片表格内容及格式,以及在指定页插入表格

前言

一个prs对象就是一棵树,它的下面挂载了多张幻灯片slide,而每张幻灯片下有多个shape实例,也就是你在制作幻灯片时的一个个隐形框框。其基本的层次关系如下,而table仅是其shapes集合中的一个子类型。

Presentation -> slide_masters -> slide_layouts
Presentation -> slides -> shapes -> placeholders | note | text_frame ...

安装

pip install python-pptx
  • 依赖
  • Python 2.6, 2.7, 3.3, 3.4, or 3.6
  • lxml
  • Pillow
  • XlsxWriter (to use charting features)

概念

类或关联属性简介相关方法
Presentation演示文稿构造对象-
slide_masters幻灯片母版(一个演示文件可以具有多个幻灯片母版)-
slide_layouts幻灯片布局(属于母版而非prs)-
slides幻灯片对象组,默认指向第一页add_slide
shapes形状,类似于ps中的画布,每个shap(如table)相当于图层add_shape
placeholders…占位符,字典辅助类-
  • 以下等价
prs = Presentation()
prs.slide_masters[0].slide_layouts[0]
prs.slide_layouts[0]
  • 层次关系
    Presentation -> slide_masters -> slide_layouts
    Presentation -> slides -> shapes -> placeholders | note | text_frame ...

批量创建

无中生有,见码

from pptx import Presentation
from pptx.util import Inches

# 演示文稿根对象,使用默认母版
prs = Presentation()
# 幻灯片布局
title_only_slide_layout = prs.slide_layouts[5]
# prs.slide_masters 幻灯片母版

for i in range(0,5):
    # 1. 当前幻灯片对象
    slide = prs.slides.add_slide(title_only_slide_layout)

    # 2. 当前shapes(背景画布)对象
    shapes = slide.shapes
    shapes.title.text = 'Adding a Table pardon110'+str(i)

    # 3.配置位置尺寸参数
    rows = cols = 2
    left = top = Inches(2.0)
    width = Inches(6.0)
    height = Inches(0.8)

    # 4.在(画布)上添加表格图层(表格是shapes的一种类型)
    table = shapes.add_table(rows, cols, left, top, width, height).table

    # 5.table图层设置
    table.columns[0].width = Inches(2.0)
    table.columns[1].width = Inches(4.0)

    # 6. 表格标题填充
    table.cell(0, 0).text = 'Foo'
    table.cell(0, 1).text = 'Bar'

    # 7. 表格内容填充
    table.cell(1, 0).text = 'Baz'
    table.cell(1, 1).text = 'Qux'

    # # 添加多个表格
    # left = Inches(2.0)
    # top = Inches(6.0)
    # 当前画布上添加另一个表格
    # table = shapes.add_table(rows, cols, left, top, width, height).table
    # table.cell(0, 0).text = 'pardon110'

prs.save('test.pptx')

效果

批量生成幻灯片

定点修改

以上节生成的test.pptx为导入模板源,
修改第2和第4张幻灯片中第一个表格第二行一列的内容,变更原始列宽
并在对应幻灯片内后插入第二个表格,生成了新的修改后的版本change.pptx

from pptx import Presentation
from pptx.util import Inches
from pptx.enum.dml import MSO_THEME_COLOR


# 演示文稿根对象,选择指定模板
prs = Presentation("test.pptx")
# 幻灯片布局
title_only_slide_layout = prs.slide_layouts[5]
# prs.slide_masters 幻灯片母版

for i in range(len(prs.slides)):
    # 修改既有pptx,在第2,4页插入第二张表格,并将所在第一张表格二行一列数据进行修改
    if i not in [1,3]:
        continue
    # 1. 当前幻灯片对象
    slide = prs.slides[i]
    # 2. 当前shapes(背景画布)对象
    shapes = slide.shapes
    # 修改幻灯片主题内容
    shapes.title.text = 'update theme pardon110'+str(i)
    # 修改幻灯片主题背景
    fill = shapes[0].fill
    fill.solid()
    fill.fore_color.theme_color = MSO_THEME_COLOR.ACCENT_1
    fill.fore_color.brightness = -0.25

    # 3.配置位置尺寸参数
    rows = cols = 2
    left = Inches(2.0)
    top = Inches(6.0)
    width = Inches(6.0)
    height = Inches(0.8)

    # 4.在(画布)上增加第二个表格
    shape = shapes.add_table(rows, cols, left, top, width, height)
    table = shape.table

    # 5.table图层设置
    table.columns[0].width = Inches(2.0)
    table.columns[1].width = Inches(4.0)

    # write column headings
    table.cell(0, 0).text = 'name'
    table.cell(0, 1).text = 'action'

    # write body cells
    table.cell(1, 0).text = 'ppt'
    table.cell(1, 1).text = 'txt'

    # 断言当前幻灯片第二个shape是否为表格,则可访问第一个表格实例
    # 更改当前幻灯片第一个表格的第二行第一列内容,并更改其列宽
    # 基于同样的原理可以对指定模板的数据进行增删改查,背景填充,颜色,字体变更....
    if shapes[1].has_table:
        shapes[1].table.cell(1,0).text='pardon_00'+str(i+1)+'_slide'
        shapes[1].table.columns[0].width = Inches(3.0)

prs.save('change.pptx')

效果

批量修改幻灯片

关键

shapes 对象是一个集合类容器,可以数组的形式访问当前页下的多个shape实例,但对于特定shape,如表格,图表 ,艺术字,多媒体(音频)资源,需要先断言后转换具体类实例使用。

class GraphicFrame(BaseShape):
“”“Container shape for table, chart, smart art, and media objects.
Corresponds to a <p:graphicFrame> element in the shape tree.
“””

补充

官方提供的api,已经能够对pptx基本元素增改查。
更多功能请参阅 官方文档 https://python-pptx.readthedocs.io/en/latest/user/install.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值