Anleitung: Löschen aller Kommentare eines Autors aus allen Folien 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
Die Struktur des Kommentarelements
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 Löschen aller Kommentare eines bestimmten Autors aus einer Präsentation verwenden können.
Die folgenden Assemblydirektiven sind zum Kompilieren des Codes in diesem Thema erforderlich.
using System;
using System.Linq;
using System.Collections.Generic;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Presentation;
using DocumentFormat.OpenXml.Packaging;
Imports System
Imports System.Linq
Imports System.Collections.Generic
Imports DocumentFormat.OpenXml
Imports DocumentFormat.OpenXml.Presentation
Imports DocumentFormat.OpenXml.Packaging
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 Open(String, Boolean)-Methode auf, die einen Dateipfad und als zweiten Parameter einen booleschen Wert verwendet, um anzugeben, dass ein Dokument bearbeitbar ist. Zum Öffnen eines Dokuments mit Lese-/Schreibzugriff geben Sie den Wert true für diesen Parameter an (siehe die folgende using-Anweisung). In diesem Code ist der fileName-Parameter eine Zeichenfolge, die den Pfad der Datei darstellt, in dem Sie das Dokument öffnen möchten, und der Autor ist der Benutzername, der in PowerPoint-Optionen auf der Registerkarte Allgemein angezeigt wird.
public static void DeleteCommentsByAuthorInPresentation(string fileName, string author)
{
using (PresentationDocument doc = PresentationDocument.Open(fileName, true))
{
// Insert other code here.
}
Public Shared Sub DeleteCommentsByAuthorInPresentation(ByVal fileName As String, ByVal author As String)
Using doc As PresentationDocument = PresentationDocument.Open(fileName, True)
' 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 doc.
Grundlegende Präsentationsdokumentstruktur
Die grundlegende Dokumentstruktur eines PresentationML-Dokuments besteht aus dem Hauptteil, der die Präsentationsdefinition enthält. Im folgenden Text aus der Spezifikation ISO/IEC 29500 wird die Gesamtstruktur eines PresentationML-Pakets eingeführt.
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 Handzettelmaster-Liste 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. Der Handzettelmaster beschreibt das Aussehen eines Handzettels.
Ein Handzettel ist ein gedruckter Foliensatz, der an das Publikum 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 an die Person, die die Präsentationsfolien verwaltet, gerichtete Anmerkung. Eine Notiz ist eine Erinnerung oder eine kurze Textstelle, die für den Präsentator oder das Publikum bestimmt ist.)
Andere Features, die ein PresentationML-Dokument enthalten kann, sind Animationen, Audio, Video und Übergänge 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.
Das folgende XML-Codesegment stellt eine Präsentation dar, die zwei Folien mit den ID-Nummern 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>
Mithilfe des 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. |
Die Struktur des Kommentarelements
Im folgenden Text aus der Spezifikation ISO/IEC 29500 werden Kommentare in einem PresentationML-Paket eingeführt.
Ein Kommentar ist eine an eine Folie angefügte Textnotiz und hat den Hauptzweck, den Lesern der Präsentation die Möglichkeit zu bieten, dem Autor der Präsentation Feedback zu geben. Jeder Kommentar besteht aus einer unformatierten Textzeichenfolge sowie Informationen zum Autor und ist an eine bestimmte Stelle auf einer Folie angefügt. Kommentare können beim Bearbeiten der Präsentation sichtbar sind, werden jedoch beim Halten der Bildschirmpräsentation nicht angezeigt. Die anzeigende Anwendung bestimmt, wann Kommentare angezeigt werden sollen, und deren visuelle Darstellung.
© ISO/IEC29500: 2008.
Das folgende XML-Element gibt einen einzelnen an eine Folie angefügten Kommentar an. Es enthält den Text des Kommentars (text), seine Position auf der Folie (pos) und Attribute, die auf den Autor (authorId), Datum und Uhrzeit (dt) und den Kommentarindex (idx) verweisen.
<p:cm authorId="0" dt="2006-08-28T17:26:44.129" idx="1">
<p:pos x="10" y="10"/>
<p:text>Add diagram to clarify.</p:text>
</p:cm>
In der folgenden Tabelle sind die Definitionen der Member und Attribute des cm-Kommentarelements aufgeführt.
Member/Attribut |
Definition |
---|---|
authorId |
Verweist auf die ID eines Autors in der Kommentarautorenliste des Dokuments. |
dt |
Datum und Uhrzeit der letzten Änderung dieses Kommentars. |
idx |
Eine Kennung dieses Kommentars, die in einer Liste aller Kommentare dieses Autors in diesem Dokument eindeutig ist. Der erste Kommentar eines Autors in einem Dokument hat den Index 1. |
pos |
Die Positionierungsinformationen zum Platzieren eines Kommentars auf einer Folienoberfläche. |
text |
Der Textinhalt des Kommentars. |
extLst |
Gibt die Erweiterungsliste mit Modifikationsmöglichkeit an, in der alle künftigen Erweiterungen des Elementtyps ext definiert werden. Die Erweiterung wird gemeinsam mit den entsprechenden künftigen Erweiterungen genutzt, um die Speicherfähigkeiten des PresentationML-Frameworks zu vergrößern. Dadurch können verschiedene neue Arten von Daten systeminhärent im Framework gespeichert werden. |
Das folgende XML-Schemabeispiel definiert die Member des cm-Elements zusätzlich zu den erforderlichen und optionalen Attributen.
<complexType name="CT_Comment">
<sequence>
<element name="pos" type="a:CT_Point2D" minOccurs="1" maxOccurs="1"/>
<element name="text" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/>
</sequence>
<attribute name="authorId" type="xsd:unsignedInt" use="required"/>
<attribute name="dt" type="xsd:dateTime" use="optional"/>
<attribute name="idx" type="ST_Index" use="required"/>
</complexType>
Funktionsweise des Beispielcodes
Nach Öffnen des Präsentationsdokuments mit Lese-/Schreibzugriff und Instanziieren der PresentationDocument-Klasse ruft der Code den angegebenen Kommentarautor aus der Liste der Kommentarautoren ab.
// Get the specifed comment author.
IEnumerable<CommentAuthor> commentAuthors =
doc.PresentationPart.CommentAuthorsPart.CommentAuthorList.Elements<CommentAuthor>()
.Where(e => e.Name.Value.Equals(author));
' Get the specifed comment author.
Dim commentAuthors As IEnumerable(Of CommentAuthor) = _
doc.PresentationPart.CommentAuthorsPart.CommentAuthorList.Elements _
(Of CommentAuthor)().Where(Function(e) e.Name.Value.Equals(author))
Indem die übereinstimmenden Autoren und alle Folien der Präsentation durchlaufen werden, ruft der Code alle Folienteile sowie den Kommentarteil jedes Folienteils ab. Anschließend ruft der Code die Liste der Kommentare des angegebenen Autors ab und löscht jeden einzelnen. Zudem wird überprüft, ob der Kommentarteil keinen Kommentar enthält. In diesem Fall wird der Teil gelöscht. Außerdem wird der Kommentarautor aus dem Kommentarautorenteil gelöscht.
// Iterate through all the matching authors.
foreach (CommentAuthor commentAuthor in commentAuthors)
{
UInt32Value authorId = commentAuthor.Id;
// Iterate through all the slides and get the slide parts.
foreach (SlidePart slide in doc.PresentationPart.SlideParts)
{
SlideCommentsPart slideCommentsPart = slide.SlideCommentsPart;
// Get the list of comments.
if (slideCommentsPart != null && slide.SlideCommentsPart.CommentList != null)
{
IEnumerable<Comment> commentList =
slideCommentsPart.CommentList.Elements<Comment>().Where(e => e.AuthorId == authorId.Value);
List<Comment> comments = new List<Comment>();
comments = commentList.ToList<Comment>();
foreach (Comment comm in comments)
{
// Delete all the comments by the specified author.
slideCommentsPart.CommentList.RemoveChild<Comment>(comm);
}
// If the commentPart has no existing comment.
if (slideCommentsPart.CommentList.ChildElements.Count == 0)
// Delete this part.
slide.DeletePart(slideCommentsPart);
}
}
// Delete the comment author from the comment authors part.
doc.PresentationPart.CommentAuthorsPart.CommentAuthorList.RemoveChild<CommentAuthor>(commentAuthor);
}
'Iterate through all the matching authors
For Each commentAuthor In commentAuthors
Dim authorId = commentAuthor.Id
' Iterate through all the slides and get the slide parts.
For Each slide In doc.PresentationPart.GetPartsOfType(Of SlidePart)()
' Get the slide comments part of each slide.
For Each slideCommentsPart In slide.GetPartsOfType(Of SlideCommentsPart)()
' Delete all the comments by the specified author.
Dim commentList = slideCommentsPart.CommentList.Elements(Of Comment)(). _
Where(Function(e) e.AuthorId.Value.Equals(authorId.Value))
Dim comments As List(Of Comment) = commentList.ToList()
For Each comm As Comment In comments
slideCommentsPart.CommentList.RemoveChild(Of Comment)(comm)
Next
Next
Next
' Delete the comment author from the comment authors part.
doc.PresentationPart.CommentAuthorsPart.CommentAuthorList.RemoveChild(Of CommentAuthor)(commentAuthor)
Next
Beispielcode
Die folgende Methode verwendet als Parameter den Namen und Pfad der Quellpräsentationsdatei sowie den Namen des Autors, dessen Kommentare gelöscht werden sollen. Sie findet alle Kommentare des angegebenen Autors in der Präsentation und löscht diese. Anschließend löscht sie den Kommentarautor aus der Liste der Kommentarautoren.
Mithilfe des folgenden Beispiels können Sie die DeleteCommentsByAuthorInPresentation-Methode zum Entfernen der Kommentare des angegebenen Autors aus der Präsentationsdatei, myppt5.pptx aufrufen.
string fileName = @"C:\Users\Public\Documents\myppt5.pptx";
string author = "Katie Jordan";
DeleteCommentsByAuthorInPresentation(fileName, author);
Dim fileName As String = "C:\Users\Public\Documents\myppt5.pptx"
Dim author As String = "Katie Jordan"
DeleteCommentsByAuthorInPresentation(fileName, author)
Hinweis
Öffnen Sie zum Abrufen des exakten Namen des Autors die Präsentationsdatei, klicken Sie auf den Menüpunkt Datei und dann auf Optionen. Das Fenster PowerPoint-Optionen wird geöffnet, und der Inhalt der Registerkarte Allgemein wird angezeigt. Der Name des Autors muss dem Eintrag für Benutzername auf dieser Registerkarte entsprechen.
Nachstehend ist der vollständige Beispielcode in C# und Visual Basic aufgeführt.
// Remove all the comments in the slides by a certain author.
public static void DeleteCommentsByAuthorInPresentation(string fileName, string author)
{
if (String.IsNullOrEmpty(fileName) || String.IsNullOrEmpty(author))
throw new ArgumentNullException("File name or author name is NULL!");
using (PresentationDocument doc = PresentationDocument.Open(fileName, true))
{
// Get the specifed comment author.
IEnumerable<CommentAuthor> commentAuthors =
doc.PresentationPart.CommentAuthorsPart.CommentAuthorList.Elements<CommentAuthor>()
.Where(e => e.Name.Value.Equals(author));
// Iterate through all the matching authors.
foreach (CommentAuthor commentAuthor in commentAuthors)
{
UInt32Value authorId = commentAuthor.Id;
// Iterate through all the slides and get the slide parts.
foreach (SlidePart slide in doc.PresentationPart.SlideParts)
{
SlideCommentsPart slideCommentsPart = slide.SlideCommentsPart;
// Get the list of comments.
if (slideCommentsPart != null && slide.SlideCommentsPart.CommentList != null)
{
IEnumerable<Comment> commentList =
slideCommentsPart.CommentList.Elements<Comment>().Where(e => e.AuthorId == authorId.Value);
List<Comment> comments = new List<Comment>();
comments = commentList.ToList<Comment>();
foreach (Comment comm in comments)
{
// Delete all the comments by the specified author.
slideCommentsPart.CommentList.RemoveChild<Comment>(comm);
}
// If the commentPart has no existing comment.
if (slideCommentsPart.CommentList.ChildElements.Count == 0)
// Delete this part.
slide.DeletePart(slideCommentsPart);
}
}
// Delete the comment author from the comment authors part.
doc.PresentationPart.CommentAuthorsPart.CommentAuthorList.RemoveChild<CommentAuthor>(commentAuthor);
}
}
}
' Remove all the comments in the slides by a certain author.
Public Sub DeleteCommentsByAuthorInPresentation(ByVal fileName As String, ByVal author As String)
Dim doc As PresentationDocument = PresentationDocument.Open(fileName, True)
If (String.IsNullOrEmpty(fileName) Or String.IsNullOrEmpty(author)) Then
Throw New ArgumentNullException("File name or author name is NULL!")
End If
Using (doc)
' Get the specifed comment author.
Dim commentAuthors = doc.PresentationPart.CommentAuthorsPart. _
CommentAuthorList.Elements(Of CommentAuthor)().Where(Function(e) _
e.Name.Value.Equals(author))
' Dim changed As Boolean = False
For Each commentAuthor In commentAuthors
Dim authorId = commentAuthor.Id
' Iterate through all the slides and get the slide parts.
For Each slide In doc.PresentationPart.GetPartsOfType(Of SlidePart)()
' Get the slide comments part of each slide.
For Each slideCommentsPart In slide.GetPartsOfType(Of SlideCommentsPart)()
' Delete all the comments by the specified author.
Dim commentList = slideCommentsPart.CommentList.Elements(Of Comment)(). _
Where(Function(e) e.AuthorId.Value.Equals(authorId.Value))
Dim comments As List(Of Comment) = commentList.ToList()
For Each comm As Comment In comments
slideCommentsPart.CommentList.RemoveChild(Of Comment)(comm)
Next
Next
Next
' Delete the comment author from the comment authors part.
doc.PresentationPart.CommentAuthorsPart.CommentAuthorList.RemoveChild(Of CommentAuthor)(commentAuthor)
Next
End Using
End Sub