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

时间:2017-09-24 13:02:36

标签: c# powerpoint openxml

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

你知道如何修改当前的演示文稿吗?

1 个答案:

答案 0 :(得分: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