2017-09-24 134 views
0

使用C#加载项时,我试图向PowerPoint添加按钮,并且当我单击该按钮时,新幻灯片将添加到当前演示文稿中。在C#中的PowerPoint演示文稿中添加幻灯片

我找到了this solution - 它真的很接近我想要做的事......但打算打开另一个PowerPoint文件并向其中添加幻灯片。但是我想要做的是在当前的演示文稿中添加幻灯片。

我试图修改给定的代码,但我没有成功。

我已插入2个问题为代码,我认为这是一个问题,他们标记// *****的问题在这里*****在开始和代码

private void buttonForSlide_Click(object sender, EventArgs e) 
{ 
    InsertNewSlide(2, "New Slide added"); 
} 

// Insert the specified slide into the presentation at the specified position. 
public static void InsertNewSlide(int position, string slideTitle) 
{ 

    //*******question here********* Initially the code was like the following line where presentationDocument was presentationDocument = PresentationDocument.Open(pathOfTheFile, true) - I don't know how to specify to modify the current presentation ? 

    PresentationPart presentationPart = presentationDocument.PresentationPart; 

    // Declare and instantiate a new slide. 
    Slide slide = new Slide(new CommonSlideData(new ShapeTree())); 
    uint drawingObjectId = 1; 

    // Construct the slide content.    
    // Specify the non-visual properties of the new slide. 
    NonVisualGroupShapeProperties nonVisualProperties = slide.CommonSlideData.ShapeTree.AppendChild(new NonVisualGroupShapeProperties()); 
    nonVisualProperties.NonVisualDrawingProperties = new NonVisualDrawingProperties() { Id = 1, Name = "" }; 
    nonVisualProperties.NonVisualGroupShapeDrawingProperties = new NonVisualGroupShapeDrawingProperties(); 
    nonVisualProperties.ApplicationNonVisualDrawingProperties = new ApplicationNonVisualDrawingProperties(); 

    // Specify the group shape properties of the new slide. 
    slide.CommonSlideData.ShapeTree.AppendChild(new GroupShapeProperties()); 

    // Declare and instantiate the title shape of the new slide. 
    Shape titleShape = slide.CommonSlideData.ShapeTree.AppendChild(new Shape()); 

    drawingObjectId++; 

    // Specify the required shape properties for the title shape. 
    titleShape.NonVisualShapeProperties = new NonVisualShapeProperties 
     (new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Title" }, 
     new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }), 
     new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Type = PlaceholderValues.Title })); 
    titleShape.ShapeProperties = new ShapeProperties(); 

    // Specify the text of the title shape. 
    titleShape.TextBody = new TextBody(new Drawing.BodyProperties(), 
      new Drawing.ListStyle(), 
      new Drawing.Paragraph(new Drawing.Run(new Drawing.Text() { Text = slideTitle }))); 

    // Declare and instantiate the body shape of the new slide. 
    Shape bodyShape = slide.CommonSlideData.ShapeTree.AppendChild(new Shape()); 
    drawingObjectId++; 

    // Specify the required shape properties for the body shape. 
    bodyShape.NonVisualShapeProperties = new NonVisualShapeProperties(new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Content Placeholder" }, 
      new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }), 
      new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Index = 1 })); 
    bodyShape.ShapeProperties = new ShapeProperties(); 

    // Specify the text of the body shape. 
    bodyShape.TextBody = new TextBody(new Drawing.BodyProperties(), 
      new Drawing.ListStyle(), 
      new Drawing.Paragraph()); 

    // Create the slide part for the new slide. 
    SlidePart slidePart = presentationPart.AddNewPart<SlidePart>(); 

    // Save the new slide part. 
    slide.Save(slidePart); 

    // Modify the slide ID list in the presentation part. 
    // The slide ID list should not be null. 
    SlideIdList slideIdList = presentationPart.Presentation.SlideIdList; 

    // Find the highest slide ID in the current list. 
    uint maxSlideId = 1; 
    SlideId prevSlideId = null; 

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

     position--; 
     if (position == 0) 
     { 
      prevSlideId = slideId; 
     } 

    } 

    maxSlideId++; 

    // Get the ID of the previous slide. 
    SlidePart lastSlidePart; 

    if (prevSlideId != null) 
    { 
     lastSlidePart = (SlidePart)presentationPart.GetPartById(prevSlideId.RelationshipId); 
    } 
    else 
    { 
     lastSlidePart = (SlidePart)presentationPart.GetPartById(((SlideId)(slideIdList.ChildElements[0])).RelationshipId); 
    } 

    // Use the same slide layout as that of the previous slide. 
    if (null != lastSlidePart.SlideLayoutPart) 
    { 
     slidePart.AddPart(lastSlidePart.SlideLayoutPart); 
    } 

    // Insert the new slide into the slide list after the previous slide. 
    SlideId newSlideId = slideIdList.InsertAfter(new SlideId(), prevSlideId); 
    newSlideId.Id = maxSlideId; 
    newSlideId.RelationshipId = presentationPart.GetIdOfPart(slidePart); 

    //*******question here********** Do you believe I have to save if I want to modify the current presentation ? 
    //presentationPart.Presentation.Save(); 
} 
结束

你知道我怎么能说修改当前的演示文稿吗?

回答

0

使用此:

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     string folderName = @"E:\PPTFolder\"; 
     AddSlides(folderName);    
    } 

    private void AddSlides(string folderName) 
    {    
     string[] filePaths = Directory.GetFiles(folderName, "*.pptx", SearchOption.TopDirectoryOnly); 

     Microsoft.Office.Core.MsoTriState oFalse = Microsoft.Office.Core.MsoTriState.msoFalse; 
     Microsoft.Office.Core.MsoTriState oTrue = Microsoft.Office.Core.MsoTriState.msoTrue; 

     PowerPoint.Application oApp = new PowerPoint.Application(); 
     oApp.Visible = oTrue; 
     oApp.WindowState = PowerPoint.PpWindowState.ppWindowNormal; 

     PowerPoint.Presentation oPres; 
     PowerPoint.Slide oSlide=new PowerPoint.Slide(); 

     for (int i = 0; i < filePaths.Length; i++) 
     { 
      oPres = oApp.Presentations.Open(filePaths[i], ReadOnly: oFalse);     
      oSlide = oPres.Slides.Add(oPres.Slides.Count + 1, PowerPoint.PpSlideLayout.ppLayoutTitleOnly); 
      oSlide.Shapes[1].TextFrame.TextRange.Text = "Final Test"; 
      oSlide.Shapes[1].TextFrame.TextRange.Font.Name = "Comic Sans MS"; 
      oSlide.Shapes[1].TextFrame.TextRange.Font.Size = 48; 

      oPres.Save(); 
      oPres.Close(); 
     } 
     oSlide = null; 
     oPres = null; 
     oApp.Quit(); 
     oApp = null; 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
    } 

请参阅本太How to use Automation to create and to show a PowerPoint 2002 presentation by using Visual C# .NET 2002

+0

嗯,我认为这个问题是相同的:在这里你给一个文件夹,打开和修改其他演示文稿。我想要做的是修改当前的演示文稿(我正在做一个ppt的插件 - 当你打开一个演示文稿并按下插件给出的按钮时,会添加一个新的幻灯片 - >所以我需要修改当前的演示文稿)。也许这是从你的代码非常简单,但我不明白该怎么办? – droledenom

相关问题