使用python-pptx自动重新排列PowerPoint幻灯片

时间:2019-05-16 19:49:56

标签: python powerpoint python-pptx

我们通常使用Powerpoint来方便我们的实验。我们在PowerPoint中使用“节”将幻灯片组组合在一起以完成每个实验任务。移动各个部分以平衡实验的任务顺序已经做了很多工作!

我认为我们可以在CSV中预定义一个平衡顺序(使用代表各部分顺序的数字字符串),该顺序可以从python中读取。然后使用python-pptx移动这些部分并保存每个订单的文件。我遇到的问题是了解如何从python-pptx中读取部分。如果有人比python有更好的解决方案,请告诉我。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

in the documentationspecifically this section)所述:

  

现在,添加幻灯片是幻灯片集合上的唯一操作。在撰写本文时,积压工作是删除幻灯片并将幻灯片移至列表中的其他位置。在一般情况下,将幻灯片从一个演示文稿复制到另一个演示文稿非常困难,因此,直到更多积压被销毁之后,这种情况才会出现。

或者换句话说,目前不能按照您的建议移动幻灯片。我使用过的最好的方法是生成一个新的演示文稿,然后将幻灯片重新排序(因为您可以添加幻灯片)。

例如说我在Presentation1.pptx中有以下幻灯片:

[0]
[1]
[2]
[3]
[4]

但是我想要

[2]
[3]
[4]
[0]
[1]

您的代码(采用未经测试的伪代码)将是:

old_presentation = Presentation("Presentation1.pptx")
new_presentation = Presentation()

for slide in old_presentation.slides[2:]:
    new_slide = new_presentation.slides.add_slide() # transfer the contents into new presentation for slides [2] [3] [4]
    populate_new_slide_from_old_slide(slide, new_slide)

for slide in old_presentation.slides[:2]:
    new_slide = new_presentation.slides.add_slide() # transfer the contents into new presentation for slides [0] [1]
    populate_new_slide_from_old_slide(slide, new_slide)

new_presentation.save()

populate_new_slide_from_old_slide()的外观(很确定这可以按原样运行,但我再次没有对其进行测试):

def populate_new_slide_from_old_slide(slide, new_slide):
    shapes_to_transfer = slide.shapes
    for shape in shapes_to_transfer:
        new_shape = new_slide.shapes.add_shape(shape)

我相信占位符也是形状,因此应通过此方法进行转移!

请注意,我已经有一段时间没有编码.pptx了,因此实际的实现可能略有不同。不过,从概念上讲,这是目前您要执行的唯一方法。我认为,如果您正在积极地生成数据(而不是在事后重新组织数据),那么仅制作一个new_presentation对象并将数据插入其中可能会更简单。对于我来说,保持生成旧格式的输出然后将其转换为新格式似乎很奇怪。例如,当DVD出现时,人们开始在其上放电影(明智的选择)而不是制作VHS,然后通过某种任意方法将VHS移植到DVD(我试图劝阻您的非常特殊的选择)。

答案 1 :(得分:0)

-如果我们要做的只是重新排序-读取XML并在排列有滑动元素的情况下重写XML,这是否可行?

对于“删除”情况,进一步删除XML中的幻灯片元素是否可行? (我意识到这可能会在文件中留下诸如图像之类的悬空对象。)

提取XML并将其重写为文件副本的过程可能不太麻烦。