我有一个 python 应用程序,它生成 powerpoint 演示文稿并根据模板演示文稿和给定数据用数据填充它们。
在某些情况下,如果数据集中未提供预期数据,形状将被删除。 为此,我使用了来自另一个线程的以下两行代码 (https://stackoverflow.com/a/66176495/18337451):
sp = shape._element
sp.getparent().remove(sp)
一些可能被删除的形状还带有动画,这现在很麻烦。生成的 PowerPoint 演示文稿,其中带有动画的形状被删除,带有“修复”通知。修复通常工作正常,但有问题的幻灯片会丢失所有动画。
不幸的是,修复和丢失动画不是一种选择,我想知道是否有办法以某种方式访问幻灯片的动画并在必要时删除它们。
浏览此处时,我了解到当删除的形状与其他东西(在我的例子中是动画)有关系时,这是很自然的情况。我还没有看到
python-pptx
中的动画在这里被详细讨论,这就是为什么我决定在这里询问是否有某种方法可以使用 python-pptx
. 访问幻灯片动画
我也可以增加我的模板演示并消除删除形状的需要,但直接访问动画并按需删除它们将是一个更快的解决方案,如果可能的话也是我的首选。
我最近遇到了类似的问题,但找到的解决方案同样很少。所以我看了一下PP OpenXML结构(https://python-pptx.readthedocs.io/en/latest/dev/analysis/shp-movie.html列出了一些关于动画的有用链接)
至少在我的PP文件中,一个group/shape/...看起来是这样的,例如:
<p:nvSpPr>
<p:cNvPr id="21" name="the name of the shape in pp - as can be seen in the annimations tab">
<a:extLst>
<a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}">
<a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main"
id="{98BAD8BC-0BED-13E4-F6CA-8AF968326972}"/>
</a:ext>
</a:extLst>
</p:cNvPr>
<p:cNvSpPr/>
<p:nvPr/>
</p:nvSpPr>
如您所见,它带有一个
id
(在本例中为21
)。稍后在 OpenXML 中再次引用它以使用参数 spid
: 进行动画
<p:spTgt spid="21"/>
至少在我的例子中,整个/实际/“主要”动画元素总是比这个
<p:spTgt spid="21"/>
高 7 个级别。
因此,您可以获得此“主要”元素并随后也将其删除。动画消失了,至少对我来说,当我打开这样编辑的 PP 文件时,没有显示修复对话框。
所以你要找的代码应该是这样的:
sp = shape._element
sp_id = sp.get("id")
animation_reference = sp.findall(f'.//*[@spid="{sp_id}"]')
animation_main_element = animation_reference.find("./../../../../../../..")
animation_main_element.getparent().remove(animation_main_element)
sp.getparent().remove(sp)