【问题标题】:How can I combine two presentations (pptx) into one master presentation?如何将两个演示文稿 (pptx) 合并为一个主演示文稿?
【发布时间】:2017-09-13 19:27:55
【问题描述】:

我是创建 PPTX 演示文稿以呈现给客户的项目团队的一员。创建所有文件后,我们需要为每个演示文稿添加额外的幻灯片。每个演示文稿中的所有新幻灯片都是相同的。

以编程方式完成此任务的最佳方法是什么?

我不想使用 VBA,因为(据我所知)我必须打开每个演示文稿才能运行脚本。

我尝试过使用 python-pptx 库。但文档指出:

“在一般情况下,将幻灯片从一个演示文稿复制到另一个演示文稿非常困难,因此可能要等到更多的积压工作被烧掉后才会出现。”

我希望像下面这样的东西会起作用 -

from pptx import Presentation

main = Presentation('Universal.pptx')
abc = Presentation('Test1.pptx')

main_slides = main.slides.get(1)
abc_slides = abc.slides.get(1)

full = main.slides.add_slide(abc_slides[1])

full.save('Full.pptx')

有没有人做过类似的事情?

【问题讨论】:

  • “我不想使用 VBA,因为(据我所知)我必须打开每个演示文稿才能运行脚本。”每个演示文稿都需要在 PPT 中打开才能使 VBA 发挥作用,但一个演示文稿或加载项中的 VBA 可以自动打开列表或文件夹中的每个演示文稿并执行所需的操作,然后保存并在继续下一个演示文稿之前将其关闭。
  • 这是一个非常有趣的想法。我得看看那个。你有什么办法可以为我指明一个没有经验的友好文档的好来源?再次感谢!
  • 我在此处维护的 PPT FAQ 站点中有一个关于 PowerPoint 编程的部分:pptfaq.com/index.html#name_PROGRAMMING_POWERPOINT 很多示例和指向其他站点的链接。此条目可能对您的项目有用:pptfaq.com/…
  • 迟到总比不到好,非常感谢您的指导。我们最终聘请了一个团队来手动进行工作,但我利用这些资源学到了很多东西,并将它们放在我的工具带中,以备将来项目可能对时间不那么敏感时使用。再次感谢。

标签: python vba powerpoint python-pptx


【解决方案1】:

我能够通过使用 python 和 win32com.client 来实现这一点。但是,这不会安静地工作。我的意思是它会启动 Microsoft PowerPoint 并一个一个地打开输入文件,然后从输入文件中复制所有幻灯片并循环粘贴到输出文件中。

import win32com.client
from os import walk

def mergePresentations(inputFileNames, outputFileName):

    Application = win32com.client.Dispatch("PowerPoint.Application")
    outputPresentation = Application.Presentations.Add() 
    outputPresentation.SaveAs(outputFileName)

    for file in inputFileNames:    
        currentPresentation = Application.Presentations.Open(file)
        currentPresentation.Slides.Range(range(1, currentPresentation.Slides.Count+1)).copy()
        Application.Presentations(outputFileName).Windows(1).Activate()    
        outputPresentation.Application.CommandBars.ExecuteMso("PasteSourceFormatting")    
        currentPresentation.Close()

    outputPresentation.save()
    outputPresentation.close()
    Application.Quit()

# Example; let's say you have a folder of presentations that need to be merged 
#           to new file named "allSildesMerged.pptx" in the same folder

path,_,files = next(walk('C:\\Users\\..\\..\\myFolder'))
outputFileName = path + '\\' + 'allSildesMerged.pptx'

inputFiles = []
for file in files:
    inputFiles.append(path + '\\' + file)

mergePresentations(inputFiles, outputFileName)

【讨论】:

  • 除了上面的代码之外,肯定还有更多的东西。执行时,我收到 pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft PowerPoint', 'Presentation.SaveAs : An error occurred while PowerPoint is save the file.', '', 0 , -2147467259), None) 在 for SaveAs 部分,所以事情还没有真正开始。
  • 我不确定您为什么会收到该错误。您确定您有保存权限吗?
  • 当然,权限是其中的一部分,因为我需要在管理终端窗口中运行脚本。此外,更改为活动窗口在代码中不起作用,因此我需要更改它。我在下面的完整功能所以我改变了...... Application.Presentations(outputFileName).Windows(1).Activate() -> Application.Presentations(outputFileName).Windows(1).Activate()
  • @MikkoJaakkola,你能再告诉我你改变了什么吗?因为两条线看起来一样。
  • 它们看起来和它们一样 :-) 我用 outputPresentation.Windows(1).Activate() 交换了 Application.Presentations(outputFileName).Windows(1).Activate()。不知何故,它没有找到带有文件名的正确演示文稿,这很奇怪,因为它使用了之前用于保存演示文稿的文件名。
【解决方案2】:

GroupDocs.Merger REST API 也是将多个 PowerPoint 演示文稿合并到一个文档中的另一个选项。它是付费 API,但每月提供 150 次免费 API 调用。

目前,它支持与云提供商合作:Amazon S3、DropBox、Google Drive Storage、Google Cloud Storage、Windows Azure Storage、FTP Storage 以及 GroupDocs 内部云存储。但是,在不久的将来,它计划支持从请求正文(流)合并文件。

P.S:我是 GroupDocs 的开发布道者。

# For complete examples and data files, please go to https://github.com/groupdocs-merger-cloud/groupdocs-merger-cloud-python-samples
# Get Client ID and Client Secret from https://dashboard.groupdocs.cloud
client_id = "XXXX-XXXX-XXXX-XXXX" 
client_secret = "XXXXXXXXXXXXXXXX"
  
documentApi = groupdocs_merger_cloud.DocumentApi.from_keys(client_id, client_secret)
 
item1 = groupdocs_merger_cloud.JoinItem()
item1.file_info = groupdocs_merger_cloud.FileInfo("four-slides.pptx")
item2 = groupdocs_merger_cloud.JoinItem()
item2.file_info = groupdocs_merger_cloud.FileInfo("one-slide.docx")
 
options = groupdocs_merger_cloud.JoinOptions()
options.join_items = [item1, item2]
options.output_path = "Output/joined.pptx"
 
result = documentApi.join(groupdocs_merger_cloud.JoinRequest(options))

【讨论】:

    【解决方案3】:

    一个名为“powerpoint join”的免费工具可以帮助您。

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2016-01-13
      相关资源
      最近更新 更多