Groovy 如何在PowerPoint 2010中以编程方式复制和粘贴源格式?

Groovy 如何在PowerPoint 2010中以编程方式复制和粘贴源格式?,groovy,powerpoint,activex,powerpoint-2010,scriptom,Groovy,Powerpoint,Activex,Powerpoint 2010,Scriptom,我目前正在使用Scriptom在Groovy中自动化一些PowerPoint 2010功能,尽管这个问题可能是任何PowerPoint自动化方法的常见问题(即与我使用的特定环境相比,更像是“VBA宏”问题?) (Scriptom允许您使用Groovy中的ActiveX或COM Windows组件。我相信,它使用的是Jacob库(Java COM桥)。底层代码类似于我在VBA宏或其他Microsoft自动化组件中使用的代码,并且基于PowerPoint 2010对象API。) 我当前的代码运行良好

我目前正在使用Scriptom在Groovy中自动化一些PowerPoint 2010功能,尽管这个问题可能是任何PowerPoint自动化方法的常见问题(即与我使用的特定环境相比,更像是“VBA宏”问题?)

(Scriptom允许您使用Groovy中的ActiveX或COM Windows组件。我相信,它使用的是Jacob库(Java COM桥)。底层代码类似于我在VBA宏或其他Microsoft自动化组件中使用的代码,并且基于PowerPoint 2010对象API。)

我当前的代码运行良好,可以以可视的方式打开PowerPoint,并在其上执行一系列功能—除了一个组件,我可以将幻灯片从一个文档“复制并粘贴”到另一个文档,“保留源格式”

我尝试了两次尝试来执行这个复制和粘贴步骤,都导致了不同的问题。我想知道是否有人想过解决这些问题中的一个(或两个?):

方法1:我使用了其他各种方法建议的基本“复制”和“粘贴”方法,即:

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...
也就是说,我手动复制所有格式以保留幻灯片格式。这是PowerPoint 2010之前使用的方法。事实上,我已经做到了这一点,但是,复制我在“源”幻灯片包中循环的每张幻灯片的格式,并执行上面的复制/粘贴代码。在这个循环中,以下行(单独)是有问题的:

destinationSlide.Design=sourceSlide.Design


当目标SlidePack在SlideMaster中有大量“设计”时,该行的运行速度非常慢。我正在复制一个包含19张幻灯片的源幻灯片包,每个幻灯片都有不同的SlideMaster设计主题(我就是这么想的)。这一行代码大约需要0.01秒来复制第一张幻灯片,但到循环中的最后一张幻灯片时,这一行代码每次运行都需要20秒以上。因此,复制前五张幻灯片可能需要时间,但不确定是否有帮助,但您可以使用ApachePOI执行这类操作:

@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 )
        }
    }
}

方法2的问题在于我使用的是:

destinationPresentation.CommandBars.ExecuteMso("PasteSourceFormatting")
鉴于本应:

destinationPresentation.Application.CommandBars.ExecuteMso("PasteSourceFormatting")
使用此代码,我不再获得
空指针异常

我将此作为一个答案提交,以帮助将来犯类似错误的任何人

尽管如此,我仍然发现这种方法(方法2)的性能并没有明显优于手动“复制和粘贴格式”方法(方法1)。在这两种情况下,“粘贴源格式”功能的性能都比普通的“粘贴”慢很多倍,并且粘贴大约20张幻灯片(每张幻灯片都有自己的设计模板)需要大约2分钟。如果我使用“目标格式”,或者没有每张幻灯片都有单独的设计模板,这会减少到不到一秒钟


但是,这可能只是PowerPoint 2010性能的一个问题,因此我会接受这个答案,除非有人提供更多信息,为原始查询的性能方面提供更好的解决方案。

谢谢Tim。我会调查的。使用ApachePOI会很好,但我的理解是,目前importContent无法导入所有格式(即“源格式”)或者幻灯片的其他部分,例如图表、图像(?)或图形。如果我错了,或者你成功地做到了,我很想知道。如果我能让它工作,我肯定会接受这个答案,因为这将是一个伟大的解决方案!Tim-只是尝试了你的代码,事实上,这并没有带来格式。可能有一种方法可以通过导入主幻灯片来获取格式-我看到了这种效果,但还没有让它发挥作用。如果你做过(或有想法),我很想听。@Glennn你是对的,我也不能让它工作。。。即使复制形状(你会认为这很容易),我也找不到正确的代码来让它工作。。。我将把这个放在这里,希望这可能是一个更好地了解POI的人的开始(或者你认为我应该删除它吗?)蒂姆-谢谢。请务必在此处留下评论/回复。这是一个有用的起点。我尝试了复制主控和布局的所有建议,但似乎都不起作用。如果我有进展,我会在这里更新。希望其他人可能有不同的想法!
destinationPresentation.Application.CommandBars.ExecuteMso("PasteSourceFormatting")