获取 PresentationDocument 对象
在 Open XML SDK 中,
PresentationDocument
类表示演示文稿文档包。 若要使用演示文稿文档,首先创建
PresentationDocument
类的实例,然后使用该实例。 若要从文档创建类实例,请调用
PresentationDocument.Open (String、Boolean)
使用文件路径的方法和布尔值作为指定文档是否可编辑的第二个参数。 将此第二个参数设置为
false
将打开文件进行只读访问;如果要打开文件进行读/写访问,可将此参数设置为
true
。 在此主题中,最好打开文件进行只读访问,以防止文件被意外写入。 下面的
using
语句打开文件进行只读访问。 在此代码段中,
fileName
参数是一个字符串,表示要从中打开该文档的文件的路径。
Visual Basic
// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, false))
// Insert other code here.
' Open the presentation file as read-only.
Using document As PresentationDocument = PresentationDocument.Open(fileName, False)
' Insert other code here.
End Using
using 语句提供典型 .Open, .Save, .Close 序列的建议备选序列。 它确保在遇到右大括号时会自动调用 Dispose 方法(Open XML SDK 用来清理资源的内部方法)。 using 语句后面的块为 using 语句中创建或指定的对象设定范围,在此示例中这个范围就是 document。
基本演示文稿文档结构
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="https://…/relationships" rel:id="rId1"/>
</p:sldMasterIdLst>
<p:notesMasterIdLst>
<p:notesMasterId
xmlns:rel="https://…/relationships" rel:id="rId4"/>
</p:notesMasterIdLst>
<p:handoutMasterIdLst>
<p:handoutMasterId
xmlns:rel="https://…/relationships" rel:id="rId5"/>
</p:handoutMasterIdLst>
<p:sldIdLst>
<p:sldId id="267"
xmlns:rel="https://…/relationships" rel:id="rId2"/>
<p:sldId id="256"
xmlns:rel="https://…/relationships" rel:id="rId3"/>
</p:sldIdLst>
<p:sldSz cx="9144000" cy="6858000"/>
<p:notesSz cx="6858000" cy="9144000"/>
</p:presentation>
使用 Open XML SDK,可以使用对应于 PresentationML 元素的强类型类创建文档结构和内容。 可以在 DocumentFormat.OpenXml.Presentation 命名空间中找到这些类。 下表列出了 sld、 sldLayout、 sldMaster 和 notesMaster 元素所对应类的类名称。
PresentationML 元素
Open XML SDK 类
在此操作方法代码示例中,您将处理外部超链接。 因此,您最好熟悉一下超链接元素。 ISO/IEC 29500 规范中的以下文本介绍了超链接目标) id (。
指定其目标将用作此超链接目标的关系的 ID。
如果省略此属性,则当前超链接将没有外部超链接目标 - 当前文档中的位置仍然可以通过定位属性成为目标。 如果此属性存在,它将取代定位属性中的值。
[示例:请考虑以下事项 超链接的 PresentationML** 片段:
<w:hyperlink r:id="rId9">
<w:t>https://www.example.com</w:t>
</w:hyperlink>
rId9 的 id 属性值指定在调用此超链接时必须导航到的、具有对应 ID 属性值的关联关系部件项中的关系。 例如,如果关联的关系部件项中存在以下 XML:
<Relationships xmlns="…">
<Relationship Id="rId9" Mode="External"
Target=https://www.example.com />
</Relationships>
因此,该超链接的目标将为关系 rId9 的目标 - 在此示例中为 https://www.example.com。 示例结束]
此属性可能的值由 ST_RelationshipId 简单类型定义 (§22.8.2.1)。
© ISO/IEC29500: 2008.
示例代码的工作方式
本主题中的示例代码包含一个方法,该方法采用表示文件的完整路径作为参数。 它循环访问演示文稿中的所有幻灯片,并返回表示通用资源标识符 (URI) 演示文稿中所有外部超链接的字符串列表。
Visual Basic
// Iterate through all the slide parts in the presentation part.
foreach (SlidePart slidePart in document.PresentationPart.SlideParts)
IEnumerable<Drawing.HyperlinkType> links = slidePart.Slide.Descendants<Drawing.HyperlinkType>();
// Iterate through all the links in the slide part.
foreach (Drawing.HyperlinkType link in links)
// Iterate through all the external relationships in the slide part.
foreach (HyperlinkRelationship relation in slidePart.HyperlinkRelationships)
// If the relationship ID matches the link ID…
if (relation.Id.Equals(link.Id))
// Add the URI of the external relationship to the list of strings.
ret.Add(relation.Uri.AbsoluteUri);
' Iterate through all the slide parts in the presentation part.
For Each slidePart As SlidePart In document.PresentationPart.SlideParts
Dim links As IEnumerable(Of Drawing.HyperlinkType) = slidePart.Slide.Descendants(Of Drawing.HyperlinkType)()
' Iterate through all the links in the slide part.
For Each link As Drawing.HyperlinkType In links
' Iterate through all the external relationships in the slide part.
For Each relation As HyperlinkRelationship In slidePart.HyperlinkRelationships
' If the relationship ID matches the link ID…
If relation.Id.Equals(link.Id) Then
' Add the URI of the external relationship to the list of strings.
ret.Add(relation.Uri.AbsoluteUri)
End If
string fileName = @"C:\Users\Public\Documents\Myppt7.pptx";
foreach (string s in GetAllExternalHyperlinksInPresentation(fileName))
Console.WriteLine(s);
Dim fileName As String
fileName = "C:\Users\Public\Documents\Myppt7.pptx"
For Each s As String In GetAllExternalHyperlinksInPresentation(fileName)
Console.WriteLine(s)
using System;
using System.Collections.Generic;
using Drawing = DocumentFormat.OpenXml.Drawing;
GetAllExternalHyperlinksInPresentation(args[0]);
// Returns all the external hyperlinks in the slides of a presentation.
static IEnumerable<String> GetAllExternalHyperlinksInPresentation(string fileName)
// Declare a list of strings.
List<string> ret = new List<string>();
// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, false))
// If there is no PresentationPart then there are no hyperlinks
if (document.PresentationPart is null)
return ret;
// Iterate through all the slide parts in the presentation part.
foreach (SlidePart slidePart in document.PresentationPart.SlideParts)
IEnumerable<Drawing.HyperlinkType> links = slidePart.Slide.Descendants<Drawing.HyperlinkType>();
// Iterate through all the links in the slide part.
foreach (Drawing.HyperlinkType link in links)
// Iterate through all the external relationships in the slide part.
foreach (HyperlinkRelationship relation in slidePart.HyperlinkRelationships)
// If the relationship ID matches the link ID…
if (relation.Id.Equals(link.Id))
// Add the URI of the external relationship to the list of strings.
ret.Add(relation.Uri.AbsoluteUri);
// Return the list of strings.
return ret;
Imports DocumentFormat.OpenXml.Packaging
Imports Drawing = DocumentFormat.OpenXml.Drawing
Module MyModule
Sub Main(args As String())
End Sub
' Returns all the external hyperlinks in the slides of a presentation.
Public Function GetAllExternalHyperlinksInPresentation(ByVal fileName As String) As IEnumerable
' Declare a list of strings.
Dim ret As List(Of String) = New List(Of String)
' Open the presentation file as read-only.
Dim document As PresentationDocument = PresentationDocument.Open(fileName, False)
Using (document)
' Iterate through all the slide parts in the presentation part.
For Each slidePart As SlidePart In document.PresentationPart.SlideParts
Dim links As IEnumerable = slidePart.Slide.Descendants(Of Drawing.HyperlinkType)()
' Iterate through all the links in the slide part.
For Each link As Drawing.HyperlinkType In links
' Iterate through all the external relationships in the slide part.
For Each relation As HyperlinkRelationship In slidePart.HyperlinkRelationships
' If the relationship ID matches the link ID…
If relation.Id.Equals(link.Id) Then
' Add the URI of the external relationship to the list of strings.
ret.Add(relation.Uri.AbsoluteUri)
End If
' Return the list of strings.
Return ret
End Using
End Function
End Module
Open XML SDK 类库参考