简体   繁体   English

在C#中的PowerPoint演示文稿中添加幻灯片

[英]Adding a slide in a PowerPoint presentation in C#

With a C# add-in, I am trying to add a button to PowerPoint and when I click the button, a new slide is added to the current presentation. 使用C#加载项,我试图在PowerPoint中添加一个按钮,然后单击该按钮,新幻灯片将添加到当前演示文稿中。

I have found this solution - it is really close to what I want to do... but it is intended to open another PowerPoint file and add a slide to it. 我已经找到了这个解决方案 -确实很接近我想要做的事情...但是它旨在打开另一个PowerPoint文件并向其中添加一张幻灯片。 But what I want to do is to add a slide to the current presentation. 但是我想做的就是在当前演示文稿中添加一张幻灯片。

I tried to modify the given code, but I didn't succeed. 我试图修改给定的代码,但是没有成功。

I have inserted 2 questions into code where I think there is a problem and tagged them //*****question here***** at the beginning and the end of the code 我在代码中我认为有问题的地方插入了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();
}

Do you know how I can say to modify the current presentation ? 您知道如何说修改当前演示文稿吗?

Use this : 用这个 :

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

Please Refer to this too How to use Automation to create and to show a PowerPoint 2002 presentation by using Visual C# .NET 2002 请也参考此内容如何使用自动化通过使用Visual C#.NET 2002创建和显示PowerPoint 2002演示文稿

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM