2017-09-24 2 views
0

Avec un complément C#, j'essaie d'ajouter un bouton à PowerPoint et lorsque je clique sur le bouton, une nouvelle diapositive est ajoutée à la présentation en cours.Ajout d'une diapositive dans une présentation PowerPoint en C#

J'ai trouvé this solution - il est vraiment proche de ce que je veux faire ... mais il est prévu d'ouvrir un autre fichier PowerPoint et d'y ajouter une diapositive. Mais ce que je veux faire est d'ajouter une diapositive à la présentation actuelle.

J'ai essayé de modifier le code donné, mais je n'ai pas réussi.

J'ai inséré 2 questions dans le code où je pense qu'il ya un problème et les tagged // ***** question ici ***** au début et à la fin du code

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

Savez-vous comment je peux dire pour modifier la présentation actuelle?

Répondre

0

Utilisez ceci:

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

S'il vous plaît Reportez-vous à cela aussi How to use Automation to create and to show a PowerPoint 2002 presentation by using Visual C# .NET 2002

+0

Eh bien, je pense que le problème est le même: vous donnez un dossier, ouvrir et modifier une autre présentation. Ce que je veux faire est de modifier la présentation actuelle (je fais un add-in dans ppt - et quand vous ouvrez une présentation et appuyez sur un bouton donné par le complément, une nouvelle diapositive est ajoutée -> alors j'ai besoin pour modifier la présentation actuelle). Peut-être que c'est très simple de votre code mais je ne peux pas voir comment faire? – droledenom