2015-05-12 3 views
1

У меня есть шаблон powerpoint с расширением .potx, мне нужно создать копию файла шаблона, но у созданного файла нет любой контент, присутствующий в нем, это пустая презентация, ниже приведена функция, которую я использую для создания файла назначения с использованием файла шаблона.создать копию презентации шаблона «.potx» в новый «.pptx» с помощью openXML

/// <summary> 
    /// Creates a copy of the source template file 
    /// </summary> 
    /// <param name="sourceFile">sourcce file which has to be copied</param> 
    /// <param name="destinationFile">destination file where the new file has to be placed.</param> 
     public static void CreateFileFromTemplate(this string sourceFile, string destinationFile) 
    { 
     try 
     { 
      //File.Copy(sourceFile, destinationFile, true); 
      if (System.IO.Path.GetExtension(sourceFile) == ".potx") 
      { 
       if (System.IO.Path.GetExtension(destinationFile) == ".potx") 
       { 
        PresentationDocument destinationDoc = PresentationDocument.Create(destinationFile, PresentationDocumentType.Presentation); 
        PresentationPart presentationPart = destinationDoc.AddPresentationPart(); 
        presentationPart.Presentation = new Presentation(); 
        presentationPart.Presentation.Save(); 
        destinationDoc.Close(); 
        //Package destinationPackage = Package.Open(destinationFile, FileMode.Open, FileAccess.ReadWrite); 
        using (destinationDoc = PresentationDocument.Open(destinationFile, true)) 
        { 
         Package templatePackage = Package.Open(sourceFile, FileMode.Open); 
         using (PresentationDocument templateDocument = PresentationDocument.Open(templatePackage)) 
         { 
          PresentationPart sourcePresPart = templateDocument.PresentationPart; 
          PresentationPart destinationPresrPart = destinationDoc.PresentationPart; 
          //var templateSlideCount = templateDocument.CountSlides(); 
          //for (int slides = 1; slides <= templateSlideCount; slides++) 
          //{ 

          //} 
          SlidePart sourceSlidePart; 
          SlidePart destinationSlidePart; 
          foreach (SlideId slideId in sourcePresPart.Presentation.SlideIdList) 
          { 
           //int i=0; 

           sourceSlidePart = (SlidePart)sourcePresPart.GetPartById(slideId.RelationshipId); 
           destinationSlidePart = sourceSlidePart.Clone(); 
           SlideIdList slideIdList = destinationPresrPart.Presentation.SlideIdList; 

           destinationPresrPart.AddPart(destinationSlidePart); 
           // Save the modified presentation. 
           destinationPresrPart.Presentation.Save(); 
          } 
         } 
        } 
       } 
       else 
       { 
        throw new FileFormatException("Invalid destination file format, Valid file should have .pptx as extension"); 
       } 
      } 
      else 
      { 
       throw new FileFormatException("Invalid file format, Valid file should have .potx as extension"); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 

метод расширение используется для клонирования слайда

/// <summary> 
    /// Clones the specified slide. 
    /// </summary> 
    /// <param name="sourceSlide">The slide to clone.</param> 
    /// <returns>Cloned slide.</returns> 
    public static SlidePart Clone(this SlidePart sourceSlide) 
    { 
     // find the presentationPart: makes the API more fluent 
     var presentationPart = sourceSlide.GetParentParts() 
      .OfType<PresentationPart>() 
      .Single(); 

     // clone slide contents 
     Slide currentSlide = (Slide)sourceSlide.Slide.CloneNode(true); 
     var slidePartClone = presentationPart.AddNewPart<SlidePart>(); 

     currentSlide.Save(slidePartClone); 

     // copy layout part 
     slidePartClone.AddPart(sourceSlide.SlideLayoutPart); 

     //copy all embedded elements 
     foreach (ChartPart part in sourceSlide.ChartParts) 
     { 
      ChartPart newpart = slidePartClone.AddNewPart<ChartPart>(part.ContentType, sourceSlide.GetIdOfPart(part)); 
      newpart.FeedData(part.GetStream()); 
      newpart.AddNewPart<EmbeddedPackagePart>(part.EmbeddedPackagePart.ContentType, part.GetIdOfPart(part.EmbeddedPackagePart)); 
      newpart.EmbeddedPackagePart.FeedData(part.EmbeddedPackagePart.GetStream()); 
     } 
     foreach (EmbeddedObjectPart part in sourceSlide.EmbeddedObjectParts) 
     { 
      EmbeddedObjectPart newpart = slidePartClone.AddNewPart<EmbeddedObjectPart>(part.ContentType, sourceSlide.GetIdOfPart(part)); 
      newpart.FeedData(part.GetStream()); 
     } 
     foreach (EmbeddedPackagePart part in sourceSlide.EmbeddedPackageParts) 
     { 
      EmbeddedPackagePart newpart = slidePartClone.AddNewPart<EmbeddedPackagePart>(part.ContentType, sourceSlide.GetIdOfPart(part)); 
      newpart.FeedData(part.GetStream()); 
     } 
     foreach (ImagePart part in sourceSlide.ImageParts) 
     { 
      ImagePart newpart = slidePartClone.AddNewPart<ImagePart>(part.ContentType, sourceSlide.GetIdOfPart(part)); 
      newpart.FeedData(part.GetStream()); 
     } 
     foreach (VmlDrawingPart part in sourceSlide.VmlDrawingParts) 
     { 
      VmlDrawingPart newpart = slidePartClone.AddNewPart<VmlDrawingPart>(part.ContentType, sourceSlide.GetIdOfPart(part)); 
      newpart.FeedData(part.GetStream()); 
     } 
     foreach (UserDefinedTagsPart part in sourceSlide.UserDefinedTagsParts) 
     { 
      UserDefinedTagsPart newpart = slidePartClone.AddNewPart<UserDefinedTagsPart>(part.ContentType, sourceSlide.GetIdOfPart(part)); 
      newpart.FeedData(part.GetStream()); 
     } 
     return slidePartClone; 
    } 

в моем основном методе, который я ниже кода, который вызывает эти функции для создания РРТА

string sourceFilePath [email protected]"C:\TempFolder\template.potx"; 
string destinationFilePath = @"C:\TempFolder\ClonedFile.potx"; 
sourceFilePath.CreateFileFromTemplate(destinationFilePath); 

, но окончательный созданного п.п. ВОЛИ в нем не было никаких слайдов,

всякая помощь была бы оценена

ответ

2

Я опубликовал аналогичный ответ, прежде чем сохранять шаблон excel в фактическом документе Excel here, и вы должны иметь возможность применять ту же логику с шаблоном точки питания. Вместо SpreadsheetDocument вы захотите использовать PresentationDocument и вызвать на нем ChangeDocumentType. Что-то вдоль этих линий:

byte[] byteArray = File.ReadAllBytes("C:\\temp\\sa123.potx"); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    stream.Write(byteArray, 0, (int)byteArray.Length); 
    using (PresentationDocument presentationDoc = PresentationDocument.Open(stream, true)) 
    { 
     // Change from template type to presentation type 
     presentationDoc.ChangeDocumentType(PresentationDocumentType.Presentation); 
    } 
    File.WriteAllBytes("C:\\temp\\sa123.pptx", stream.ToArray()); 
} 

Вы можете затем открыть этот сохраненный файл и делать все, что дополнительный материал вы хотите к нему, не касаясь файла шаблона.

+0

@ amurra-Спасибо, работает отлично !!! –