เมื่อคุณเปรียบเทียบไฟล์ Word สองไฟล์และความแตกต่างเพียงอย่างเดียวคือวิธีการตั้งหมายเลขของรายการ เช่น ข้อที่เคยเป็น 1. และ 2. ตอนนี้กลายเป็น a. และ b. หรือรายการที่มีหมายเลขกลายเป็นรายการแบบหัวข้อสัญลักษณ์, Aspose.Words จะไม่รายงานความแตกต่างใด ๆ โดยค่าเริ่มต้น บทเรียนนี้จะแสดงวิธีตรวจจับการเปลี่ยนแปลงการตั้งหมายเลขเมื่อเปรียบเทียบไฟล์ Word ด้วย Python นอกจากนี้ยังอธิบายวิธีตรวจสอบ ยอมรับ หรือปฏิเสธการเปลี่ยนแปลงที่พบ.

Key Takeaways

  • โดยค่าเริ่มต้น การเปลี่ยนแปลงสไตล์การนับเลขหรืออักขระหัวข้อของรายการจะไม่สร้างการแก้ไขเมื่อคุณเปรียบเทียบไฟล์ Word.
  • การตั้งค่า options.advanced_options.compare_list_definitions = True จะรายงานแต่ละย่อหน้ารายการที่ได้รับผลกระทบเป็นการแก้ไข FORMAT_CHANGE.
  • การเปลี่ยนแปลงข้อความภายในรายการจะถูกรายงานไม่ว่าจะเป็นอย่างไร ตัวเลือกนี้จะเพิ่มการเปลี่ยนแปลงการนับเลขและหัวข้อเท่านั้น.
  • ignore_formatting=True จะซ่อนการเปลี่ยนแปลงการนับเลขแม้ว่า ตัวเลือกจะเปิดอยู่.

ทำไมการเปลี่ยนแปลงการจัดลำดับเลขไม่แสดงโดยค่าเริ่มต้น

การจัดลำดับเลขและสัญลักษณ์หัวข้อใน Word มาจากการกำหนดรายการ ซึ่งอธิบายว่าระดับรายการแต่ละระดับดูเป็นอย่างไร: รูปแบบเลข (1., a., i.), ตัวอักษรสัญลักษณ์หัวข้อ, และการจัดรูปแบบที่เกี่ยวข้อง เมื่อคุณเปรียบเทียบเอกสาร, Aspose.Words จะทำตาม Microsoft Word เป็นค่าเริ่มต้นและละเว้นการกำหนดรายการออกจากการเปรียบเทียบ ดังนั้นหากมีการเปลี่ยนแปลงเฉพาะการจัดลำดับเลข การเปรียบเทียบจะไม่พบอะไรให้รายงาน.

compare_list_definitions ตัวเลือกไม่มีเทียบเท่าใน Word. มันบอกให้ Aspose.Words รวมคำนิยามรายการในการเปรียบเทียบ. นี่คือสิ่งที่เราเห็นเมื่อเปรียบเทียบรายการสองรายการในเวอร์ชัน 26.9:

รายการต้นฉบับรายการที่แก้ไขตัวเลือกปิดตัวเลือกเปิด
ลำดับเลข 1. 2.หัวข้อแบบจุด0 การแก้ไข2 FORMAT_CHANGE
ลำดับเลข 1. 2.ลำดับอักษร a. b.0 การแก้ไข2 FORMAT_CHANGE
ลำดับเลข, “รายการที่ 2”หัวข้อแบบจุด, “รายการที่สอง”2 (DELETION, INSERTION)4 (เพิ่ม 2 FORMAT_CHANGE)
ลำดับเลขรายการลำดับเลขที่เหมือนกัน0 การแก้ไข0 การแก้ไข

แถวสุดท้ายมีความสำคัญในการปฏิบัติ การเปิดตัวเลือกนี้จะไม่สร้างการแก้ไขเพิ่มเติมสำหรับรายการที่เหมือนกันในทั้งสองไฟล์.

ข้อกำหนดเบื้องต้น

คุณต้องการ Aspose.Words for Python via .NET 26.9 หรือเวอร์ชันที่ใหม่กว่า ติดตั้งหรืออัปเกรดจาก PyPI

pip install --upgrade "aspose-words>=26.9"

หากไม่มีใบอนุญาต Aspose.Words จะทำงานในโหมดประเมินผลพร้อมข้อจำกัด ใบอนุญาตชั่วคราว ใบอนุญาตชั่วคราว จะลบข้อจำกัดเหล่านั้นออกขณะคุณทำการทดสอบ.

ดูความแตกต่าง: การเปลี่ยนแปลงการจัดลำดับเลขที่มีและไม่มีตัวเลือก

สคริปต์ต่อไปนี้สร้างเอกสารสองฉบับที่มีรายการเดียวกันสองรายการ รายการแรกใช้รายการลำดับเลขที่ และรายการที่สองใช้รายการแบบหัวข้อย่อย มันเปรียบเทียบทั้งสองครั้ง ครั้งหนึ่งเมื่อปิดตัวเลือกและอีกครั้งเมื่อเปิดตัวเลือก เพื่อให้คุณเห็นว่าตัวเลือกเปลี่ยนแปลงอะไรบ้างอย่างชัดเจน

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")

