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 = True wird jeder betroffene List‑Absatz als FORMAT_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=True blendet 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 ListeBearbeitete ListeOption ausOption an
Nummeriert 1. 2.Aufzählungszeichen0 Revisionen2 FORMAT_CHANGE
Nummeriert 1. 2.Buchstaben a. b.0 Revisionen2 FORMAT_CHANGE
Nummeriert, “Element 2”Aufzählungszeichen, “Element zwei”2 (DELETION, INSERTION)4 (fügt 2 FORMAT_CHANGE hinzu)
NummeriertIdentische nummerierte Liste0 Revisionen0 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_document verwendet DocumentBuilder.list_format, um eine standardmäßige nummerierte oder Aufzählungsliste zu starten, schreibt zwei Elemente und ruft anschließend remove_numbers() auf, sodass nachfolgende Absätze nicht mehr Teil der Liste sind.
  • CompareOptions.advanced_options stellt compare_list_definitions bereit, das standardmäßig False ist.
  • original.compare(...) vergleicht original mit edited und zeichnet die Unterschiede als Revisionen innerhalb von original auf. Die Methode gibt None zurück, daher sollten die Ergebnisse immer aus dem Dokument gelesen werden, auf dem sie aufgerufen wurde.
  • Der parent_node jeder Revision ist der Listabsatz, dessen Formatierung geändert wurde. revision_type ist RevisionType.FORMAT_CHANGE fü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 bleiben 1. und 2..
  • 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 Sie options.ignore_formatting = True setzen, werden Änderungen der Nummerierung nicht gemeldet, selbst wenn compare_list_definitions = True aktiviert ist.
  • Dateien dürfen vor dem Vergleich keine Revisionen enthalten. Wenn eines der Dokumente bereits Änderungen nachverfolgt, wirft compare einen RuntimeError mit 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

  1. 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.

  2. Wie erkenne ich Nummerierungsänderungen in Python? Erstellen Sie CompareOptions, setzen Sie options.advanced_options.compare_list_definitions auf True und übergeben Sie die Optionen an Document.compare. Jeder Listabsatz, dessen Nummerierung oder Aufzählungszeichen geändert wurde, erhält eine FORMAT_CHANGE-Revision.

  3. 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.

  4. Funktioniert die Option zusammen mit ignore_formatting? Nein. Wenn CompareOptions.ignore_formatting True ist, werden Nummerierungsänderungen nicht gemeldet, selbst wenn compare_list_definitions True ist.

  5. 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.

  6. Welche Version von Aspose.Words for Python hat diese Option hinzugefügt? Die compare_list_definitions-Eigenschaft von AdvancedCompareOptions wurde in Aspose.Words for Python via .NET 26.9 hinzugefügt.

Kostenlose Lizenz und Support erhalten