英文:
Saving a presentation through PowerPoint and Win32COM takes too long
问题
我想将多个 PowerPoint 文件中的幻灯片合并到单个输出文件中。
我有一个包含多个 PowerPoint 文件的文件夹,每个文件只包含一个幻灯片。我的现有代码创建一个新演示文稿,将输入文件中的幻灯片复制并粘贴到输出文件中。
我首先尝试了使用 python-pptx,但是关于这个主题的几篇 StackOverflow 帖子表明这几乎不可能,特别是因为我需要保持布局、图像、字体等的完整性。
在另一个 SO 帖子的帮助下(很遗憾我不知道来源),我编写了解决这个问题的函数:
def __mergePresentations(inputFileNames, outputFileName):
Application = win32com.client.Dispatch("PowerPoint.Application")
outputPresentation = Application.Presentations.Add()
outputPresentation.SaveAs(outputFileName) # Save presentation to allow better modification
print("Filling presentation...")
for file in inputFileNames:
print(f"- Copying {str(file)}")
currentPresentation = Application.Presentations.Open(file)
currentPresentation.Slides.Range(range(1, 2)).copy() # Only copy the first slide
Application.Presentations(outputFileName).Windows(1).Activate()
outputPresentation.Application.CommandBars.ExecuteMso("PasteSourceFormatting")
currentPresentation.Close()
print("Saving presentation...")
outputPresentation.Save()
print("Closing presentation...")
outputPresentation.Close()
Application.Quit()
print("Presentation has been successfully saved.")
return
问题:
这段代码可以运行,但出于某种原因,该程序有时需要超过 30 秒才能保存/退出。我知道 Win32com 可能会很慢,但这使得该程序在指定的环境中几乎无法使用。
我正在使用 Office 365 上的 PowerPoint,程序在 Python 3.9 上运行。代码立即打印出“演示文稿已成功保存”,但需要很长时间才能返回。
我是否忘记了正确保存文件的任何参数?这可能与我的环境有关吗?
谢谢!
英文:
I want to merge slides from multiple PowerPoint files into a single output file.
I have a folder filled with PowerPoint files that each only contain one slide. My current code creates a new presentation, copies the slides from the input files and pastes them into the output file.
I first tried this with python-pptx, but the few StackOverflow posts on this topic suggest that this is not or pretty much impossible, especially because I need to keep the layout, images, fonts, ... intact.
With some help from another SO post (I unfortunately do not know the source), I wrote a function that solves this problem:
def __mergePresentations(inputFileNames, outputFileName):
Application = win32com.client.Dispatch("PowerPoint.Application")
outputPresentation = Application.Presentations.Add()
outputPresentation.SaveAs(outputFileName) # Save presentation to allow better modification
print("Filling presentation...")
for file in inputFileNames:
print(f"- Copying {str(file)}")
currentPresentation = Application.Presentations.Open(file)
currentPresentation.Slides.Range(range(1, 2)).copy() # Only copy the first slide
Application.Presentations(outputFileName).Windows(1).Activate()
outputPresentation.Application.CommandBars.ExecuteMso("PasteSourceFormatting")
currentPresentation.Close()
print("Saving presentation...")
outputPresentation.Save()
print("Closing presentation...")
outputPresentation.Close()
Application.Quit()
print("Presentation has been successfully saved.")
return
Problem:
This code works, but for some reason, the program sometimes takes more than 30 seconds to save/quit. I know that Win32com can be pretty slow, but this makes the program almost unusable in its designated environment.
I am using PowerPoint on Office 365 and the program runs on Python 3.9. The code prints "Presentation has been successfully saved" instantly, but takes forever to return.
Did I forget any arguments to save the file properly? Can this be related to my environment?
Thanks!
答案1
得分: 0
对于其他遇到此问题的人:跳过 Application.Quit()
,而是通过调用 os.system('taskkill /F /IM POWERPNT.EXE')
来退出。
这会立即发生,并且在功能上与 Application.Quit()
相同(据我测试所示)。
英文:
For anyone else having this issue: Skip Application.Quit()
and rather quit by calling os.system('taskkill /F /IM POWERPNT.EXE')
.
This happens immediately and has the same functionality as Application.Quit()
(as far as I could tell from testing).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论