2013-08-27 2 views
3

현재 Scriptom을 사용하여 Groovy에서 일부 PowerPoint 2010 기능을 자동화하고 있습니다.이 문제는 모든 PowerPoint 자동화 접근법 (예 : 사용중인 특정 환경보다 "VBA 매크로"문제가 더 많습니까?)에 일반적 일 수 있습니다.어떻게하면 PowerPoint 2010에서 소스 서식을 사용하여 프로그래밍 방식으로 복사하고 붙여 넣을 수 있습니까?

(Scriptom은 Groovy의 ActiveX 또는 COM Windows 구성 요소를 사용할 수 있습니다.) Jacob 라이브러리 (Java COM Bridge)를 사용하는 후드 아래에는 기본 코드가 VBA 매크로에서 사용하는 것과 유사합니다. 또는 기타 Microsoft 자동화 구성 요소를 기반으로하며 PowerPoint 2010 Object 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 초 이상 걸립니다. 따라서 첫 번째 5 장의 슬라이드를 복사하는 데 1 초가 걸릴 수 있지만 총 20 장의 슬라이드에는 총 100 초가 걸리며 모든 후자 슬라이드는 한 줄만 더 길어질 수 있습니다. 나머지 코드 경주는!

속도 저하가 선형이 아니며 20 슬라이드 이상으로 악화됩니다. 최종 슬라이드의 내용과 관련이 없지만 SlideMaster의 "디자인/테마"수가 늘어 나면 "sourceSlide.Design"을 복사하는 데 기하 급수적으로 속도가 느려지는 것 같습니다. 각 슬라이드마다 다른 "디자인"개체를 사용하는 것이 약간의 낭비임을 알았지 만 초기 소스 프레젠테이션을 소유하고 있지 않으며 종종 각 슬라이드의 디자인 사이에 약간의 차이가있는 것처럼 나에게 이런 모습을 보입니다. . "destinationSlide.Design"줄을 제거하면 소요 시간이 100 초에서 약 1 초로 줄어 듭니다!

는 방법 2 :이 문제를 방지하기 위해, 나는 파워 포인트 2010을 사용하고있어 주어, 내가 대신 다음 코드를 사용하려고 :

sourceSlide.Copy() 
def destinationPresentation = objPpt.Presentations.Open(destinationFilename) 
destinationPresentation.CommandBars.ExecuteMso("PasteSourceFormatting") 

내가이 파워 포인트에 직접 액세스를 제공한다고 생각 2010 "소스 서식으로 붙여 넣기"기능. 그러나 ExecuteMso("PasteSourceFormatting") 줄의 " null pointer exception"으로 실패합니다.

내가 뭘 잘못하고 있니? 방법 1에서 느린 회선 속도를 높이는 방법이 있습니까? 왜 방법 2는 전혀 작동하지 않습니까? "destinationPresentation.CommandBars"가 null이 아니지만 "ExecuteMso"라인이 널 포인터 예외를 발생시키는 것처럼 보입니다.

다양한 디자인/테마가 있더라도 20-100 슬라이드의 적절한 시간 프레임에서 효율적으로 "복사하여 붙여 넣기"할 수있는 다른 제안이 있습니까?

미리 감사드립니다.

답변

1

방법 2 문제는 내가 사용하고 있습니다 :

destinationPresentation.CommandBars.ExecuteMso("PasteSourceFormatting") 

이 있었어야 반면 :

destinationPresentation.Application.CommandBars.ExecuteMso("PasteSourceFormatting") 

이 코드를 사용하여, 나는 더 이상 null pointer exception를 얻을 수 없습니다.

향후 비슷한 오류가 발생하면 누구나 도움을 드리겠습니다.

이 방법의 성능 (방법 2)은 수동 "복사 및 붙여 넣기 형식"방법 (방법 1)보다 현저히 좋지 않습니다. 두 경우 모두 "원본 서식으로 붙여 넣기"기능의 성능이 일반 "붙여 넣기"보다 몇 배나 느려지고 약 20 개의 슬라이드 (각 자체 디자인 서식 파일이있는)를 붙여 넣는 데 약 2 분이 걸립니다. "대상 서식 지정"을 사용하거나 개별 디자인 템플릿이있는 각 슬라이드가없는 경우이 시간이 1 초 미만으로 줄어 듭니다.

이것은 PowerPoint 2010 성능 문제 일 수 있으므로 원래 쿼리의 성능 측면에 더 나은 솔루션을 제공하는 정보가있는 사람이 없으면이 대답을 수락합니다.

0

하지가 도움이되지만 아파치 POI와 함께 이런 종류의 작업을 수행 할 수 있는지 :

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

감사합니다. Tim. 나는 그것을 들여다 볼 것이다. 아파치 POI를 사용하면 좋겠지 만, 현재 importContent는 차트, 이미지 (?)와 같은 모든 형식 (예 : "소스 형식") 또는 슬라이드의 다른 부분을 가져올 수 없다는 것을 이해했습니다. 또는 도면. 내가 틀렸거나 당신이 이것을 성공적으로 해낸다면, 나는 알고 싶어합니다. 나는 그것이 좋은 해결책이 될 것이기 때문에 나는이 대답을 확실히 받아 들일 것이다. – Glennn

+0

Tim - 코드를 시험해 보았습니다. 포맷을 가져 오지 않았습니다. 마스터 슬라이드를 가져 와서 형식을 가져 오는 방법이있을 수 있습니다.이 효과를 보았지만 아직 작동하지는 못했습니다. 만약 당신이 그것을 (또는 아이디어가) 나는 듣고 싶어요. – Glennn

+0

@Glennn 네 말이 맞아, 나도 그 중 하나를 작동시키지 못한다 ... 도형을 복사한다 (당신은 쉽게 생각할 것이다) 나는 그것이 작동하도록 올바른 코드를 찾을 수 없다 ... 나는 잘하면 POI를 더 잘 아는 사람이 시작했으면 좋겠다. (아니면 내가 지워야한다고 생각하니?) –