码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Word修订内容批量标红


    最近改文章,期刊要求提供所有修改内容都标红的修订稿,本着能不手改就不手改的原则,我尝试检索了一下自动修改的方法,最先找到的是简书上的一篇使用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)
  • 相关阅读:
    R语言移除列表中的空元素(列表数据中包含NULL,移除NULL元素)、使用purrr包的compact函数删除NULL元素
    腾讯轻联:带你创造属于自己的AI小助手
    【Spring】AOP相关、五种增强方式、IoC与AOP注解开发、纯注解开发
    4.1.8- Web 应用程序使用的组件进行指纹识别
    一表总结前端axios传参与后端springboot接收
    optee4.0.0 qemu_v8的环境搭建篇(ubuntu20.10)
    第十五篇,STM32的SPI串行通信协议
    刚上线的App该如何做好ASO优化?
    Mycat
    软考系统架构师倒计时第6天
  • 原文地址:https://www.cnblogs.com/geoli91/p/16618266.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号