2014-02-25 1 views
0

최종 사용자를 위해 PowerPoint 슬라이드를 자르고 꿰매는 소프트웨어를 업데이트하고 있습니다. 슬라이드에는 차트가 포함되어 있습니다. 파일을받는 사용자로부터 원시 차트 데이터를 숨기는 방법을 찾아야합니다.MS Office Interop을 사용하여 PowerPoint 차트에서 데이터 숨기기

어쨌든 PowerPoint interop에서이 작업을 수행합니까? 나는 읽기 전용을 시도했지만 사용자는 여전히 데이터를 얻을 수 있습니다. 스티브의 코드의 원칙 내 사용을위한 맞춤형 하나를 만들었을 사용

+0

차트를 그룹화하지 않으면 데이터를 토스하고 PPT에서 표시하는 차트의 EMF/WMF 그림을 남깁니다. –

+0

C#으로이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 나의 현재 아이디어는 슬라이드를 이미지로 내 보낸 다음 어떻게 든 슬라이드로 다시 가져 오는 것입니다. – Callum

+0

C#을 사용하지 않아도되지만 VBA에서 번역하는 것이 상대적으로 쉽고 아래/위의 새로운 대답에 나와 있습니다. –

답변

2

확인. 여기 내 질문에 대한 나의 최종 대답이있다. 차트가 편집되지 않도록 유지하면서 슬라이드를 완벽하게 복제 할 수있는 완성 된 코드를 보여줍니다. 즉, .png로 바꾸면됩니다.

이렇게하면 자리 표시 자의 이전 문제가 해결됩니다.

바라건대이 코드 중 일부는 제가 인터넷처럼 누군가를 트래킹하는 데 도움이되기를 바랍니다.

//Open the slides presentation 
var pres = _application.Presentations.Open2007(item.PresentationPath, 
    Microsoft.Office.Core.MsoTriState.msoFalse, 
    Microsoft.Office.Core.MsoTriState.msoFalse, 
    Microsoft.Office.Core.MsoTriState.msoFalse, 
    Microsoft.Office.Core.MsoTriState.msoFalse); 

//For slide ranges 
foreach (var i in range) 
{ 
    //Get the old slide 
    var oldSlide = pres.Slides[i]; 
    oldSlide.Copy(); 

    //Paste the slide into the new presentation 
    var newSlide = newPresentation.Slides.Paste(totalSlides + 1); 
    newSlide.Design = oldSlide.Design; 
    newSlide.ColorScheme = oldSlide.ColorScheme; 

    /* The shapes haven't retained their content because we are not in slide... 
    view because there is no window. */ 

    //Delete all the shapes that were just pasted in because of the slide paste. 
    for (int k = newSlide.Shapes.Count; k > 0; k--) 
    { 
     newSlide.Shapes[k].Delete(); 
    } 

    //Put in our shapes 
    //Loop forwards, because we arn't editing the list and forward is required to 
    //maintain the zorder we want on some slides. 
    for (int j = 1; j <= oldSlide.Shapes.Count; j++) 
    { 
     var oldShape = oldSlide.Shapes[j]; 
     oldShape.Copy(); 

     //Paste Put it where it should be on the page 
     /* This is a special case where the client have put textboxes in the 
     Powerpoint and rotated throwing off the position, so we need treat as rotated 
     shapes to make it right. */ 
     if (oldShape.HasTextFrame == MsoTriState.msoTrue && Math.Abs(oldShape.Rotation) > 0) 
     { 
      //Paste as a shape because it's a more complex object 
      //set ALL THE PROPERTIES just in case. 
      var newShape = newSlide.Shapes.PasteSpecial(PpPasteDataType.ppPasteShape); 
      newShape.Rotation = oldShape.Rotation; 
      newShape.Top = oldShape.Top; 
      newShape.Left = oldShape.Left; 
      newShape.TextFrame.Orientation = oldShape.TextFrame.Orientation; 
      newShape.TextFrame.WordWrap = oldShape.TextFrame.WordWrap; 
      newShape.TextFrame.VerticalAnchor = oldShape.TextFrame.VerticalAnchor; 
     } 
     else // Act normally 
     { 
      //Paste the old shape into the new slide as an image to ENSURE FORMATTING 
      var newShape = newSlide.Shapes.PasteSpecial(PpPasteDataType.ppPastePNG); 
      newShape.Top = oldShape.Top; 
      newShape.Left = oldShape.Left; 
     } 
    } 

    totalSlides += ((item.EndIndex - item.StartIndex) + 1); 

    pres.Close(); 
} 

새 프레젠테이션을 컴파일 한 후에는 모든 자리 표시자를 삭제해야합니다.

//Loop through all slides 
foreach (Slide exportSlide in newPresentation.Slides) 
{ 
    //Delete the placeholders 
    for (int i = exportSlide.Shapes.Placeholders.Count; i > 0; i--) 
    { 
     exportSlide.Shapes.Placeholders[i].Delete(); 
    } 
} 
0

VBA는 (원래의 데이터에 대한 연결을 제거하기 위해) 차트의 그룹을 해제 할 수

Sub UngroupAChart() 

    Dim oSh As Shape 
    Dim oNewSh As Shape 
    Dim oNewShapes As ShapeRange 
    Dim oSl As Slide 

    ' for demo purposes, use the currently selected 
    ' shape; up to tester to select a chart 
    Set oSh = ActiveWindow.Selection.ShapeRange(1) 

    ' Get a reference to the shape's parent slide 
    ' We'll need it later 
    Set oSl = oSh.Parent 

    ' put the shape on the clipboard 
    oSh.Copy 

    Set oNewSh = oSl.Shapes.PasteSpecial(ppPasteEnhancedMetafile)(1) 

    oNewSh.Ungroup 

    ' once you're done testing, delete the original chart 
    'oSh.Delete 

End Sub 
0

. 구성 요소 서비스로 PowerPoint와 상호 작용할 때 ActiveWindow 또는 기타 기능이 없습니다.

//Loop through all slides 
foreach (Slide exportSlide in newPresentation.Slides) 
{ 
    //Loop through all shapes 
    foreach (Shape shape in exportSlide.Shapes) 
    { 
     //If the shape is a chart 
     if (shape.HasChart == MsoTriState.msoTrue) 
     { 
      //Copy to clipboard 
      shape.Copy(); 

      //Paste as an image 
      var newShape = exportSlide.Shapes.PasteSpecial(PpPasteDataType.ppPastePNG); 

      //Move back to chart position 
      newShape.Left = shape.Left; 
      newShape.Top = shape.Top; 

      //Delete the original shape 
      shape.Delete(); 
     } 
    } 
} 

차트를 이미지로 교체하는 데는 전혀 문제가 없습니다. 유일한 문제는 이제 슬라이드가 차트가 포함 된 레이아웃으로 작성 되었기 때문에 Powerpoint에서 슬라이드를 열면 GUI에 "차트 삽입"상자가 표시된다는 것입니다. 나는 시도했다 :

exportSlide.Layout = PpSlideLayout.ppLayoutBlank; 

그러나 나의 클라이언트 사용자 정의 템플릿 때문에 이것은 비어 있지 않으므로 사용할 수 없다.

+0

당신은 PowerPoint의 특이성을 경험했습니다. 셰이프를 삭제하면 삭제되지만 자리 표시 자 (예 : 차트)에 포함 된 셰이프를 삭제하면 삭제해야하는 빈 자리 표시자가 생깁니다. 그런데 Shapes.Count에서부터 1까지 셰이프 컬렉션을 뒤로 이동하고 각 루프마다 a를 사용하지 않고 인덱스로 셰이프를 참조하려고합니다. 그렇지 않으면 모양 중 일부를 놓치게됩니다. –

관련 문제