การรันสคริปต์พิมพ์:

compare_list_definitions=False: 0 revision(s)
compare_list_definitions=True: 2 revision(s)
  FORMAT_CHANGE: Item 1
  FORMAT_CHANGE: Item 2

วิธีการทำงานของโค้ด

  • build_list_document ใช้ DocumentBuilder.list_format เพื่อเริ่มรายการที่มีหมายเลขหรือรายการแบบหัวข้อย่อยเริ่มต้น, เขียนสองรายการ, แล้วเรียก remove_numbers() เพื่อให้ย่อหน้าที่ตามมาภายหลังไม่เป็นส่วนหนึ่งของรายการ.
  • CompareOptions.advanced_options เปิดเผย compare_list_definitions ซึ่งค่าเริ่มต้นคือ False.
  • original.compare(...) เปรียบเทียบ original กับ edited และบันทึกความแตกต่างเป็นการแก้ไขภายใน original. วิธีการนี้คืนค่า None ดังนั้นให้อ่านผลลัพธ์จากเอกสารที่คุณเรียกใช้เสมอ.
  • parent_node ของแต่ละการแก้ไข คือย่อหน้ารายการที่รูปแบบถูกเปลี่ยน. revision_type คือ RevisionType.FORMAT_CHANGE สำหรับการเปลี่ยนแปลงหมายเลขและหัวข้อย่อย.

ตรวจจับการเปลี่ยนแปลงการจัดลำดับเลขระหว่างไฟล์ Word สองไฟล์

ในกระบวนการทำงานจริง คุณจะเปรียบเทียบไฟล์ที่มีอยู่สองไฟล์ เช่น เวอร์ชันสองของสัญญา การเปรียบเทียบเหล่านี้มักจะมีการแก้ไขอื่น ๆ ด้วย ดังนั้นสคริปต์ด้านล่างจึงเก็บเฉพาะการเปลี่ยนแปลงรูปแบบที่อยู่บนย่อหน้ารายการเท่านั้น

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")

ในการทดสอบของเรา เวอร์ชัน 2 ของสัญญาได้เปลี่ยนรายการลำดับเลขเป็นรายการหัวข้อและยังทำให้ประโยคที่ไม่เกี่ยวข้องเป็นตัวหนา ผลลัพธ์คือ:

Total revisions: 5
Formatting changes on list paragraphs: 2
  Invoices are due in 30 days.
  Late fees apply after 45 days.

ตัวกรองจะคัดเลือกรายการสองรายการในรายการและข้ามการเปลี่ยนแปลงเป็นตัวหนา เพราะการแก้ไขนั้นอยู่บนข้อความแทนที่จะอยู่บนย่อหน้ารายการ โปรดจำไว้ว่า มันจับคู่การเปลี่ยนแปลงการจัดรูปแบบระดับย่อหน้าบนรายการใด ๆ เช่น การเยื้องที่เปลี่ยนแปลง ไม่ใช่แค่การนับเลขเท่านั้น ตรวจสอบเอกสารที่บันทึกไว้หากคุณต้องการแยกความแตกต่างเหล่านั้นออก

ตรวจสอบ ยอมรับ หรือ ปฏิเสธ การเปลี่ยนแปลงการจัดลำดับเลข

เนื่องจากการเปลี่ยนแปลงการจัดลำดับเลขเป็นการแก้ไขรูปแบบทั่วไป คุณจึงจัดการมันเช่นเดียวกับการแก้ไขอื่น ๆ

  • revisions.accept_all() ใช้การจัดรูปแบบรายการที่แก้ไขแล้ว ในตัวอย่างแรก รายการทั้งสองจะกลายเป็น bullet.
  • revisions.reject_all() รักษาการจัดรูปแบบเดิม ดังนั้นรายการจะคงเป็นการนับเลข 1. และ 2..
  • การบันทึกเอกสารจะบันทึกการแก้ไขเป็นการเปลี่ยนแปลงที่ติดตามไว้ ทำให้ผู้ตรวจสอบสามารถเปิดไฟล์ใน Microsoft Word และตัดสินใจเกี่ยวกับการเปลี่ยนแปลงแต่ละรายการด้วยตนเอง.

คุณยังสามารถเรียก accept() หรือ reject() บนวัตถุ Revision แต่ละรายการได้ ตัวอย่างเช่นบนเฉพาะรายการในรายการ list_changes จากส่วนก่อนหน้า

เมื่อใดควรตรวจจับการเปลี่ยนแปลงการจัดลำดับเลข

เปิดตัวเลือกนี้เมื่อการจัดลำดับเลขของรายการมีความหมายต่อผู้ตรวจสอบของคุณ เอกสารทางกฎหมายและนโยบายเป็นกรณีทั่วไป: การเปลี่ยนลำดับข้อจาก 1. เป็น (a) ทำให้เอกสารอื่นอ้างอิงถึงมันแตกต่างกัน ดังนั้นผู้ตรวจสอบจึงต้องเห็นการเปลี่ยนแปลงนี้ นอกจากนี้ยังเป็นประโยชน์เมื่อคุณย้ายเอกสารระหว่างระบบและต้องการยืนยันว่าการจัดลำดับเลขของรายการยังคงอยู่เหมือนเดิมหลังการย้าย

