2017-09-24 2 views
0

Mit einem C# -Aus Add bin ich versucht, eine Schaltfläche zu PowerPoint hinzuzufügen, und wenn ich auf die Schaltfläche klicke, wird eine neue Folie zur aktuellen Präsentation hinzugefügt.Hinzufügen einer Folie in einer PowerPoint-Präsentation in C#

Ich habe this solution gefunden - es ist wirklich nah an dem, was ich tun möchte ... aber es ist beabsichtigt, eine andere PowerPoint-Datei zu öffnen und eine Folie hinzuzufügen. Aber ich möchte eine Folie zur aktuellen Präsentation hinzufügen.

Ich habe versucht, den angegebenen Code zu ändern, aber es ist mir nicht gelungen.

I 2 Fragen in den Code eingefügt haben, wo ich denke, dass es ein Problem ist, und markiert sie // ***** hier Frage ***** am Anfang und Ende des Codes

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(); 
} 

Wissen Sie, wie ich die aktuelle Präsentation ändern kann?

Antwort

0

verwenden:

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(); 
    } 

Bitte auf diese zu How to use Automation to create and to show a PowerPoint 2002 presentation by using Visual C# .NET 2002

+0

Nun, ich denke das Problem ist das gleiche: hier gibt es einen Ordner geben, öffnen und eine andere Darstellung ändern. Was ich tun möchte, ist die aktuelle Präsentation zu ändern (ich mache ein Add-in in ppt - und wenn Sie eine Präsentation öffnen und einen Button vom Add-in drücken, wird eine neue Folie hinzugefügt -> so brauche ich um die aktuelle Präsentation zu ändern). Vielleicht ist es sehr einfach von Ihrem Code, aber ich kann nicht sehen, wie es geht? – droledenom

Verwandte Themen