【问题标题】:Shape numbers/indexes of each pptx slide within existing presentation现有演示文稿中每张 pptx 幻灯片的形状编号/索引
【发布时间】:2019-10-23 06:04:45
【问题描述】:

我是 python pptx 库的新手,我的问题是:如何使用 Python Library pptx 在现有演示文稿中定义形状列表、形状编号/索引(shapetree)和形状类型?我想更新现有的 ppt 演示文稿,似乎第一步是在每张幻灯片上找到确切的形状标识符,以便通过更新访问它们。您能给我指出一个现有的解决方案或可能的例子吗?

【问题讨论】:

    标签: python python-pptx


    【解决方案1】:

    我假设“定义”是指“发现”,因为通常没有充分的理由来更改现有值。

    一个好的开始方法是循环并打印一些属性:

    prs = Presentation("my-deck.pptx")
    for slide in prs.slides:
        for shape in slide.shapes:
            print("id: %s, type: %s" % (shape.shape_id, shape.shape_type))
    

    您可以使用此处 API 文档中列出的任何幻灯片和/或形状属性来获得所需的详细信息:
    https://python-pptx.readthedocs.io/en/latest/api/shapes.html#shape-objects-in-general

    要通过 id(或名称)查找形状,您需要如下代码:

    def find_shape_by_id(shapes, shape_id):
        """Return shape by shape_id."""
        for shape in shapes:
            if shape.shape_id == shape_id:
                return shape
        return None
    

    或者如果你做很多事情,你可以使用 dict 来完成这项工作:

    shapes_by_id = dict((s.shape_id, s) for s in shapes)
    

    然后为您提供所有方便的方法,例如:

    >>> 7 in shapes_by_id
    True
    >>> shapes_by_id[7]
    <pptx.shapes.Shape object at 0x...>
    

    【讨论】:

    • 一个后续问题:形状的哪些属性最好用来引用它?例如,如果我试图定义幻灯片 [0] 上的图表并且它的名称为 Chart 1,那么我应该提取哪些其他属性来正确定义它以替换其中的数据。而且,定义对象的最佳方法是什么,例如 chart = prs.slides[0].shapes...
    • 这是我正在尝试的。我知道 slide[0] 具有 shape_id 3 的图表,将其定义为替换数据的对象,我正在使用 chart = prs.slides[0].shape_id[3] 并且出现错误:AttributeError: 'SlideShapes'对象没有属性“shape_id”
    • shape-id 保证不会改变,因此是一个可靠的标识符。另一方面,根据您的目的,名称更容易更改(可以使用 PowerPoint UI 重命名形状),因此这通常是更实用的选择。最初的名称是通用的,例如“Rectangle 7”,因此通过将它们更改为稍后用于按名称查找的更具描述性的名称,您不会损失太多。您必须根据自己的目的自行判断,但我会说这是两者之间的选择,前者更可靠,后者更容易理解。
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多