Wenn Sie zwei Word‑Dateien vergleichen und der einzige Unterschied darin besteht, wie eine Liste nummeriert ist, zum Beispiel Klauseln, die 1. und 2. waren, jetzt a. und b. sind, oder eine nummerierte Liste zu einer Aufzählungsliste geworden ist, meldet Aspose.Words standardmäßig keine Unterschiede. Dieses Tutorial zeigt Ihnen, wie Sie Nummerierungsänderungen beim Vergleich von Word‑Dateien in Python erkennen können. Es erklärt auch, wie Sie die gefundenen Änderungen überprüfen, akzeptieren oder ablehnen.
Wichtige Erkenntnisse
- Standardmäßig erzeugt eine Änderung des Nummerierungsstils oder des Aufzählungszeichens einer Liste keine Revisionen, wenn Sie Word-Dateien vergleichen.
- Durch das Setzen von
options.advanced_options.compare_list_definitions = Truewird jeder betroffene List‑Absatz alsFORMAT_CHANGE‑Revision gemeldet. - Textänderungen innerhalb von Listenelementen werden in jedem Fall gemeldet. Die Option fügt lediglich Nummerierungs‑ und Aufzählungszeichenänderungen hinzu.
ignore_formatting=Trueblendet Nummerierungsänderungen aus, selbst wenn die Option aktiviert ist.
Warum Nummerierungsänderungen standardmäßig nicht angezeigt werden
Nummerierungen und Aufzählungszeichen in Word stammen aus einer Listendefinition. Sie beschreibt, wie jede Listenebene aussieht: der Nummerierungsstil (1., a., i.), das Aufzählungszeichen und die zugehörige Formatierung. Wenn Sie Dokumente vergleichen, folgt Aspose.Words standardmäßig Microsoft Word und lässt Listendefinitionen aus dem Vergleich aus. Wenn also nur die Nummerierung geändert wurde, erkennt der Vergleich nichts zum Anzeigen.
Die Option compare_list_definitions hat kein Gegenstück in Word. Sie weist Aspose.Words an, Listendefinitionen in den Vergleich einzubeziehen. Hier ist, was wir beim Vergleich von zweielementigen Listen in Version 26.9 gesehen haben:
| Ursprüngliche Liste | Bearbeitete Liste | Option aus | Option an |
|---|---|---|---|
Nummeriert 1. 2. | Aufzählungszeichen | 0 Revisionen | 2 FORMAT_CHANGE |
Nummeriert 1. 2. | Buchstaben a. b. | 0 Revisionen | 2 FORMAT_CHANGE |
| Nummeriert, “Element 2” | Aufzählungszeichen, “Element zwei” | 2 (DELETION, INSERTION) | 4 (fügt 2 FORMAT_CHANGE hinzu) |
| Nummeriert | Identische nummerierte Liste | 0 Revisionen | 0 Revisionen |
Die letzte Zeile ist in der Praxis wichtig. Das Aktivieren der Option erzeugt keine zusätzlichen Revisionen für Listen, die in beiden Dateien identisch sind.
Voraussetzungen
Sie benötigen Aspose.Words for Python via .NET 26.9 oder neuer. Installieren oder aktualisieren Sie es von PyPI:
pip install --upgrade "aspose-words>=26.9"
Ohne Lizenz läuft Aspose.Words im Evaluierungsmodus mit Einschränkungen. Eine temporäre Lizenz entfernt sie, während Sie testen.
Sehen Sie den Unterschied: Nummerierungsänderungen mit und ohne die Option
Das folgende Skript erstellt zwei Dokumente, die dieselben beiden Elemente enthalten. Das erste verwendet eine nummerierte Liste, das zweite eine Aufzählungsliste. Es vergleicht sie zweimal, einmal mit deaktivierter Option und einmal mit aktivierter Option, sodass Sie genau sehen können, welche Änderungen die Option bewirkt.
import datetime
import aspose.words as aw
def build_list_document(bulleted: bool) -> aw.Document:
"""Create a two-item list, either numbered or bulleted."""
doc = aw.Document()
builder = aw.DocumentBuilder(doc=doc)
if bulleted:
builder.list_format.apply_bullet_default()
else:
builder.list_format.apply_number_default()
builder.writeln("Item 1")
builder.writeln("Item 2")
builder.list_format.remove_numbers()
return doc
def compare_lists(compare_list_definitions: bool) -> aw.Document:
original = build_list_document(bulleted=False)
edited = build_list_document(bulleted=True)
options = aw.comparing.CompareOptions()
options.advanced_options.compare_list_definitions = compare_list_definitions
# compare() writes revisions into `original`; it returns nothing.
original.compare(
document=edited,
author="Reviewer",
date_time=datetime.datetime.now(),
options=options,
)
return original
for flag in (False, True):
result = compare_lists(flag)
print(f"compare_list_definitions={flag}: {result.revisions.count} revision(s)")
for revision in result.revisions:
revision_type = aw.RevisionType(revision.revision_type).name
text = revision.parent_node.get_text().strip()
print(f" {revision_type}: {text}")
result.save("compared-lists.docx")
Beim Ausführen des Skripts wird ausgegeben:
compare_list_definitions=False: 0 revision(s)
compare_list_definitions=True: 2 revision(s)
FORMAT_CHANGE: Item 1
FORMAT_CHANGE: Item 2
Wie der Code funktioniert
build_list_documentverwendetDocumentBuilder.list_format, um eine standardmäßige nummerierte oder Aufzählungsliste zu starten, schreibt zwei Elemente und ruft anschließendremove_numbers()auf, sodass nachfolgende Absätze nicht mehr Teil der Liste sind.CompareOptions.advanced_optionsstelltcompare_list_definitionsbereit, das standardmäßigFalseist.original.compare(...)vergleichtoriginalmiteditedund zeichnet die Unterschiede als Revisionen innerhalb vonoriginalauf. Die Methode gibtNonezurück, daher sollten die Ergebnisse immer aus dem Dokument gelesen werden, auf dem sie aufgerufen wurde.- Der
parent_nodejeder Revision ist der Listabsatz, dessen Formatierung geändert wurde.revision_typeistRevisionType.FORMAT_CHANGEfür Änderungen der Nummerierung und Aufzählungszeichen.
Erkennen von Nummerierungsänderungen zwischen zwei Word-Dateien
In einem realen Workflow vergleichen Sie zwei vorhandene Dateien, beispielsweise zwei Versionen eines Vertrags. Diese Vergleiche enthalten in der Regel auch andere Änderungen, sodass das nachstehende Skript nur die Formatierungsänderungen beibehält, die sich auf Listenabsätze beziehen.
import datetime
import aspose.words as aw
original = aw.Document("contract-v1.docx")
edited = aw.Document("contract-v2.docx")
options = aw.comparing.CompareOptions()
options.advanced_options.compare_list_definitions = True
original.compare(edited, "Reviewer", datetime.datetime.now(), options)
# Keep only formatting revisions that sit on list paragraphs.
list_changes = [
rev for rev in original.revisions
if rev.revision_type == aw.RevisionType.FORMAT_CHANGE
and rev.parent_node is not None
and rev.parent_node.node_type == aw.NodeType.PARAGRAPH
and rev.parent_node.as_paragraph().list_format.is_list_item
]
print(f"Total revisions: {original.revisions.count}")
print(f"Formatting changes on list paragraphs: {len(list_changes)}")
for rev in list_changes:
print(f" {rev.parent_node.get_text().strip()}")
original.save("contract-compared.docx")
In unserem Test hat Version 2 des Vertrags eine nummerierte Liste in Aufzählungszeichen geändert und außerdem einen nicht zusammenhängenden Satz fett formatiert. Die Ausgabe war:
Total revisions: 5
Formatting changes on list paragraphs: 2
Invoices are due in 30 days.
Late fees apply after 45 days.
Der Filter wählt die beiden Listenelemente aus und überspringt die fette Änderung, weil diese Revision auf Text und nicht auf einen Listenabsatz angewendet wird. Beachten Sie, dass er jede Absatz‑Ebene‑Formatierungsänderung an einem Listenelement erkennt, z. B. eine geänderte Einrückung, nicht nur die Nummerierung. Überprüfen Sie das gespeicherte Dokument, wenn Sie diese unterscheiden müssen.
Überprüfen, Akzeptieren oder Ablehnen von Nummerierungsänderungen
Da Nummerierungsänderungen gewöhnliche Formatänderungen sind, behandeln Sie sie auf die gleiche Weise wie jede andere Revision:
revisions.accept_all()wendet die bearbeitete Listformatierung an. Im ersten Beispiel werden beide Elemente zu Aufzählungszeichen.revisions.reject_all()behält die ursprüngliche Formatierung bei, sodass die Elemente nummeriert bleiben1.und2..- Das Speichern des Dokuments schreibt die Revisionen als nachverfolgte Änderungen, sodass Prüfer die Datei in Microsoft Word öffnen und jede Änderung selbst entscheiden können.
Sie können auch accept() oder reject() für einzelne Revision‑Objekte aufrufen, zum Beispiel nur für die Elemente in der list_changes‑Liste aus dem vorherigen Abschnitt.
Wann Nummerierungsänderungen erkennen
Schalten Sie die Option ein, wenn die Nummerierung einer Liste für Ihre Prüfer eine Bedeutung hat. Rechts‑ und Richtliniendokumente sind ein häufiges Beispiel: Das Umnummerieren von Klauseln von 1. zu (a) ändert, wie andere Dokumente auf sie verweisen, sodass ein Prüfer dies sehen muss. Es ist auch nützlich, wenn Sie Dokumente zwischen Systemen migrieren und bestätigen möchten, dass die Listennummerierung nach dem Umzug unverändert geblieben ist.
Deaktivieren Sie es, wenn Ihnen nur der Wortlaut wichtig ist. Inhaltsüberprüfungen, Übersetzungsprüfungen und textbezogene Unterschiede lassen sich leichter lesen, wenn Formatierungsänderungen nicht mitgemischt sind.
Dinge, auf die Sie achten sollten
ignore_formattingüberschreibt die Option. Wenn Sieoptions.ignore_formatting = Truesetzen, werden Änderungen der Nummerierung nicht gemeldet, selbst wenncompare_list_definitions = Trueaktiviert ist.- Dateien dürfen vor dem Vergleich keine Revisionen enthalten. Wenn eines der Dokumente bereits Änderungen nachverfolgt, wirft
compareeinenRuntimeErrormit der Meldung, dass verglichene Dokumente keine Revisionen enthalten dürfen. Akzeptieren oder verwerfen Sie zuerst vorhandene Revisionen. Das bedeutet auch, dass Sie keinen zweiten Vergleich an einem Dokument durchführen können, das bereits die Ergebnisse des ersten enthält; laden Sie die Dateien jedes Mal neu. - Andere Revisionen erscheinen weiterhin. Eingefügter oder gelöschter Text in einem Listenelement wird gemeldet, unabhängig davon, ob die Option aktiviert ist oder nicht. Prüfen Sie
revision_type, wenn Sie Nummerierungsänderungen von Textänderungen trennen müssen.
Nächste Schritte
Der Artikel Dokumente vergleichen in der Aspose.Words for Python Dokumentation behandelt die anderen Vergleichseinstellungen, einschließlich Granularität, dem Vergleichsziel und den Ignorieroptionen.
FAQs
Warum erkennt Aspose.Words keine Änderungen der Nummerierung beim Vergleich von Word-Dateien? Standardmäßig folgt Aspose.Words Microsoft Word und lässt Listendefinitionen, wie den Nummerierungsstil oder das Aufzählungszeichen, aus dem Vergleich aus. Eine Liste, die von Zahlen zu Aufzählungszeichen wechselt, erzeugt keine Änderungen, es sei denn, Sie aktivieren
compare_list_definitions.Wie erkenne ich Nummerierungsänderungen in Python? Erstellen Sie
CompareOptions, setzen Sieoptions.advanced_options.compare_list_definitionsaufTrueund übergeben Sie die Optionen anDocument.compare. Jeder Listabsatz, dessen Nummerierung oder Aufzählungszeichen geändert wurde, erhält eineFORMAT_CHANGE-Revision.Welche Art von Revision erzeugt eine Nummerierungsänderung? Jeder betroffene List-Absatz erhält eine Revision vom Typ
RevisionType.FORMAT_CHANGE. Das Akzeptieren wendet die Listformatierung der bearbeiteten Datei an, und das Ablehnen behält das Original bei.Funktioniert die Option zusammen mit ignore_formatting? Nein. Wenn
CompareOptions.ignore_formattingTrueist, werden Nummerierungsänderungen nicht gemeldet, selbst wenncompare_list_definitionsTrueist.Was gibt Document.compare zurück? Nichts. Es schreibt die Unterschiede als Revisionen in das Dokument, auf dem Sie es aufrufen, sodass Sie sie aus der
revisions-Sammlung dieses Dokuments lesen.Welche Version von Aspose.Words for Python hat diese Option hinzugefügt? Die
compare_list_definitions-Eigenschaft vonAdvancedCompareOptionswurde in Aspose.Words for Python via .NET 26.9 hinzugefügt.
