我目前正在使用Scriptom自动化Groovy中的一些PowerPoint 2010函数--尽管这个问题在任何PowerPoint自动化方法中都是通用的(即更多的是一个"VBA宏“问题,而不是我正在使用的特定环境)。
(Scriptom允许您使用来自Groovy的ActiveX或COM Windows组件。在引擎盖下面,我相信它使用Jacob库(Java桥)。底层代码类似于我在VBA宏或其他Microsoft自动化组件中使用的代码,并且基于PowerPoint 2010对象API)。
我当前的代码运行良好,可以明显地打开PowerPoint,并在其上执行一系列功能--除了一个组件,其中我“复制和粘贴”幻灯片从一个文档到另一个文档,“保持源代码格式”。
我尝试了两个调度来完成这个复制和粘贴步骤,这两个步骤都导致了一个不同的问题。我想知道是否有人想要解决这两个问题(或者两者兼而有之?)这些问题中:
方法1: I使用其他各种方法建议的基本“复制”和“粘贴”方法,即:
sourceSlide.Copy()
destinationSlide = destinationPresentation.Slides.Paste(slideIndex+i-1)
destinationSlide.Design = sourceSlide.Design
destinationSlide.ColorScheme = sourceSlide.ColorScheme
destinationSlide.FollowMasterBackground = sourceSlide.FollowMasterBackground
... and so on copying formats...也就是说,我手动复制所有格式,以保持幻灯片格式.这是2010年PowerPoint之前使用的方法。实际上,我已经做到了这一点,但是,为了复制“源”幻灯片中的每一张幻灯片上的格式,然后执行上面的复制/粘贴代码。在这个循环中,下面一行(单独)是有问题的:
destinationSlide.Design = sourceSlide.Design
一旦目标SlidePack在SlideMaster中有了大量的“设计”,这一行就会运行得非常慢。我正在复制一个由19张幻灯片组成的源代码幻灯片包,每个幻灯片都有一个不同的SlideMaster设计主题(这就是我所看到的)。这一行代码大约需要0.01秒来复制第一个幻灯片,但是到了循环中的最后一个幻灯片时,这一行代码每次运行需要超过20秒。因此,复制前五张幻灯片可能需要小于1秒,但总共20张幻灯片总共需要100秒左右,而后一组幻灯片只运行这一行所需的时间越来越长。其余的代码都经过了!
慢速不是线性的,在20张幻灯片之后还会变得更糟。它与最终幻灯片上的内容无关,但似乎是,随着SlideMaster“设计/主题”的数量增加,复制"sourceSlide.Design“的速度呈指数增长。我意识到为每一张幻灯片设置一个不同的“设计”对象有点浪费,但我并不拥有最初的源代码演示文稿,而且通常他们会像这样来找我,每一张幻灯片的设计都有细微的差别。如果删除"destinationSlide.Design“行,所需时间将从100+秒减少到1秒左右!
方法2:为了避免这种情况,并且考虑到我使用的是PowerPoint 2010,我尝试使用以下代码:
sourceSlide.Copy()
def destinationPresentation = objPpt.Presentations.Open(destinationFilename)
destinationPresentation.CommandBars.ExecuteMso("PasteSourceFormatting")我认为这应该提供直接访问PowerPoint 2010“粘贴源格式”的功能。但是,这在null pointer exception行的“ExecuteMso("PasteSourceFormatting")”中失败。
我做错了什么?方法1中有什么方法可以加快慢线的速度吗?为什么方法2根本不起作用?看起来"destinationPresentation.CommandBars“不是null,但是"ExecuteMso”行抛出一个空指针异常。
是否有任何其他有效的“复制和粘贴”幻灯片的建议,应该在合理的时间框架内为20-100张幻灯片工作,即使有多种不同的设计/主题?
谢谢,提前给我提点主意。
发布于 2013-08-29 07:50:53
方法2的问题是我使用了:
destinationPresentation.CommandBars.ExecuteMso("PasteSourceFormatting")然而,这本应是:
destinationPresentation.Application.CommandBars.ExecuteMso("PasteSourceFormatting")使用此代码,我将不再获得null pointer exception。
我提交这个答案是为了帮助将来犯类似错误的人。
尽管如此,我仍然发现这种方法(方法2)的性能并不比手工的“复制和粘贴格式”方法(方法1)好得多。在这两种情况下,使用“带有源格式的粘贴”功能的性能要比普通的“粘贴”慢很多倍--大约需要2分钟才能完成大约20张幻灯片的粘贴(每个幻灯片都有自己的设计模板)。如果我使用“目标格式”,或者不是每个幻灯片都有一个单独的设计模板,这将减少到不到1秒。
然而,这可能只是PowerPoint 2010性能的一个问题,所以我将接受这个答案,除非有人有更多的信息可以为原始查询的性能方面提供更好的解决方案。
发布于 2013-08-27 14:10:07
不确定它是否有用,但您可以使用Apache来完成这类工作:
@Grab( 'org.apache.poi:poi-ooxml:3.10-beta1' )
import org.apache.poi.xslf.usermodel.XMLSlideShow
new File( '/tmp/Presentation1.pptx' ).withInputStream { p1 ->
new File( '/tmp/Presentation2.pptx' ).withInputStream { p2 ->
// Load our 2 presentations
inpptx = new XMLSlideShow( p1 )
outpptx = new XMLSlideShow( p2 )
// Add slide 1 from inpptx to the end of outpptx
outpptx.createSlide().importContent( inpptx.slides[ 0 ] )
// Save it out again to a 3rd presentation
new File( '/tmp/Presentation3.pptx' ).withOutputStream { out ->
outpptx.write( out )
}
}
}https://stackoverflow.com/questions/18457769
复制相似问题