簡體   English   中英

使用 python-pptx 自動重新排列 powerpoint 幻燈片

[英]Rearrange powerpoint slides automatically using python-pptx

我們通常使用 powerpoint 來促進我們的實驗。 我們在 powerpoint 中使用“部分”將每個實驗任務的幻燈片組放在一起。 移動部分以平衡實驗的任務順序需要大量工作!

我認為我們可以在 CSV 中預定義一個平衡順序(使用代表部分順序的一串數字),可以從 python 中讀取。然后使用 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(我試圖勸阻您不要使用這種非常奇特的選擇)。

如果我們所做的只是重新排序,讀取 XML 並使用排列的幻燈片元素重寫它是否可行?

此外 - 對於“刪除”情況 - 簡單地刪除 XML 中的幻燈片元素是否可行? (我意識到這可能會在文件中留下懸空對象,例如圖像。)

提取 XML 並將其重寫為文件副本的過程可能並不太繁重。

我在這里找到了一個很好的解決方案:

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 的 position 中的幻燈片移動到索引 1 的 position,您可以使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM