2017-10-03 6 views
0

PowerPointドキュメントの1つのスライドをクローンし、同じドキュメントにOpenXMLで挿入したいと思います。イメージで新しいPowerPointスライドを複製できませんでした

public static void AddNewSlide(PresentationPart parent, Slide _slideTemplate, string newId) 
{ 
    var newSlidePart = parent.AddNewPart<SlidePart>(newId); 
    newSlidePart.FeedData(_slideTemplate.SlidePart.GetStream(FileMode.Open)); 
    newSlidePart.AddPart(_slideTemplate.SlidePart.SlideLayoutPart, _slideTemplate.SlidePart.GetIdOfPart(_slideTemplate.SlidePart.SlideLayoutPart)); 
    newSlidePart.Slide.Save(); 

    DocumentFormat.OpenXml.Presentation.SlideIdList slideIdList = parent.Presentation.SlideIdList; 
    uint maxSlideId = 1; 

    foreach (DocumentFormat.OpenXml.Presentation.SlideId slideId in slideIdList.ChildElements) 
    { 
     if (slideId.Id > maxSlideId) maxSlideId = slideId.Id; 
    } 

    DocumentFormat.OpenXml.Presentation.SlideId newSlideId = new DocumentFormat.OpenXml.Presentation.SlideId { Id = ++maxSlideId, RelationshipId = parent.GetIdOfPart(newSlidePart) }; 
    slideIdList.Append(newSlideId); 
} 

ORIGスライドはテキストだけが含まれている場合は、それがうまく動作しますが、ORIGスライドがあまりにも画像をcontansとき、結果PowerPointのドキュメントが破損BWます:このために、私は次の関数を使用しています。新しいスライドの画像は表示されません。「この画像は現在表示できません」というメッセージが表示されます。

スライドを画像で複製する際にお役立てください。 ありがとうございます。

答えて

1

このコードは、データとレイアウトだけをコピーしているため、スライドにあるイメージではないため、破損したスライドを生成しています。例えばのための

newSlidePart.FeedData(_slideTemplate.SlidePart.GetStream(FileMode.Open)); 
newSlidePart.AddPart(_slideTemplate.SlidePart.SlideLayoutPart, _slideTemplate.SlidePart.GetIdOfPart(_slideTemplate.SlidePart.SlideLayoutPart)); 

:上記の2行は、新しいスライドが画像を参照しているが、その画像自体が新しいスライドに欠けていると言うだろう。したがって、この問題を解決するには、古いスライドの画像を新しいスライドにコピーするコードを記述する必要があります。

//add all the image part from the source slide to the new one 

      List<ImagePart> imageParts = new List<ImagePart>(); 
      sourceSlidePart.GetPartsOfType<ImagePart>(imageParts); 

      foreach (ImagePart img in imageParts) 
      { 
       var relID = sourceSlidePart.GetIdOfPart(img); // get relationship ID 

       ImagePart newImagePart = newSlidePart.AddImagePart(img.ContentType, relID); 

       newImagePart.FeedData(img.GetStream(FileMode.Open)); 
      } 
+0

これは完全に機能しました。 –

関連する問題