Word修订内容批量标红

Word修订标红Plus,适用于科研狗

最近改文章,期刊要求提供所有修改内容都标红的修订稿,本着能不手改就不手改的原则,我尝试检索了一下自动修改的方法,最先找到的是简书上的一篇使用VB宏命令批量修改的文章 (Word-接受全部修订为标红字体),但是尝试之后发现运行时间很长,且有些修订不会生效,然后就开始了我的漫长研究之路。

研究过程

因为最熟悉Python,首先想到的是Python操作Word文档,主要尝试了一下三个模块,但是最后都失败了。

python-docx模块

该模块是目前Python操作Word文档最主流的模块,然而查阅资料后发现该模块目前尚不支持操作修订,只能尝试通过xml获取修订文本,通过Find选择对应本文并修改颜色。由于太过复杂,放弃。

aspose-words模块

Google到了该模块操作Word修订的sample,尝试使用后该模块确实能够实现该功能。奈何这是一个付费模块,保存的文档有水印,且只能保存9页。去水印和全文档保存则需要付费或30天试用,无奈放弃。

win32com模块

该方式也就是通过.Net提供的com文件,直接调用Word原生的API处理文档。参考多方资料后,能勉强实现修订标红功能,代码如下:

# 引入模块
import win32com.client as win32
import win32com
from tqdm import tqdm
# 设置参数
path_file_input = r"input.doc"
path_file_output = r"output.doc"

# 创建word应用并打开文档
word=win32com.client.DispatchEx("Word.Application")
word=win32.gencache.EnsureDispatch("Word.Application")
word.Visible = False
word.DisplayAlerts = False
doc = word.Documents.Open(path_file_input)
# 激活文档并关闭修订功能
doc.Activate()
word.ActiveDocument.TrackRevisions = False
num_true=0 # 用于计算成功修改的修订数目
try:
    # 迭代所有的修订
    for i in tqdm(range(word.ActiveDocument.Revisions.Count)): # word.ActiveDocument.Revisions.Count 获取修订的数量
        # 尝试修改当前修订
        try:
            # 获取当前修订
            revision=word.ActiveDocument.Revisions.Item(i)
            # 设置修订字体颜色
            revision.Range.Font.Color=255
            # 接受修订
            revision.Accept()
            num_true+=1
        # 捕获异常。该模块在使用 word.ActiveDocument.Revisions.Item(i) 获取某一修订时,如果这一修订时删除的修订,就会抛出 集合所要求的成员不存在 错误,因此需要进行异常捕获
        except Exception as e:
            pass
    # 另存修改后的文档
    doc.SaveAs(path_file_output)
except Exception as e:
    print(e)
# 保证文档和应用句柄释放
finally:
    # # 关闭 word 文档
    doc.Close() 
    # # 关闭 office
    word.Quit() 
    del doc,word
    # 打印成功处理的修订数量
    print('num_true',num_true)

然而,实践发现,以上代码在处理到有图篇插入和分节符插入等相关的修订时,后面的所有修订都不会再处理。如果要使用该代码,需要首先在文档中手动将这些部分接受修订,使得该代码实用性不高,放弃……

最终成果

尝试了一圈Python效果都不好,最后幡然醒悟,微软的文档还是得用微软自己的东西,再次把VBA捡起来。参考VBA帮助文档中对修订的操作,最后成品代码如下:

Sub Set_Revisions_Red()
'关闭修订模式
ActiveDocument.TrackRevisions = Flase

'迭代每一个修订,改为红色并接受修订
For n = 1 To ActiveDocument.Revisions.Count
    '移动至下一个修订
    Selection.NextRevision (True)
    '设置修订内容字体颜色为红色
    Selection.Font.Color = wdColorRed
    '接受当前修订
    Selection.Range.Revisions.AcceptAll
    Next n
End Sub

该代码能够实现包括doc和docx在内的Word文档修改内容标红并接受修订功能。使用方式为:

  1. 打开Word文档
  2. Alt+F11打开VBA界面。
  3. 在左侧窗格中选中Normal后,点击菜单栏-插入-模块,在弹出的窗口中粘贴上述代码。
  4. F5运行代码。
  5. 稍等片刻,等待程序运行完成即可。本人在 Word 2019上测试无任何问题,包括文本修改、图片插入、表格插入、域代码更新等均能识别,果然不愧是微软亲儿子……

至此,打完收工。


本文参考

  1. Word-接受全部修订为标红字体
  2. How to extract text inserted with track-changes in python-docx
  3. Track Changes in a Document
  4. Python 使用 win32com 模块对 word 文件进行操作
  5. Python - Using win32com.client to accept all changes in Word Documents
  6. How can I output Word documents/plaintext with all accepted/rejected track changes?
  7. Selecting and deleting a Line Present in a Word Document Using Python / Win32
  8. Revisions object (Word)

相关推荐:

如何将列表中的每个元素传入函数进行批量处理

本文详解如何将列表中每个数值逐一传递给单参数函数(如温度转换函数),避免直接传入列表导致的类型错误,并提供列表推导式、map()和循环三种主流实现方式及最佳实践建议。 本文详解如何将列表中每个数值逐一传递给单参数函数(如温度转换函数),避免直接传入列表导致的类型错误,并提供列表推导式、map()和循...

如何根据前一个连续段的值批量修改当前连续段数值

本文介绍在pandas中识别数值连续段(streak),并基于前一段的值条件性修改当前段——例如将紧随“1段”之后的“2段”整体替换为1,适用于序列化数据清洗与规则化处理。 本文介绍在pandas中识别数值连续段(streak),并基于前一段的值条件性修改当前段——例如将紧随“1段”之后的“2段”整...

Playwright如何用Python实现无头浏览器批量截图

是,默认启用;PlaywrightPython从v1.30+起,BrowserType.launch()默认headless=True,无需显式指定,但建议显式写headless=True以规避版本差异风险。 PlaywrightPython无头模式截图是否默认启用? Playwright的Brow...

如何使用Python批量修改文件名_通过os.rename实现自动化重命名

os.rename无法修改中文路径文件主因是路径类型错误或工作目录不匹配:需确保路径为str类型、使用绝对路径、先校验源存在且目标不存在;Python3.6+已原生支持UTF-8中文路径。 os.rename为什么改不了中文路径下的文件 Windows系统下用os.rename修改含中文的文件名,常...

如何批量将 Excel 文件动态转换为 CSV 文件(无需硬编码路径与文件名)

本文介绍使用Python自动遍历指定目录下所有.xlsx文件,逐个读取并保存为同名.csv文件的完整方案,避免硬编码路径和文件名,提升代码可移植性与健壮性。 本文介绍使用python自动遍历指定目录下所有`.xlsx`文件,逐个读取并保存为同名`.csv`文件的完整方案,避免硬编码路径和文件名,提升...

如何批量将目录下所有 Excel 文件动态转换为 CSV 文件

本文介绍使用Python批量读取指定目录中所有.xlsx文件,并自动将其转换为同名.csv文件,存入子目录,全程无需硬编码文件名或路径。 本文介绍使用python批量读取指定目录中所有`.xlsx`文件,并自动将其转换为同名`.csv`文件,存入子目录,全程无需硬编码文件名或路径。 在实际数据处理场...