首页 > 解决方案 > 使用 python-pptx 自动重新排列 powerpoint 幻灯片

问题描述

我们通常使用 powerpoint 来促进我们的实验。我们在 powerpoint 中使用“部分”来为每个实验任务保留一组幻灯片。移动部分以平衡实验的任务顺序是一项艰巨的工作!

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

谢谢你的帮助!

标签: pythonpowerpointpython-pptx

解决方案


文档中所述特别是本节):

目前,添加幻灯片是对幻灯片集合的唯一操作。在撰写本文时的积压工作是删除一张幻灯片并将一张幻灯片移动到列表中的不同位置。在一般情况下,将幻灯片从一个演示文稿复制到另一个演示文稿非常困难,因此在更多的积压工作被烧掉之前可能不会出现。

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

例如说我在 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(我试图劝阻你的非常特殊的选择)。


推荐阅读