Anleitung: Abrufen der Titel aller Folien in einer Präsentation
Letzte Änderung: Donnerstag, 14. Oktober 2010
Gilt für: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
Inhalt dieses Artikels
Abrufen eines PresentationDocument-Objekts
Grundlegende Präsentationsdokumentstruktur
Funktionsweise des Beispielcodes
Beispielcode
In diesem Thema wird erklärt, wie Sie die Klassen im Open XML SDK 2.0 für Microsoft Office zum programmgesteuerten Abrufen der Titel aller Folien in einer Präsentation verwenden.
Die folgenden Assemblydirektiven sind zum Kompilieren des Codes in diesem Thema erforderlich.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using D = DocumentFormat.OpenXml.Drawing;
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Presentation
Imports D = DocumentFormat.OpenXml.Drawing
Abrufen eines PresentationDocument-Objekts
Im Open XML SDK stellt die PresentationDocument-Klasse ein Präsentationsdokumentpaket dar. Zum Arbeiten mit einem Präsentationsdokument müssen Sie zuerst eine Instanz der PresentationDocument-Klasse erstellen und anschließend mit dieser Instanz arbeiten. Rufen Sie zum Erstellen der Klasseninstanz anhand des Dokuments die PresentationDocument.Open(String, Boolean)-Methode auf, die einen Dateipfad und als zweiten Parameter einen booleschen Wert verwendet, um anzugeben, ob ein Dokument bearbeitet werden kann. Zum Öffnen eines Dokuments mit Schreibschutz geben Sie den Wert false für diesen Parameter an (siehe die folgende using-Anweisung). In diesem Code ist der presentationFile-Parameter eine Zeichenfolge, die den Pfad der Datei darstellt, aus der Sie das Dokument öffnen möchten.
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
// Insert other code here.
}
' Open the presentation as read-only.
Using presentationDocument As PresentationDocument = PresentationDocument.Open(presentationFile, False)
' Insert other code here.
End Using
Die using-Anweisung ist eine empfohlene Alternative zur herkömmlichen Reihenfolge ".Open, .Save, .Close". Sie stellt sicher, dass die Dispose-Methode (vom Open XML SDK verwendete interne Methode zum Bereinigen von Ressourcen) bei Erreichen der schließenden Klammer automatisch aufgerufen wird. Der auf die using-Anweisung folgende Block richtet einen Bereich für das Objekt ein, das in der using-Anweisung erstellt oder benannt wird, in diesem Fall presentationDocument.
Grundlegende Präsentationsdokumentstruktur
Die grundlegende Dokumentstruktur eines PresentationML-Dokuments besteht aus dem Hauptteil, der die Präsentationsdefinition enthält. In dem folgenden Text aus der ISO/IEC 29500-Spezifikation wird das Gesamtformat eines PresentationML-Pakets erläutert.
Der Hauptteil eines PresentationML-Pakets beginnt mit dem Stammelement der Präsentation. Dieses Element enthält eine Präsentation, die wiederum auf eine Folienliste, eine Folienmasterliste, eine Notizenmasterliste und eine Handzettelmasterliste verweist. Die Folienliste verweist auf alle Folien in der Präsentation. Die Folienmasterliste verweist auf sämtliche in der Präsentation verwendeten Folienmaster. Der Notizenmaster enthält Informationen zur Formatierung der Notizenseiten. Und der Handzettelmaster beschreibt das Aussehen eines Handzettels.
Ein Handzettel ist ein gedruckter Foliensatz, der an eine Zielgruppe zur späteren Bezugnahme verteilt werden kann.
Neben Text und Grafiken kann jede Folie Kommentare und Notizen enthalten, ein Layout aufweisen und Teil mindestens einer zielgruppenorientierten Präsentation sein. Ein Kommentar ist eine Anmerkung der Person, die die Foliengruppe der Präsentation verwaltet. Eine Notiz ist eine Erinnerung oder eine kurze Textstelle, die für den Präsentator oder die Zielgruppe bestimmt ist.
Andere Features, die in einem PresentationML-Dokument enthalten sein können, sind Animationen, Audio, Video und Überblendungen zwischen den Folien.
Ein PresentationML-Dokument wird nicht als ein großer Textkörper in einem einzelnen Teil gespeichert. Die Elemente, mit deren Hilfe bestimmte Funktionsgruppierungen erfolgen, sind stattdessen in mehreren Teilen gespeichert. Beispielsweise sind alle Kommentare in einem Dokument in einem Kommentarteil gespeichert, wobei jede Folie über einen eigenen Teil verfügt.
© ISO/IEC29500: 2008.
Dieses XML-Codesegment stellt eine Präsentation dar, die zwei Folien mit den IDs 267 und 256 enthält.
<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>
Mit dem Open XML SDK 2.0 können Sie eine Dokumentstruktur und Inhalte erstellen, indem Sie stark typisierte Klassen verwenden, die PresentationML-Elementen entsprechen. Diese Klassen sind im DocumentFormat.OpenXml.Presentation-Namespace enthalten. Die folgende Tabelle enthält die Namen der Klassen, die den Elementen sld, sldLayout, sldMaster und notesMaster entsprechen.
PresentationML-Element |
Open XML SDK 2.0-Klasse |
Beschreibung |
---|---|---|
sld |
Präsentationsfolie. Das SlidePart-Stammelement. |
|
sldLayout |
Das Folienlayout. Das SlideLayoutPart-Stammelement. |
|
sldMaster |
Der Folienmaster. Das SlideMasterPart-Stammelement. |
|
notesMaster |
Notizenmaster (oder Handzettelmaster). Das NotesMasterPart-Stammelement. |
Funktionsweise des Beispielcodes
Der Beispielcode besteht aus zwei Überladungen der GetSlideTitles-Methode. In der ersten überladenen Methode wird die Präsentationsdatei in der using-Anweisung geöffnet. Dann wird das PresentationDocument-Objekt an die zweite überladene GetSlideTitles-Methode übergeben, von der eine Liste zurückgegeben wird, die die Titel aller Folien in der Präsentation darstellt.
// Get a list of the titles of all the slides in the presentation.
public static IList<string> GetSlideTitles(string presentationFile)
{
// Open the presentation as read-only.
using (PresentationDocument presentationDocument =
PresentationDocument.Open(presentationFile, false))
{
return GetSlideTitles(presentationDocument);
}
}
' Get a list of the titles of all the slides in the presentation.
Public Shared Function GetSlideTitles(ByVal presentationFile As String) As IList(Of String)
' Open the presentation as read-only.
Using presentationDocument As PresentationDocument = PresentationDocument.Open(presentationFile, False)
Return GetSlideTitles(presentationDocument)
End Using
End Function
Die zweite überladene GetSlideTitles-Methode wird zum Abrufen einer Liste mit Folientiteln verwendet. Sie verwendet das übergebene PresentationDocument-Objekt, durchläuft alle darin enthaltenen Folien und ruft die Folien-IDs aller Folien in der Präsentation ab. Für jede Folien-ID ruft die Methode einen Folienteil ab, der an die GetSlideTitle-Methode übergeben wird. An die erste GetSlideTitles-Methode wird eine Liste der Zeichenfolgen zurückgegeben, die anhand der Titel zusammengesetzt wird. Jede Zeichenfolge stellt einen Folientitel dar.
// Get a list of the titles of all the slides in the presentation.
public static IList<string> GetSlideTitles(PresentationDocument presentationDocument)
{
if (presentationDocument == null)
{
throw new ArgumentNullException("presentationDocument");
}
// Get a PresentationPart object from the PresentationDocument object.
PresentationPart presentationPart = presentationDocument.PresentationPart;
if (presentationPart != null &&
presentationPart.Presentation != null)
{
// Get a Presentation object from the PresentationPart object.
Presentation presentation = presentationPart.Presentation;
if (presentation.SlideIdList != null)
{
List<string> titlesList = new List<string>();
// Get the title of each slide in the slide order.
foreach (var slideId in presentation.SlideIdList.Elements<SlideId>())
{
SlidePart slidePart = presentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
// Get the slide title.
string title = GetSlideTitle(slidePart);
// An empty title can also be added.
titlesList.Add(title);
}
return titlesList;
}
}
return null;
}
' Get a list of the titles of all the slides in the presentation.
Public Shared Function GetSlideTitles(ByVal presentationDocument As PresentationDocument) As IList(Of String)
If presentationDocument Is Nothing Then
Throw New ArgumentNullException("presentationDocument")
End If
' Get a PresentationPart object from the PresentationDocument object.
Dim presentationPart As PresentationPart = presentationDocument.PresentationPart
If presentationPart IsNot Nothing AndAlso presentationPart.Presentation IsNot Nothing Then
' Get a Presentation object from the PresentationPart object.
Dim presentation As Presentation = presentationPart.Presentation
If presentation.SlideIdList IsNot Nothing Then
Dim titlesList As New List(Of String)()
' Get the title of each slide in the slide order.
For Each slideId In presentation.SlideIdList.Elements(Of SlideId)()
Dim slidePart As SlidePart = TryCast(presentationPart.GetPartById(slideId.RelationshipId), SlidePart)
' Get the slide title.
Dim title As String = GetSlideTitle(slidePart)
' An empty title can also be added.
titlesList.Add(title)
Next slideId
Return titlesList
End If
End If
Return Nothing
End Function
Die GetSlideTitle-Methode wird zum Abrufen des Titels jeder Folie verwendet. Sie verwendet den übergebenen Folienteil und gibt an die zweite überladene GetSlideTitles-Methode eine Zeichenfolge zurück, die den Titel der Folie darstellt.
// Get the title string of the slide.
public static string GetSlideTitle(SlidePart slidePart)
{
if (slidePart == null)
{
throw new ArgumentNullException("presentationDocument");
}
// Declare a paragraph separator.
string paragraphSeparator = null;
if (slidePart.Slide != null)
{
// Find all the title shapes.
var shapes = from shape in slidePart.Slide.Descendants<Shape>()
where IsTitleShape(shape)
select shape;
StringBuilder paragraphText = new StringBuilder();
foreach (var shape in shapes)
{
// Get the text in each paragraph in this shape.
foreach (var paragraph in shape.TextBody.Descendants<D.Paragraph>())
{
// Add a line break.
paragraphText.Append(paragraphSeparator);
foreach (var text in paragraph.Descendants<D.Text>())
{
paragraphText.Append(text.Text);
}
paragraphSeparator = "\n";
}
}
return paragraphText.ToString();
}
return string.Empty;
}
' Get the title string of the slide.
Public Shared Function GetSlideTitle(ByVal slidePart As SlidePart) As String
If slidePart Is Nothing Then
Throw New ArgumentNullException("presentationDocument")
End If
' Declare a paragraph separator.
Dim paragraphSeparator As String = Nothing
If slidePart.Slide IsNot Nothing Then
' Find all the title shapes.
Dim shapes = From shape In slidePart.Slide.Descendants(Of Shape)()
Where IsTitleShape(shape)
Select shape
Dim paragraphText As New StringBuilder()
For Each shape In shapes
' Get the text in each paragraph in this shape.
For Each paragraph In shape.TextBody.Descendants(Of D.Paragraph)()
' Add a line break.
paragraphText.Append(paragraphSeparator)
For Each text In paragraph.Descendants(Of D.Text)()
paragraphText.Append(text.Text)
Next text
paragraphSeparator = vbLf
Next paragraph
Next shape
Return paragraphText.ToString()
End If
Return String.Empty
End Function
Die boolesche Methode IsTitleShape wird innerhalb der GetSlideTitle-Methode aufgerufen, um zu bestimmen, ob es sich bei der Form um eine Titelform handelt. Sie übernimmt den übergebenen Folienteil und gibt true zurück, wenn es sich um eine Titelform handelt. Andernfalls wird false zurückgegeben.
// Determines whether the shape is a title shape.
private static bool IsTitleShape(Shape shape)
{
var placeholderShape = shape.NonVisualShapeProperties.ApplicationNonVisualDrawingProperties.GetFirstChild<PlaceholderShape>();
if (placeholderShape != null && placeholderShape.Type != null && placeholderShape.Type.HasValue)
{
switch ((PlaceholderValues)placeholderShape.Type)
{
// Any title shape.
case PlaceholderValues.Title:
// A centered title.
case PlaceholderValues.CenteredTitle:
return true;
default:
return false;
}
}
return false;
}
' Determines whether the shape is a title shape.
Private Shared Function IsTitleShape(ByVal shape As Shape) As Boolean
Dim placeholderShape = shape.NonVisualShapeProperties.ApplicationNonVisualDrawingProperties.GetFirstChild(Of PlaceholderShape)()
If placeholderShape IsNot Nothing AndAlso placeholderShape.Type IsNot Nothing AndAlso placeholderShape.Type.HasValue Then
Select Case CType(placeholderShape.Type, PlaceholderValues)
' Any title shape.
Case PlaceholderValues.Title, PlaceholderValues.CenteredTitle
' A centered title.
Return True
Case Else
Return False
End Select
End If
Return False
End Function
Beispielcode
Es folgt der vollständige Beispielcode, den Sie zum Abrufen der Titel aller Folien in einer Präsentationsdatei verwenden können. Sie können z. B. die folgende foreach-Anweisung im Programm verwenden, um alle Titel in der Präsentationsdatei Myppt9.pptx zurückzugeben.
foreach (string s in GetSlideTitles(@"C:\Users\Public\Documents\Myppt9.pptx"))
Console.WriteLine(s);
For Each s As String In GetSlideTitles("C:\Users\Public\Documents\Myppt9.pptx")
Console.WriteLine(s)
Next
Das Ergebnis wäre eine Liste der Zeichenfolgen, die die Titel in der Präsentation darstellen, wobei jeder Titel in einer separaten Zeile aufgeführt ist.
Es folgt der vollständige Beispielcode in C# und Visual Basic.
// Get a list of the titles of all the slides in the presentation.
public static IList<string> GetSlideTitles(string presentationFile)
{
// Open the presentation as read-only.
using (PresentationDocument presentationDocument =
PresentationDocument.Open(presentationFile, false))
{
return GetSlideTitles(presentationDocument);
}
}
// Get a list of the titles of all the slides in the presentation.
public static IList<string> GetSlideTitles(PresentationDocument presentationDocument)
{
if (presentationDocument == null)
{
throw new ArgumentNullException("presentationDocument");
}
// Get a PresentationPart object from the PresentationDocument object.
PresentationPart presentationPart = presentationDocument.PresentationPart;
if (presentationPart != null &&
presentationPart.Presentation != null)
{
// Get a Presentation object from the PresentationPart object.
Presentation presentation = presentationPart.Presentation;
if (presentation.SlideIdList != null)
{
List<string> titlesList = new List<string>();
// Get the title of each slide in the slide order.
foreach (var slideId in presentation.SlideIdList.Elements<SlideId>())
{
SlidePart slidePart = presentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
// Get the slide title.
string title = GetSlideTitle(slidePart);
// An empty title can also be added.
titlesList.Add(title);
}
return titlesList;
}
}
return null;
}
// Get the title string of the slide.
public static string GetSlideTitle(SlidePart slidePart)
{
if (slidePart == null)
{
throw new ArgumentNullException("presentationDocument");
}
// Declare a paragraph separator.
string paragraphSeparator = null;
if (slidePart.Slide != null)
{
// Find all the title shapes.
var shapes = from shape in slidePart.Slide.Descendants<Shape>()
where IsTitleShape(shape)
select shape;
StringBuilder paragraphText = new StringBuilder();
foreach (var shape in shapes)
{
// Get the text in each paragraph in this shape.
foreach (var paragraph in shape.TextBody.Descendants<D.Paragraph>())
{
// Add a line break.
paragraphText.Append(paragraphSeparator);
foreach (var text in paragraph.Descendants<D.Text>())
{
paragraphText.Append(text.Text);
}
paragraphSeparator = "\n";
}
}
return paragraphText.ToString();
}
return string.Empty;
}
// Determines whether the shape is a title shape.
private static bool IsTitleShape(Shape shape)
{
var placeholderShape = shape.NonVisualShapeProperties.ApplicationNonVisualDrawingProperties.GetFirstChild<PlaceholderShape>();
if (placeholderShape != null && placeholderShape.Type != null && placeholderShape.Type.HasValue)
{
switch ((PlaceholderValues)placeholderShape.Type)
{
// Any title shape.
case PlaceholderValues.Title:
// A centered title.
case PlaceholderValues.CenteredTitle:
return true;
default:
return false;
}
}
return false;
}
' Get a list of the titles of all the slides in the presentation.
Public Function GetSlideTitles(ByVal presentationFile As String) As IList(Of String)
' Open the presentation as read-only.
Dim presentationDocument As PresentationDocument = presentationDocument.Open(presentationFile, False)
Using (presentationDocument)
Return GetSlideTitles(presentationDocument)
End Using
End Function
' Get a list of the titles of all the slides in the presentation.
Public Function GetSlideTitles(ByVal presentationDocument As PresentationDocument) As IList(Of String)
If (presentationDocument Is Nothing) Then
Throw New ArgumentNullException("presentationDocument")
End If
' Get a PresentationPart object from the PresentationDocument object.
Dim presentationPart As PresentationPart = presentationDocument.PresentationPart
If ((Not (presentationPart) Is Nothing) _
AndAlso (Not (presentationPart.Presentation) Is Nothing)) Then
' Get a Presentation object from the PresentationPart object.
Dim presentation As Presentation = presentationPart.Presentation
If (Not (presentation.SlideIdList) Is Nothing) Then
Dim titlesList As List(Of String) = New List(Of String)
' Get the title of each slide in the slide order.
For Each slideId As Object In presentation.SlideIdList.Elements(Of SlideId)()
Dim slidePart As SlidePart = CType(presentationPart.GetPartById(slideId.RelationshipId.ToString()), SlidePart)
' Get the slide title.
Dim title As String = GetSlideTitle(slidePart)
' An empty title can also be added.
titlesList.Add(title)
Next
Return titlesList
End If
End If
Return Nothing
End Function
' Get the title string of the slide.
Public Function GetSlideTitle(ByVal slidePart As SlidePart) As String
If (slidePart Is Nothing) Then
Throw New ArgumentNullException("presentationDocument")
End If
' Declare a paragraph separator.
Dim paragraphSeparator As String = Nothing
If (Not (slidePart.Slide) Is Nothing) Then
' Find all the title shapes.
Dim shapes = From shape In slidePart.Slide.Descendants(Of Shape)() _
Where (IsTitleShape(shape)) _
Select shape
Dim paragraphText As StringBuilder = New StringBuilder
For Each shape As Object In shapes
' Get the text in each paragraph in this shape.
For Each paragraph As Object In shape.TextBody.Descendants(Of D.Paragraph)()
' Add a line break.
paragraphText.Append(paragraphSeparator)
For Each text As Object In paragraph.Descendants(Of D.Text)()
paragraphText.Append(text.Text)
Next
paragraphSeparator = "" & vbLf
Next
Next
Return paragraphText.ToString
End If
Return String.Empty
End Function
' Determines whether the shape is a title shape.
Private Function IsTitleShape(ByVal shape As Shape) As Boolean
Dim placeholderShape As Object = _
shape.NonVisualShapeProperties.ApplicationNonVisualDrawingProperties.GetFirstChild(Of PlaceholderShape)()
If ((Not (placeholderShape) Is Nothing) _
AndAlso ((Not (placeholderShape.Type) Is Nothing) _
AndAlso placeholderShape.Type.HasValue)) Then
Select Case placeholderShape.Type.Value
' Any title shape
Case PlaceholderValues.Title
Return True
' A centered title.
Case PlaceholderValues.CenteredTitle
Return True
Case Else
Return False
End Select
End If
Return False
End Function