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

问题描述 投票:0回答:4

我们通常使用powerpoint来促进我们的实验。我们在 powerpoint 中使用“部分”将每个实验任务的幻灯片组放在一起。移动各个部分以平衡实验的任务顺序需要大量工作!

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

感谢您的帮助!

python powerpoint python-pptx
4个回答
2
投票

如文档中所解释的特别是本节):

目前,添加幻灯片是对幻灯片集合的唯一操作。在撰写本文时,待办事项正在删除幻灯片并将幻灯片移动到列表中的其他位置。在一般情况下,将幻灯片从一个演示文稿复制到另一个演示文稿是相当困难的,因此在烧掉更多积压的工作之前,这可能不会实现。

或者换句话说,目前

不可能可以按照您的建议移动幻灯片。我使用过的最好的解决方法是生成一个新的演示文稿并将幻灯片重新排序(因为您可以添加幻灯片)。

例如说我的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(这是我试图劝阻您的非常奇特的选择)。


2
投票
我找到了一个很好的解决方案

这里

class PresentationBuilder(object): presentation = Presentation("presentation.pptx") def move_slide(self, old_index, new_index): xml_slides = self.presentation.slides._sldIdLst slides = list(xml_slides) xml_slides.remove(slides[old_index]) xml_slides.insert(new_index, slides[old_index])
例如,如果您想将当前位于索引 5 的位置的幻灯片移动到索引 1 的位置,您可以使用:

prs = PresentationBuilder() prs.move_slide(5, 1)
    

0
投票
如果我们所做的只是重新排序,那么读取 XML 并使用排列好的幻灯片元素重写它是否可行?

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

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


0
投票
@somberlain 解决方案对我来说效果很好。多谢 ! 对我来说唯一的改变是直接使用

presentation.slides._sldIdLst

 而不是
分配新变量
xml_slides
,因为列表的进一步修改仅适用于新变量而不是表示对象本身

slide_to_move = presentation.slides._sldIdLst[old_index] presentation.slides._sldIdLst.remove(slide_to_move) presentation.slides._sldIdLst.insert(new_index, slide_to_move)
    
© www.soinside.com 2019 - 2024. All rights reserved.