Gewusst wie: Abrufen des gesamten Texts 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 des gesamten Texts aller Folien in einer Präsentation verwenden.
Die folgenden Assemblydirektiven sind zum Kompilieren des Codes in diesem Thema erforderlich.
using System;
using System.Linq;
using System.Collections.Generic;
using DocumentFormat.OpenXml.Presentation;
using A = DocumentFormat.OpenXml.Drawing;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml;
using System.Text;
Imports System
Imports System.Linq
Imports System.Collections.Generic
Imports A = DocumentFormat.OpenXml.Drawing
Imports DocumentFormat.OpenXml.Presentation
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml
Imports System.Text
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 Lese-/Schreibzugriff weisen Sie den Wert true für diesen Parameter zu. Zum Öffnen des Dokuments mit Schreibschutz weisen Sie den Wert false wie in der folgenden using-Anweisung gezeigt zu. 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.
}
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 vielen Teilen, darunter der Hauptteil mit der Präsentationsdefinition. Im 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 eines Dokuments in einem Kommentarteil gespeichert, wobei jede Folie über einen eigenen Teil verfügt.
© ISO/IEC29500: 2008.
Das folgende 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 beginnt mit der Berechnung der Anzahl von Folien in der Präsentation. Dazu werden zwei Überladungen der CountSlides-Methode verwendet. Die erste Überladung verwendet einen Parameter vom Typ string und die zweite einen PresentationDocument-Parameter. Bei der ersten CountSlides-Methode öffnet der Beispielcode das Präsentationsdokument in der using-Anweisung. Dann wird das PresentationDocument-Objekt an die zweite CountSlides-Methode übergeben, die eine ganze Zahl zurückgibt, mit der die Anzahl der Folien in der Präsentation dargestellt wird.
// Pass the presentation to the next CountSlides method
// and return the slide count.
return CountSlides(presentationDocument);
' Pass the presentation to the next CountSlides method
' and return the slide count.
Return CountSlides(presentationDocument)
In der zweiten CountSlides-Methode überprüft der Code, ob das übergebene PresentationDocument-Objekt ungleich null. Falls nicht, wird ein PresentationPart-Objekt aus dem PresentationDocument-Objekt abgerufen. Durch Verwendung der Count-Methode, die zu SlideParts gehört, ruft der Code slidesCount ab, und gibt dieses Element zurück.
// Check for a null document object.
if (presentationDocument == null)
{
throw new ArgumentNullException("presentationDocument");
}
int slidesCount = 0;
// Get the presentation part of document.
PresentationPart presentationPart = presentationDocument.PresentationPart;
// Get the slide count from the SlideParts.
if (presentationPart != null)
{
slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;
' Check for a null document object.
If presentationDocument Is Nothing Then
Throw New ArgumentNullException("presentationDocument")
End If
Dim slidesCount As Integer = 0
' Get the presentation part of document.
Dim presentationPart As PresentationPart = presentationDocument.PresentationPart
' Get the slide count from the SlideParts.
If presentationPart IsNot Nothing Then
slidesCount = presentationPart.SlideParts.Count()
End If
' Return the slide count to the previous method.
Return slidesCount
Nachdem die Anzahl der Folien berechnet wurde, verwendet der Code die GetSlideIdAndText-Methode zum Abrufen des Inhalts aller Folien. Zunächst wird die Beziehungs-ID der ersten Folie abgerufen, und dann wird der Folienteil aus der Beziehungs-ID abgerufen.
// Get the relationship ID of the first slide.
PresentationPart part = ppt.PresentationPart;
OpenXmlElementList slideIds = part.Presentation.SlideIdList.ChildElements;
string relId = (slideIds[index] as SlideId).RelationshipId;
// Get the slide part from the relationship ID.
SlidePart slide = (SlidePart) part.GetPartById(relId);
' Get the relationship ID of the first slide.
Dim part As PresentationPart = ppt.PresentationPart
Dim slideIds As OpenXmlElementList = part.Presentation.SlideIdList.ChildElements
Dim relId As String = TryCast(slideIds(index), SlideId).RelationshipId
' Get the slide part from the relationship ID.
Dim slide As SlidePart = DirectCast(part.GetPartById(relId), SlidePart)
Anschließend deklariert der Code ein StringBuilder-Objekt zum Speichern des inneren Texts der Folie. Dann werden alle Folien durchlaufen und der Text jeder Folie an das StringBuilder-Objekt angefügt.
// Build a StringBuilder object.
StringBuilder paragraphText = new StringBuilder();
// Get the inner text of the slide:
IEnumerable<A.Text> texts = slide.Slide.Descendants<A.Text>();
foreach (A.Text text in texts)
{
paragraphText.Append(text.Text);
}
sldText = paragraphText.ToString();
' Build a StringBuilder object.
Dim paragraphText As New StringBuilder()
' Get the inner text of the slide:
Dim texts As IEnumerable(Of A.Text) = slide.Slide.Descendants(Of A.Text)()
For Each text As A.Text In texts
paragraphText.Append(text.Text)
Next
sldText = paragraphText.ToString()
Beispielcode
Der folgende Code ruft den ganzen Text aller Folien in einer bestimmten Präsentationsdatei ab. Sie können z. B. den Namen der Präsentationsdatei über die Tastatur eingeben und dann eine foreach-Schleife im Programm ausführen, um das Array der Zeichenfolgen abzurufen, das von der GetSlideIdAndText-Methode wie im folgenden Beispiel gezeigt zurückgegeben wird.
Console.Write("Please enter a presentation file name without extension: ");
string fileName = Console.ReadLine();
string file = @"C:\Users\Public\Documents\" + fileName + ".pptx";
int numberOfSlides = CountSlides(file);
System.Console.WriteLine("Number of slides = {0}", numberOfSlides);
string slideText;
for (int i = 0; i < numberOfSlides; i++)
{
GetSlideIdAndText(out slideText, file, i);
System.Console.WriteLine("Slide #{0} contains: {1}", i + 1, slideText);
}
System.Console.ReadKey();
Console.Write("Please enter a presentation file name without extension: ")
Dim fileName As String = System.Console.ReadLine()
Dim file As String = "C:\Users\Public\Documents\" + fileName + ".pptx"
Dim numberOfSlides As Integer = CountSlides(file)
System.Console.WriteLine("Number of slides = {0}", numberOfSlides)
Dim slideText As String = Nothing
For i As Integer = 0 To numberOfSlides - 1
GetSlideIdAndText(slideText, file, i)
System.Console.WriteLine("Slide #{0} contains: {1}", i + 1, slideText)
Next
System.Console.ReadKey()
Es folgt der vollständige Beispielcode in C# und Visual Basic.
public static int CountSlides(string presentationFile)
{
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
// Pass the presentation to the next CountSlides method
// and return the slide count.
return CountSlides(presentationDocument);
}
}
// Count the slides in the presentation.
public static int CountSlides(PresentationDocument presentationDocument)
{
// Check for a null document object.
if (presentationDocument == null)
{
throw new ArgumentNullException("presentationDocument");
}
int slidesCount = 0;
// Get the presentation part of document.
PresentationPart presentationPart = presentationDocument.PresentationPart;
// Get the slide count from the SlideParts.
if (presentationPart != null)
{
slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;
}
public static void GetSlideIdAndText(out string sldText, string docName, int index)
{
using (PresentationDocument ppt = PresentationDocument.Open(docName, false))
{
// Get the relationship ID of the first slide.
PresentationPart part = ppt.PresentationPart;
OpenXmlElementList slideIds = part.Presentation.SlideIdList.ChildElements;
string relId = (slideIds[index] as SlideId).RelationshipId;
// Get the slide part from the relationship ID.
SlidePart slide = (SlidePart) part.GetPartById(relId);
// Build a StringBuilder object.
StringBuilder paragraphText = new StringBuilder();
// Get the inner text of the slide:
IEnumerable<A.Text> texts = slide.Slide.Descendants<A.Text>();
foreach (A.Text text in texts)
{
paragraphText.Append(text.Text);
}
sldText = paragraphText.ToString();
}
}
Public Function CountSlides(ByVal presentationFile As String) As Integer
' Open the presentation as read-only.
Using presentationDocument__1 As PresentationDocument = PresentationDocument.Open(presentationFile, False)
' Pass the presentation to the next CountSlides method
' and return the slide count.
Return CountSlides(presentationDocument__1)
End Using
End Function
' Count the slides in the presentation.
Public Function CountSlides(ByVal presentationDocument As PresentationDocument) As Integer
' Check for a null document object.
If presentationDocument Is Nothing Then
Throw New ArgumentNullException("presentationDocument")
End If
Dim slidesCount As Integer = 0
' Get the presentation part of document.
Dim presentationPart As PresentationPart = presentationDocument.PresentationPart
' Get the slide count from the SlideParts.
If presentationPart IsNot Nothing Then
slidesCount = presentationPart.SlideParts.Count()
End If
' Return the slide count to the previous method.
Return slidesCount
End Function
Public Sub GetSlideIdAndText(ByRef sldText As String, ByVal docName As String, ByVal index As Integer)
Using ppt As PresentationDocument = PresentationDocument.Open(docName, False)
' Get the relationship ID of the first slide.
Dim part As PresentationPart = ppt.PresentationPart
Dim slideIds As OpenXmlElementList = part.Presentation.SlideIdList.ChildElements
Dim relId As String = TryCast(slideIds(index), SlideId).RelationshipId
' Get the slide part from the relationship ID.
Dim slide As SlidePart = DirectCast(part.GetPartById(relId), SlidePart)
' Build a StringBuilder object.
Dim paragraphText As New StringBuilder()
' Get the inner text of the slide:
Dim texts As IEnumerable(Of A.Text) = slide.Slide.Descendants(Of A.Text)()
For Each text As A.Text In texts
paragraphText.Append(text.Text)
Next
sldText = paragraphText.ToString()
End Using
End Sub