python - 使用 python-pptx 自动重新排列 powerpoint 幻灯片
问题描述
我们通常使用 powerpoint 来促进我们的实验。我们在 powerpoint 中使用“部分”来为每个实验任务保留一组幻灯片。移动部分以平衡实验的任务顺序是一项艰巨的工作!
我认为我们可以在可以从 python 读取的 CSV 中预定义一个平衡顺序(使用代表部分顺序的数字字符串)。然后使用 python-pptx 移动部分并为每个订单保存文件。我遇到的问题是了解如何从 python-pptx 中读取部分。如果有人有比 python 更好的解决方案,请告诉我。
谢谢你的帮助!
解决方案
目前,添加幻灯片是对幻灯片集合的唯一操作。在撰写本文时的积压工作是删除一张幻灯片并将一张幻灯片移动到列表中的不同位置。在一般情况下,将幻灯片从一个演示文稿复制到另一个演示文稿非常困难,因此在更多的积压工作被烧掉之前可能不会出现。
或者换句话说,目前无法按照您的建议移动幻灯片。我使用过的最好的解决方法是生成一个新的演示文稿并将幻灯片重新排序到其中(因为您可以添加幻灯片)。
例如说我在 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(我试图劝阻你的非常特殊的选择)。
推荐阅读
- c - 如何读取块设备直到最后一个字节
- sql - 如何在 PostgreSQL 函数中运行许多与插入相关的数据?
- php - 我可以加入两个数组 - PHP
- html - CSS:选择具有特定类的下一个元素
- ios - Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试
- ios - 未调用 iOS 回调的 FCM 推送
- c# - 如何在 c# windows 窗体中使用计时器仅在按下按钮时才上下移动电梯?
- clojurescript - 带有 cljsjs/react-day-picker 的 Clojurescript 日期时间选择器
- bash - 检查特定名称服务器上是否存在 dns-zone
- angular - 库模块中的 Angular APP_INITIALIZER 生成元数据编译时错误:不支持 Lambda