2015-05-12 35 views
1

我有一个.potx扩展名的PPT模板,我需要创建一个模板文件的副本,但创建的文件没有任何内容,它是一个空白的演示文稿,下面是我正在使用模板文件创建目标文件的功能。使用openXML创建一个模板演示文稿“.potx”到一个新的“.pptx”的副本

/// <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; 
    } 

在我的主要方法,下面我有它调用这些函数来创建PPT

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

但最终产生的ppt将代码没有任何幻灯片,

任何帮助,将不胜感激

回答

2

我之前发布过类似的答案,将excel模板保存到实际的excel文档here之前,您应该能够将相同的逻辑应用于电源点模板。您将需要使用PresentationDocument而不是SpreadsheetDocument,并在其上调用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-谢谢,完美的作品! –

相关问题