Akzeptieren aller Überarbeitungen in einem Textverarbeitungsdokument
In diesem Thema wird gezeigt, wie Sie das Open XML SDK für Office verwenden, um alle Revisionen in einem Textverarbeitungsdokument programmgesteuert zu akzeptieren.
Struktur eines WordProcessingML-Dokuments
Die grundlegende Struktur eines WordProcessingML-Dokuments besteht aus den document- und body-Elementen, gefolgt von einem oder mehreren Block-Level-Elementen wie p, das für einen Absatz steht. Ein Absatz enthält ein oder mehrere r-Elemente. r steht für ausführen und meint einen Textbereich mit gemeinsamen Eigenschaften wie Formatierung. Eine Ausführung besteht aus einem oder mehreren t-Elementen. Das t-Element enthält einen Textbereich. Das folgende Codebeispiel zeigt das WordprocessingML-Markup für ein Dokument, das den Text "Beispieltext" enthält.
<w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
Mit dem Open XML SDK können Sie Dokumentstrukturen und -inhalte mit stark typisierten Klassen erstellen, die WordprocessingML-Elementen entsprechen. Diese Klassen sind im DocumentFormat.OpenXml.Wordprocessing -Namespace enthalten. Die folgende Tabelle enthält die Namen der Klassen, die den Elementen document, body, p, r und t entsprechen.
WordprocessingML-Element | Open XML SDK-Klasse | Beschreibung |
---|---|---|
document | Document | Das Stammelement des Hauptdokumentteils. |
Text | Body | Der Container für die Strukturen auf Blockebene, z. B. Absätze, Tabellen, Anmerkungen und andere, die in der Spezifikation ISO/IEC 29500 angegeben sind. |
p | Paragraph | Ein Absatz. |
r | Run | Ein Lauf. |
t | Text | Ein Textbereich. |
Weitere Informationen zur Gesamtstruktur der Teile und Elemente eines WordprocessingML-Dokuments finden Sie unter Struktur eines WordprocessingML-Dokuments.
Die grundlegende Struktur eines WordProcessingML-Dokuments besteht aus den document- und body-Elementen, gefolgt von einem oder mehreren Block-Level-Elementen wie p, das für einen Absatz steht. Ein Absatz enthält ein oder mehrere r-Elemente. r steht für ausführen und meint einen Textbereich mit gemeinsamen Eigenschaften wie Formatierung. Eine Ausführung besteht aus einem oder mehreren t-Elementen. Das t-Element enthält einen Textbereich. Das folgende Codebeispiel zeigt das WordprocessingML-Markup für ein Dokument, das den Text "Beispieltext" enthält.
<w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
Mit dem Open XML SDK können Sie Dokumentstrukturen und -inhalte mit stark typisierten Klassen erstellen, die WordprocessingML-Elementen entsprechen. Diese Klassen sind im DocumentFormat.OpenXml.Wordprocessing -Namespace enthalten. Die folgende Tabelle enthält die Namen der Klassen, die den Elementen document, body, p, r und t entsprechen.
WordprocessingML-Element | Open XML SDK-Klasse | Beschreibung |
---|---|---|
document | Document | Das Stammelement des Hauptdokumentteils. |
Text | Body | Der Container für die Strukturen auf Blockebene, z. B. Absätze, Tabellen, Anmerkungen und andere, die in der Spezifikation ISO/IEC 29500 angegeben sind. |
p | Paragraph | Ein Absatz. |
r | Run | Ein Lauf. |
t | Text | Ein Textbereich. |
ParagraphPropertiesChange-Element
Wenn Sie eine Überarbeitungsmarkierung akzeptieren, ändern Sie die Eigenschaften eines Absatzes, indem Sie entweder einen vorhandenen Text löschen oder einen neuen Text einfügen. In den folgenden Abschnitten erfahren Sie mehr über drei Elemente, die im Code zum Ändern des Absatzinhalts verwendet werden, hauptsächlich <w: pPrChange\>
(Revisionsinformationen für Absatzeigenschaften), <w:del>
(Gelöschter Absatz) und <w:ins>
(Eingefügte Tabellenzeile).
Die folgenden Informationen aus der SPEZIFIKATION ISO/IEC 29500 stellen das ParagraphPropertiesChange-Element (pPrChange) vor.
*pPrChange (Revisionsinformationen für Absatzeigenschaften)
Dieses Element gibt die Details zu einer einzelnen Überarbeitung einer Gruppe von Absatzeigenschaften in einem WordprocessingML-Dokument an.
Diese Überarbeitung wird vom Element wie folgt gespeichert:
Das untergeordnete Element dieses Elements enthält die vollständige Gruppe von Absatzeigenschaften, die vor der Überarbeitung auf diesen Absatz angewendet wurde.
Die Attribute dieses Elements enthalten Informationen darüber, wann diese Revision stattgefunden hat (d. h. wann diese Eigenschaften zu einem "früheren" Satz von Absatzeigenschaften wurden).
Betrachten Sie einen Absatz in einem WordprocessingML-Dokument, der zentriert ist, und diese Änderung in den Absatzeigenschaften wird als Revision nachverfolgt. Diese Revision wird mithilfe des folgenden WordprocessingML-Markups angegeben.
<w:pPr>
<w:jc w:val="center"/>
<w:pPrChange w:id="0" w:date="01-01-2006T12:00:00" w:author="Samantha Smith">
<w:pPr/>
</w:pPrChange>
</w:pPr>
Das Element gibt an, dass eine Überarbeitung an den Absatzeigenschaften am 01.01.2006 von Samantha Smith vorgenommen wurde, und die vorherige Gruppe von Absatzeigenschaften im Absatz war leer (mit anderen Worten, unter dem Element waren keine Absatzeigenschaften explizit vorhanden). pPrpPrChange
© ISO/IEC29500: 2008.
Löschungselement
Mit den folgenden Informationen aus der SPEZIFIKATION ISO/IEC 29500 wird das Deleted-Element (del) eingeführt.
del (Gelöschter Absatz)
Dieses Element gibt an, dass die Absatzmarke, die das Ende eines Absatzes innerhalb eines WordprocessingML-Dokuments angibt, als Teil einer nachverfolgten Überarbeitung als gelöscht behandelt werden soll (mit anderen Worten, der Inhalt dieses Absatzes wird nicht mehr durch diese Absatzmarke begrenzt und wird mit dem folgenden Absatz kombiniert, dessen Inhalt jedoch nicht automatisch als gelöscht gekennzeichnet werden soll).
Stellen Sie sich ein Dokument mit zwei Absätzen vor (wobei jeder Absatz durch ein Pilcrow-Zeichen (¶) begrenzt ist):
Wenn das physische Zeichen, das das Ende des ersten Absatzes durchtrennt, gelöscht wird und diese Änderung als Überarbeitung nachverfolgt wird, führt folgendes:
sind Diese Revision wird mithilfe des folgenden WordprocessingML dargestellt:
<w:p>
<w:pPr>
<w:rPr>
<w:del w:id="0" … />
</w:rPr>
</w:pPr>
<w:r>
<w:t>This is paragraph one.</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>This is paragraph two.</w:t>
</w:r>
</w:p>
Das del-Element in den Ausführungseigenschaften der ersten Absatzmarke gibt an, dass diese Absatzmarke gelöscht wurde. Und diese Löschung wurde als Überarbeitung nachverfolgt.
© ISO/IEC29500: 2008.
Einfügungselement
Die folgenden Informationen aus der SPEZIFIKATION ISO/IEC 29500 stellen das Inserted-Element (ins) vor.
ins (Eingefügte Tabellenzeile)
Dieses Element gibt an, dass die übergeordnete Tabellenzeile als eingefügte Zeile behandelt wird, deren Einfügung als Revision nachverfolgt wurde. Diese Einstellung darf keinen Überarbeitungszustand der Tabellenzellen in dieser Zeile oder deren Inhalt (die unabhängig von einer Revision gekennzeichnet werden müssen) implizieren und wirkt sich nur auf die Tabellenzeile selbst aus.
Stellen Sie sich eine Tabelle mit zwei Zeilen und zwei Spalten vor, in der die zweite Zeile mithilfe einer Überarbeitung als eingefügt gekennzeichnet wurde. Diese Anforderung kann mithilfe des folgenden WordprocessingML-Markups angegeben werden:
<w:tbl>
<w:tr>
<w:tc>
<w:p/>
</w:tc>
<w:tc>
<w:p/>
</w:tc>
</w:tr>
<w:tr>
<w:trPr>
<w:ins w:id="0" … />
</w:trPr>
<w:tc>
<w:p/>
</w:tc>
<w:tc>
<w:p/>
</w:tc>
</w:tr>
</w:tbl>
Das ins-Element in den Tabellenzeileneigenschaften für die zweite Tabellenzeile gibt an, dass diese Zeile eingefügt wurde und dass diese Einfügung als Überarbeitung nachverfolgt wurde.
© ISO/IEC29500: 2008.
Beispielcode
Das folgende Codebeispiel zeigt, wie die gesamten Überarbeitungen in einem Textverarbeitungsdokument akzeptiert werden. Zum Ausführen des Programms können Sie den Dateipfad und den Namen des Autors übergeben:
dotnet run -- [filePath] [authorName]
Nachdem Sie das Programm ausgeführt haben, können Sie die Textverarbeitungsdatei öffnen, um sicherzustellen, dass alle Überarbeitungsmarkierungen akzeptiert wurden.
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.Linq;
AcceptAllRevisions(args[0], args[1]);
static void AcceptAllRevisions(string fileName, string authorName)
{
using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(fileName, true))
{
if (wdDoc.MainDocumentPart is null || wdDoc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
Body body = wdDoc.MainDocumentPart.Document.Body;
// Handle the formatting changes.
List<OpenXmlElement> changes = body.Descendants<ParagraphPropertiesChange>()
.Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList();
foreach (OpenXmlElement change in changes)
{
change.Remove();
}
// Handle the deletions.
List<OpenXmlElement> deletions = body
.Descendants<Deleted>()
.Where(c => c.Author is not null && c.Author.Value == authorName)
.Cast<OpenXmlElement>().ToList();
deletions.AddRange(body.Descendants<DeletedRun>()
.Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList());
deletions.AddRange(body.Descendants<DeletedMathControl>()
.Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList());
foreach (OpenXmlElement deletion in deletions)
{
deletion.Remove();
}
// Handle the insertions.
List<OpenXmlElement> insertions =
body.Descendants<Inserted>()
.Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList();
insertions.AddRange(body.Descendants<InsertedRun>()
.Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList());
insertions.AddRange(body.Descendants<InsertedMathControl>()
.Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList());
foreach (OpenXmlElement insertion in insertions)
{
// Found new content.
// Promote them to the same level as node, and then delete the node.
foreach (var run in insertion.Elements<Run>())
{
if (run == insertion.FirstChild)
{
insertion.InsertAfterSelf(new Run(run.OuterXml));
}
else
{
OpenXmlElement nextSibling = insertion.NextSibling()!;
nextSibling.InsertAfterSelf(new Run(run.OuterXml));
}
}
insertion.RemoveAttribute("rsidR", "https://schemas.openxmlformats.org/wordprocessingml/2006/main");
insertion.RemoveAttribute("rsidRPr", "https://schemas.openxmlformats.org/wordprocessingml/2006/main");
insertion.Remove();
}
}
}