You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python自动化实现Word文档V1到V2的带修订编辑?

实现Word文档V1对照V2自动生成修订记录的方案

Python方案(优先推荐)

python-docx本身不支持生成Word的修订(Track Changes)记录,所以得借助pywin32调用Word的COM API来实现——这是唯一能让最终文档在Word中直接看到修订历史的方法。步骤如下:

  1. 依赖安装
    安装必要库:

    pip install python-docx pywin32
    

    注:difflib是Python标准库,无需额外安装。

  2. 核心思路

    • 提取V1和V2的纯文本内容(按段落拆分)
    • 用difflib.SequenceMatcher逐段落对比,找出词级别的增删改差异
    • 调用Word COM API打开V1,开启修订模式,根据差异执行对应编辑操作
  3. 代码示例

    import win32com.client as win32
    from difflib import SequenceMatcher
    from docx import Document
    
    def get_doc_text(doc_path):
        # 提取文档纯文本,按段落拆分(过滤空段落)
        doc = Document(doc_path)
        return [para.text.strip() for para in doc.paragraphs if para.text.strip()]
    
    def apply_track_changes(v1_path, v2_path, output_path):
        # 初始化Word应用,后台运行
        word = win32.Dispatch("Word.Application")
        word.Visible = False
        doc = word.Documents.Open(v1_path)
        doc.TrackRevisions = True  # 开启修订模式
    
        v1_text = get_doc_text(v1_path)
        v2_text = get_doc_text(v2_path)
    
        # 逐段落对比(基础版,假设段落数量对应,可扩展处理段落不匹配情况)
        for para_idx in range(min(len(v1_text), len(v2_text))):
            para_v1 = v1_text[para_idx]
            para_v2 = v2_text[para_idx]
            if para_v1 == para_v2:
                continue
    
            # 按空格拆分词(中文可替换为jieba分词优化)
            words_v1 = para_v1.split()
            words_v2 = para_v2.split()
    
            matcher = SequenceMatcher(None, words_v1, words_v2)
            # 遍历差异操作
            for tag, i1, i2, j1, j2 in matcher.get_opcodes():
                word_para = doc.Paragraphs(para_idx + 1)
                if tag == 'delete':
                    # 删除V1中对应词段
                    start_range = word_para.Range.Words(i1 + 1)
                    end_range = word_para.Range.Words(i2)
                    doc.Range(start_range.Start, end_range.End).Delete()
                elif tag == 'insert':
                    # 在V1对应位置插入V2的词段
                    insert_pos = word_para.Range.Words(i1 + 1).Start if i1 < len(words_v1) else word_para.Range.End
                    doc.Range(insert_pos, insert_pos).InsertAfter(' '.join(words_v2[j1:j2]) + ' ')
                elif tag == 'replace':
                    # 先删除V1旧词,再插入V2新词
                    start_range = word_para.Range.Words(i1 + 1)
                    end_range = word_para.Range.Words(i2)
                    doc.Range(start_range.Start, end_range.End).Delete()
                    doc.Range(start_range.Start, start_range.Start).InsertAfter(' '.join(words_v2[j1:j2]) + ' ')
    
        # 保存并关闭文档
        doc.SaveAs(output_path)
        doc.Close()
        word.Quit()
    
    # 调用示例
    apply_track_changes("V1.docx", "V2.docx", "V1_带修订版.docx")
    

    注:此为基础版本,仅处理纯文本段落的词级差异,表格、图片、样式等复杂格式需额外扩展逻辑;若段落数量不一致,可新增代码处理段落的新增/删除。

VBA方案(原生Word支持)

如果不想用Python,直接在Word中编写VBA宏也能实现,优势是原生兼容所有Word格式和修订功能:

  1. 打开Word,按Alt+F11进入VBA编辑器
  2. 插入模块,粘贴以下代码
    Sub CompareAndTrackChanges()
        Dim v1Doc As Document, v2Doc As Document
        Dim v1Para As Paragraph, v2Para As Paragraph
        Dim v1Words As Variant, v2Words As Variant
        Dim i As Integer, j As Integer
    
        ' 选择V1和V2文档
        Set v1Doc = Application.Documents.Open(Application.GetOpenFilename("Word Documents (*.docx), *.docx"))
        Set v2Doc = Application.Documents.Open(Application.GetOpenFilename("Word Documents (*.docx), *.docx"))
    
        v1Doc.TrackRevisions = True
        v1Doc.Activate
    
        ' 逐段落对比(基础版,可扩展)
        For i = 1 To WorksheetFunction.Min(v1Doc.Paragraphs.Count, v2Doc.Paragraphs.Count)
            Set v1Para = v1Doc.Paragraphs(i)
            Set v2Para = v2Doc.Paragraphs(i)
    
            If Trim(v1Para.Range.Text) = Trim(v2Para.Range.Text) Then GoTo NextPara
    
            v1Words = Split(Trim(v1Para.Range.Text), " ")
            v2Words = Split(Trim(v2Para.Range.Text), " ")
    
            ' 词级对比替换
            For j = LBound(v1Words) To WorksheetFunction.Min(UBound(v1Words), UBound(v2Words))
                If v1Words(j) <> v2Words(j) Then
                    v1Para.Range.Words(j + 1).Delete
                    v1Para.Range.Words(j + 1).InsertBefore v2Words(j) & " "
                End If
            Next j
    
            ' 处理V2新增的词
            If UBound(v2Words) > UBound(v1Words) Then
                For j = UBound(v1Words) + 1 To UBound(v2Words)
                    v1Para.Range.InsertAfter " " & v2Words(j)
                Next j
            End If
    
            ' 处理V1多余的词
            If UBound(v1Words) > UBound(v2Words) Then
                For j = UBound(v1Words) To UBound(v2Words) + 1 Step -1
                    v1Para.Range.Words(j + 1).Delete
                Next j
            End If
    
    NextPara:
        Next i
    
        ' 保存结果
        v1Doc.SaveAs v1Doc.Path & "\V1_带修订版.docx"
        v2Doc.Close SaveChanges:=False
        MsgBox "修订已生成!"
    End Sub
    
  3. 运行宏,选择V1和V2文档即可生成带修订的版本

注意事项

  • 两种方案均为基础实现,复杂排版(如表格、公式、跨段落修改)需额外调整逻辑
  • 中文场景下,可替换词级拆分逻辑为中文分词库(如Python的jieba)提升准确性
  • 生成的文档直接用Word打开即可查看完整修订历史,与手动修改效果一致

内容的提问来源于stack exchange,提问作者Icy Lemons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:25:00