ปิดไว้เมื่อคุณสนใจเฉพาะคำพูดเท่านั้น การตรวจทานเนื้อหา การตรวจสอบการแปล และการเปรียบเทียบระดับข้อความจะอ่านง่ายขึ้นเมื่อไม่มีการแก้ไขรูปแบบผสมอยู่

สิ่งที่ควรระวัง

  • ignore_formatting จะลบล้างตัวเลือกนี้ หากคุณตั้งค่า options.ignore_formatting = True การเปลี่ยนแปลงหมายเลขจะไม่ถูกรายงาน แม้จะเปิด compare_list_definitions = True ก็ตาม
  • ไฟล์ต้องไม่มีการแก้ไขก่อนที่คุณจะทำการเปรียบเทียบ หากเอกสารใดเอกสารหนึ่งมีการติดตามการเปลี่ยนแปลงอยู่แล้ว compare จะโยน RuntimeError ขึ้นมาบอกว่าเอกสารที่เปรียบเทียบต้องไม่มีการแก้ไข ให้ยอมรับหรือปฏิเสธการแก้ไขที่มีอยู่ก่อน นอกจากนี้ยังหมายความว่าคุณไม่สามารถทำการเปรียบเทียบครั้งที่สองบนเอกสารที่ยังคงผลลัพธ์ของการเปรียบเทียบครั้งแรกได้; ต้องโหลดไฟล์ใหม่ทุกครั้ง
  • การแก้ไขอื่น ๆ ยังปรากฏอยู่ ข้อความที่ถูกแทรกหรือถูกลบในรายการจะถูกรายงานไม่ว่าจะเปิดหรือปิดตัวเลือกนี้ ดังนั้นให้ตรวจสอบ revision_type หากคุณต้องการแยกการเปลี่ยนแปลงหมายเลขออกจากการเปลี่ยนแปลงข้อความ

ขั้นตอนต่อไป

บทความ เปรียบเทียบเอกสาร ในเอกสารของ Aspose.Words for Python ครอบคลุมการตั้งค่าเปรียบเทียบอื่น ๆ รวมถึงความละเอียด, เป้าหมายการเปรียบเทียบ, และตัวเลือกการละเว้น

FAQs

  1. ทำไม Aspose.Words ไม่ตรวจจับการเปลี่ยนแปลงการจัดลำดับเลขเมื่อเปรียบเทียบไฟล์ Word? โดยค่าเริ่มต้น Aspose.Words จะทำตาม Microsoft Word และละเว้นการกำหนดรายการ เช่น รูปแบบการจัดลำดับเลขหรืออักขระสัญลักษณ์หัวข้อจากการเปรียบเทียบ รายการที่เปลี่ยนจากตัวเลขเป็นสัญลักษณ์หัวข้อจะไม่สร้างการแก้ไขใด ๆ เว้นแต่คุณจะเปิดใช้งาน compare_list_definitions.

  2. ฉันจะตรวจจับการเปลี่ยนแปลงการนับเลขใน Python ได้อย่างไร? สร้าง CompareOptions ตั้งค่า options.advanced_options.compare_list_definitions เป็น True แล้วส่งตัวเลือกไปยัง Document.compare แต่ละย่อหน้าของรายการที่หมายเลขหรือสัญลักษณ์หัวข้อเปลี่ยนแปลงจะได้รับการแก้ไข FORMAT_CHANGE revision.

  3. การเปลี่ยนแปลงการจัดลำดับเลขทำให้เกิดการแก้ไขประเภทใด? แต่ละย่อหน้ารายการที่ได้รับผลกระทบจะได้รับการแก้ไขประเภท RevisionType.FORMAT_CHANGE. การยอมรับจะนำการจัดรูปแบบรายการของไฟล์ที่แก้ไขไปใช้, และการปฏิเสธจะคงไว้ซึ่งต้นฉบับ.

  4. ตัวเลือกทำงานร่วมกับ ignore_formatting หรือไม่? ไม่. เมื่อ CompareOptions.ignore_formatting เป็น True การเปลี่ยนแปลงหมายเลขจะไม่ถูกรายงาน แม้ว่า compare_list_definitions จะเป็น True.

  5. Document.compare คืนค่าอะไร? ไม่มีค่าใด ๆ มันเขียนความแตกต่างเป็นการแก้ไขลงในเอกสารที่คุณเรียกใช้เมธอดนี้, ดังนั้นคุณต้องอ่านจากคอลเลกชัน revisions ของเอกสารนั้น.

  6. เวอร์ชันใดของ Aspose.Words for Python ที่เพิ่มตัวเลือกนี้? compare_list_definitions property ของ AdvancedCompareOptions ถูกเพิ่มใน Aspose.Words for Python via .NET 26.9.

รับใบอนุญาตฟรีและการสนับสนุน