Share via


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

Slide

Präsentationsfolie. Das SlidePart-Stammelement.

sldLayout

SlideLayout

Das Folienlayout. Das SlideLayoutPart-Stammelement.

sldMaster

SlideMaster

Der Folienmaster. Das SlideMasterPart-Stammelement.

notesMaster

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

Siehe auch

Referenz

Class Library Reference