簡體   English   中英

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

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

使用C#加載項,我試圖在PowerPoint中添加一個按鈕,然后單擊該按鈕,新幻燈片將添加到當前演示文稿中。

我已經找到了這個解決方案 -確實很接近我想要做的事情...但是它旨在打開另一個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();
}

您知道如何說修改當前演示文稿嗎?

用這個 :

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

請也參考此內容如何使用自動化通過使用Visual C#.NET 2002創建和顯示PowerPoint 2002演示文稿

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM