如何:将新幻灯片插入到演示文稿

上次修改时间: 2010年10月14日

适用范围: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

本文内容
获取 PresentationDocument 对象
基本演示文稿文档结构
示例代码的工作方式
示例代码

本主题演示如何使用 Open XML SDK 2.0 for Microsoft Office 中的类以编程方式在演示文稿中插入新幻灯片。

编译本主题中的代码需要使用以下程序集指令。

using System;
using DocumentFormat.OpenXml.Presentation;
using DocumentFormat.OpenXml.Packaging;
using Drawing = DocumentFormat.OpenXml.Drawing;
Imports System
Imports DocumentFormat.OpenXml.Presentation
Imports DocumentFormat.OpenXml.Packaging
Imports Drawing = DocumentFormat.OpenXml.Drawing

获取 PresentationDocument 对象

在 Open XML SDK 中,PresentationDocument 类表示演示文稿文档包。若要使用演示文稿文档,首先创建 PresentationDocument 类的实例,然后使用该实例。若要从文档中创建类实例,请调用使用文件路径的 Open(String, Boolean) 方法,并以布尔值作为第二个参数来指定文档是否可编辑。若要打开文档进行读/写,请为此参数指定值 true,如以下的 using 语句所示。在该代码段中,presentationFile 参数是一个字符串,表示要从中打开该文档的文件的路径。

using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
    // Insert other code here.
}
Using presentationDocument As PresentationDocument = PresentationDocument.Open(presentationFile, True)
    ' Insert other code here.
End Using

using 语句提供典型 .Open, .Save, .Close 序列的建议备选序列。它确保在遇到右大括号时会自动调用 Dispose 方法(Open XML SDK 用来清理资源的内部方法)。using 语句后面的块为 using 语句中创建或指定的对象设定范围,在此示例中这个范围就是 presentationDocument

基本演示文稿文档结构

PresentationML 文档的基本文档结构由包含演示文稿定义的主部件组成。ISO/IEC 29500(该链接可能指向英文页面) 规范中的以下文本介绍了 PresentationML 包的整体形式。

PresentationML 包的主部件以演示文稿根元素开头。该元素包含演示文稿,演示文稿又引用幻灯片 列表、幻灯片母版 列表、备注母版 列表和讲义母版 列表。幻灯片列表指的是演示文稿中的所有幻灯片;幻灯片母版列表指的是演示文稿中使用的全部幻灯片母版;备注母版包含有关备注页格式的信息;讲义母版描述讲义的外观。

讲义 是打印的一组幻灯片,可提供给访问群体 以供他们将来参考。

除了文本和图形,每个幻灯片还可以包含注释 和备注,可以具有布局,并且可以是一个或多个自定义演示文稿 的组成部分。(注释是供维护演示文稿幻灯片平台的人员参考的批注。备注是供演示者或访问群体参考的提醒信息或一段文字。)

PresentationML 文档可以包含的其他功能如下:动画、音频、视频 以及幻灯片之间的切换。

PresentationML 文档不会存储为单个部件中的一个大型正文。而实现某些功能组合的元素会存储在各个部件中。例如,文档中的所有注释都存储在一个注释部件中,而每个幻灯片都有自己的部件。

© ISO/IEC29500: 2008。

以下 XML 代码段代表包含用 Id 267 和 256 表示的两个幻灯片的演示文稿。

<p:presentation xmlns:p="…" … > 
   <p:sldMasterIdLst>
      <p:sldMasterId
         xmlns:rel="http://…/relationships" rel:id="rId1"/>
   </p:sldMasterIdLst>
   <p:notesMasterIdLst>
      <p:notesMasterId
         xmlns:rel="http://…/relationships" rel:id="rId4"/>
   </p:notesMasterIdLst>
   <p:handoutMasterIdLst>
      <p:handoutMasterId
         xmlns:rel="http://…/relationships" rel:id="rId5"/>
   </p:handoutMasterIdLst>
   <p:sldIdLst>
      <p:sldId id="267"
         xmlns:rel="http://…/relationships" rel:id="rId2"/>
      <p:sldId id="256"
         xmlns:rel="http://…/relationships" rel:id="rId3"/>
   </p:sldIdLst>
       <p:sldSz cx="9144000" cy="6858000"/>
   <p:notesSz cx="6858000" cy="9144000"/>
</p:presentation>

通过使用 Open XML SDK 2.0,您可以利用 PresentationML 元素所对应的强类型类创建文档结构和内容。可以在 DocumentFormat.OpenXml.Presentation 命名空间中找到这些类。下表列出了 sld、sldLayout、sldMaster 和 notesMaster 元素所对应类的类名:

PresentationML 元素

Open XML SDK 2.0 类

说明

sld

Slide

演示文稿幻灯片。它是 SlidePart 的根元素。

sldLayout

SlideLayout

幻灯片版式。它是 SlideLayoutPart 的根元素。

sldMaster

SlideMaster

幻灯片母版。它是 SlideMasterPart 的根元素。

notesMaster

NotesMaster

备注母版(或讲义母版)。它是 NotesMasterPart 的根元素。

示例代码的工作方式

示例代码由 InsertNewSlide 方法的两个重载组成。第一个重载方法使用三个参数:一个表示要向其中添加幻灯片的演示文稿文件的完整路径、一个表示演示文稿中要添加幻灯片的从零开始的幻灯片索引位置的整数,和一个表示新幻灯片的标题的字符串。它以读/写模式打开演示文稿文件,获取 PresentationDocument 对象,然后将该对象传递给第二个重载的 InsertNewSlide 方法,由该方法执行插入操作。

// Insert a slide into the specified presentation.
 public static void InsertNewSlide(string presentationFile, int position, string slideTitle)
{
    // Open the source document as read/write. 
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        // Pass the source document and the position and title of the slide to be inserted to the next method.
        InsertNewSlide(presentationDocument, position, slideTitle);
    }
}
' Insert a slide into the specified presentation.
Public Shared Sub InsertNewSlide(ByVal presentationFile As String, ByVal position As Integer, ByVal slideTitle As String)
    ' Open the source document as read/write. 
    Using presentationDocument As PresentationDocument = PresentationDocument.Open(presentationFile, True)
        ' Pass the source document and the position and title of the slide to be inserted to the next method.
        InsertNewSlide(presentationDocument, position, slideTitle)
    End Using
End Sub

第二个重载的 InsertNewSlide 方法创建一个新的 Slide 对象,设置此对象的属性,然后将此对象插入到演示文稿中的幻灯片顺序。此方法的第一部分会创建幻灯片并设置其属性。

// Insert the specified slide into the presentation at the specified position.
public static void InsertNewSlide(PresentationDocument presentationDocument, int position, string slideTitle)
{
    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    if (slideTitle == null)
    {
        throw new ArgumentNullException("slideTitle");
    }

    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Verify that the presentation is not empty.
    if (presentationPart == null)
    {
        throw new InvalidOperationException("The presentation document is empty.");
    }

    // 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());
' Insert the specified slide into the presentation at the specified position.
Public Shared Sub InsertNewSlide(ByVal presentationDocument As PresentationDocument, ByVal position As Integer, ByVal slideTitle As String)
    If presentationDocument Is Nothing Then
        Throw New ArgumentNullException("presentationDocument")
    End If

    If slideTitle Is Nothing Then
        Throw New ArgumentNullException("slideTitle")
    End If

    Dim presentationPart As PresentationPart = presentationDocument.PresentationPart

    ' Verify that the presentation is not empty.
    If presentationPart Is Nothing Then
        Throw New InvalidOperationException("The presentation document is empty.")
    End If

    ' Declare and instantiate a new slide.
    Dim slide As New Slide(New CommonSlideData(New ShapeTree()))
    Dim drawingObjectId As UInteger = 1

    ' Construct the slide content.            
    ' Specify the non-visual properties of the new slide.
    Dim nonVisualProperties As NonVisualGroupShapeProperties = slide.CommonSlideData.ShapeTree.AppendChild(New NonVisualGroupShapeProperties())
    nonVisualProperties.NonVisualDrawingProperties = New NonVisualDrawingProperties() With {.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())

第二个重载的 InsertNewSlide 方法的下一部分会将标题形状添加到幻灯片并设置其属性(包括它的文本)。

// 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 title shape of the new slide.
Dim titleShape As DocumentFormat.OpenXml.Presentation.Shape = slide.CommonSlideData.ShapeTree.AppendChild _
    (New DocumentFormat.OpenXml.Presentation.Shape())
drawingObjectId = (drawingObjectId + 1)

' Specify the required shape properties for the title shape. 
titleShape.NonVisualShapeProperties = New DocumentFormat.OpenXml.Presentation.NonVisualShapeProperties(New  _
    DocumentFormat.OpenXml.Presentation.NonVisualDrawingProperties() With {.Id = drawingObjectId, .Name = "Title"}, _
    New DocumentFormat.OpenXml.Presentation.NonVisualShapeDrawingProperties _
    (New Drawing.ShapeLocks() With {.NoGrouping = True}), _
    New ApplicationNonVisualDrawingProperties(New PlaceholderShape() With {.Type = PlaceholderValues.Title}))

titleShape.ShapeProperties = New DocumentFormat.OpenXml.Presentation.ShapeProperties()

' Specify the text of the title shape.
titleShape.TextBody = New DocumentFormat.OpenXml.Presentation.TextBody(New Drawing.BodyProperties, _
     New Drawing.ListStyle, New Drawing.Paragraph _
     (New Drawing.Run(New Drawing.Text() With {.Text = slideTitle})))

第二个重载的 InsertNewSlide 方法的下一部分会将正文形状添加到幻灯片并设置其属性(包括它的文本)。

// 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());
' Declare and instantiate the body shape of the new slide.
Dim bodyShape As Shape = slide.CommonSlideData.ShapeTree.AppendChild(New Shape())
    drawingObjectId += 1

    ' Specify the required shape properties for the body shape.
    bodyShape.NonVisualShapeProperties = New NonVisualShapeProperties(New NonVisualDrawingProperties() With {.Id = drawingObjectId, .Name = "Content Placeholder"}, New NonVisualShapeDrawingProperties(New Drawing.ShapeLocks() With {.NoGrouping = True}), New ApplicationNonVisualDrawingProperties(New PlaceholderShape() With {.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())

第二个重载的 InsertNewSlide 方法的最后一部分会新建一张幻灯片部件,找到要将幻灯片插入到的指定索引位置,然后插入幻灯片并保存修改后的演示文稿。

// 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);

// Save the modified presentation.
presentationPart.Presentation.Save();
}
' Create the slide part for the new slide.
Dim slidePart As SlidePart = presentationPart.AddNewPart(Of 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.
    Dim slideIdList As SlideIdList = presentationPart.Presentation.SlideIdList

    ' Find the highest slide ID in the current list.
    Dim maxSlideId As UInteger = 1
    Dim prevSlideId As SlideId = Nothing

    For Each slideId As SlideId In slideIdList.ChildElements
        If slideId.Id > maxSlideId Then
            maxSlideId = slideId.Id
        End If

        position -= 1
        If position = 0 Then
            prevSlideId = slideId
        End If

    Next slideId

    maxSlideId += 1

    ' Get the ID of the previous slide.
    Dim lastSlidePart As SlidePart

    If prevSlideId IsNot Nothing Then
        lastSlidePart = CType(presentationPart.GetPartById(prevSlideId.RelationshipId), SlidePart)
    Else
        lastSlidePart = CType(presentationPart.GetPartById((CType(slideIdList.ChildElements(0), SlideId)).RelationshipId), SlidePart)
    End If

    ' Use the same slide layout as that of the previous slide.
    If Nothing IsNot lastSlidePart.SlideLayoutPart Then
        slidePart.AddPart(lastSlidePart.SlideLayoutPart)
    End If

    ' Insert the new slide into the slide list after the previous slide.
    Dim newSlideId As SlideId = slideIdList.InsertAfter(New SlideId(), prevSlideId)
    newSlideId.Id = maxSlideId
    newSlideId.RelationshipId = presentationPart.GetIdOfPart(slidePart)

    ' Save the modified presentation.
    presentationPart.Presentation.Save()
End Sub

示例代码

通过使用示例代码,您可以向现在演示文稿中添加新幻灯片。在您的程序中,可以使用对 InsertNewSlide 方法的以下调用,在名为"Myppt10.pptx"的演示文稿文件的位置 1 处添加标题为"My new slide"的新幻灯片。

InsertNewSlide(@"C:\Users\Public\Documents\Myppt10.pptx", 1, "My new slide");
InsertNewSlide("C:\Users\Public\Documents\Myppt10.pptx", 1, "My new slide")

运行程序后,新幻灯片应作为演示文稿中的第二个幻灯片显示。

以下是使用 C# 和 Visual Basic 编写的完整示例代码。

// Insert a slide into the specified presentation.
public static void InsertNewSlide(string presentationFile, int position, string slideTitle)
{
    // Open the source document as read/write. 
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        // Pass the source document and the position and title of the slide to be inserted to the next method.
        InsertNewSlide(presentationDocument, position, slideTitle);
    }
}

// Insert the specified slide into the presentation at the specified position.
public static void InsertNewSlide(PresentationDocument presentationDocument, int position, string slideTitle)
{

    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    if (slideTitle == null)
    {
        throw new ArgumentNullException("slideTitle");
    }

    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Verify that the presentation is not empty.
    if (presentationPart == null)
    {
        throw new InvalidOperationException("The presentation document is empty.");
    }

    // 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);

    // Save the modified presentation.
    presentationPart.Presentation.Save();
}
' Insert a slide into the specified presentation.
Public Sub InsertNewSlide(ByVal presentationFile As String, ByVal position As Integer, ByVal slideTitle As String)

    ' Open the source document as read/write. 
    Dim presentationDocument As PresentationDocument = presentationDocument.Open(presentationFile, True)

    Using (presentationDocument)

        'Pass the source document and the position and title of the slide to be inserted to the next method.
        InsertNewSlide(presentationDocument, position, slideTitle)

    End Using

End Sub
' Insert a slide into the specified presentation.
Public Sub InsertNewSlide(ByVal presentationDocument As PresentationDocument, ByVal position As Integer, ByVal slideTitle As String)
    If (presentationDocument Is Nothing) Then
        Throw New ArgumentNullException("presentationDocument")
    End If
    If (slideTitle Is Nothing) Then
        Throw New ArgumentNullException("slideTitle")
    End If

    Dim presentationPart As PresentationPart = presentationDocument.PresentationPart

    ' Verify that the presentation is not empty.
    If (presentationPart Is Nothing) Then
        Throw New InvalidOperationException("The presentation document is empty.")
    End If

    ' Declare and instantiate a new slide.
    Dim slide As Slide = New Slide(New CommonSlideData(New ShapeTree))
    Dim drawingObjectId As UInteger = 1

    ' Construct the slide content.
    ' Specify the non-visual properties of the new slide.
    Dim nonVisualProperties As DocumentFormat.OpenXml.Presentation.NonVisualGroupShapeProperties = slide.CommonSlideData.ShapeTree.AppendChild(New  _
        DocumentFormat.OpenXml.Presentation.NonVisualGroupShapeProperties())
    nonVisualProperties.NonVisualDrawingProperties = New DocumentFormat.OpenXml.Presentation.NonVisualDrawingProperties() With {.Id = 1, .Name = ""}
    nonVisualProperties.NonVisualGroupShapeDrawingProperties = New DocumentFormat.OpenXml.Presentation.NonVisualGroupShapeDrawingProperties()
    nonVisualProperties.ApplicationNonVisualDrawingProperties = New ApplicationNonVisualDrawingProperties()

    ' Specify the group shape properties of the new slide.
    slide.CommonSlideData.ShapeTree.AppendChild(New DocumentFormat.OpenXml.Presentation.GroupShapeProperties())
    ' Declare and instantiate the title shape of the new slide.
    Dim titleShape As DocumentFormat.OpenXml.Presentation.Shape = slide.CommonSlideData.ShapeTree.AppendChild _
        (New DocumentFormat.OpenXml.Presentation.Shape())
    drawingObjectId = (drawingObjectId + 1)

    ' Specify the required shape properties for the title shape. 
    titleShape.NonVisualShapeProperties = New DocumentFormat.OpenXml.Presentation.NonVisualShapeProperties(New  _
        DocumentFormat.OpenXml.Presentation.NonVisualDrawingProperties() With {.Id = drawingObjectId, .Name = "Title"}, _
        New DocumentFormat.OpenXml.Presentation.NonVisualShapeDrawingProperties _
        (New Drawing.ShapeLocks() With {.NoGrouping = True}), _
        New ApplicationNonVisualDrawingProperties(New PlaceholderShape() With {.Type = PlaceholderValues.Title}))

    titleShape.ShapeProperties = New DocumentFormat.OpenXml.Presentation.ShapeProperties()

    ' Specify the text of the title shape.
    titleShape.TextBody = New DocumentFormat.OpenXml.Presentation.TextBody(New Drawing.BodyProperties, _
         New Drawing.ListStyle, New Drawing.Paragraph _
         (New Drawing.Run(New Drawing.Text() With {.Text = slideTitle})))
    ' Declare and instantiate the body shape of the new slide.
    Dim bodyShape As DocumentFormat.OpenXml.Presentation.Shape = slide.CommonSlideData.ShapeTree.AppendChild _
        (New DocumentFormat.OpenXml.Presentation.Shape())
    drawingObjectId = (drawingObjectId + 1)

    ' Specify the required shape properties for the body shape.
    bodyShape.NonVisualShapeProperties = New NonVisualShapeProperties(New NonVisualDrawingProperties() With {.Id = drawingObjectId, .Name = "ContentPlaceholder"}, _
         New NonVisualShapeDrawingProperties(New Drawing.ShapeLocks() With {.NoGrouping = True}), _
         New ApplicationNonVisualDrawingProperties(New PlaceholderShape() With {.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.
    Dim slidePart As SlidePart = presentationPart.AddNewPart(Of 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.
    Dim slideIdList As SlideIdList = presentationPart.Presentation.SlideIdList

    ' Find the highest slide ID in the current list.
    Dim maxSlideId As UInteger = 1
    Dim prevSlideId As SlideId = Nothing

    For Each slideId As SlideId In slideIdList.ChildElements
        If (CType(slideId.Id, UInteger) > maxSlideId) Then
            maxSlideId = slideId.Id
        End If
        position = (position - 1)
        If (position = 0) Then
            prevSlideId = slideId
        End If
    Next

    maxSlideId = (maxSlideId + 1)

    ' Get the ID of the previous slide.
    Dim lastSlidePart As SlidePart = Nothing

    If (Not prevSlideId Is Nothing) Then
        lastSlidePart = CType(presentationPart.GetPartById(prevSlideId.RelationshipId), SlidePart)
    Else
        lastSlidePart = CType(presentationPart.GetPartById(CType(slideIdList.ChildElements(0), SlideId).RelationshipId), SlidePart)
    End If


    ' Use the same slide layout as that of the previous slide.
    If (Not (lastSlidePart.SlideLayoutPart) Is Nothing) Then
        slidePart.AddPart(lastSlidePart.SlideLayoutPart)
    End If

    ' Insert the new slide into the slide list after the previous slide.
    Dim newSlideId As SlideId = slideIdList.InsertAfter(New SlideId, prevSlideId)
    newSlideId.Id = maxSlideId
    newSlideId.RelationshipId = presentationPart.GetIdOfPart(slidePart)

    ' Save the modified presentation.
    presentationPart.Presentation.Save()

End Sub

请参阅

引用

Class Library Reference