在我去年的 Word的信息泄露 里,我提到:如果还在用.doc文件,那Word版本一定非常非常老。

上周二10月14日,微软对Windows 10和Office 2019及以前的版本终止了支持,也就是,没有任何无需付费的技术支持、软件更新、安全更新或修补程序。

不要再用.doc文件后缀名了。

.doc的文件类型是:Word 97-2003 文档。实际上从Word 2007开始,你就应该开始只用.docx了。

当然,很多人的文件资源管理器可能设置了“隐藏已知文件类型的扩展名”,分不清啥.doc和.docx,这个很危险,但是不是今天要谈的。

.doc和.wps都是。.wps改成.doc,就可以在Word里打开,我没有仔细分析,很大概率其实是一样的。

我精通Word。这个精通不是你们写在简历里的“精通”2个字,而是真的精通。

我精通不是因为我比你们聪明,只是因为我知道从现在开始的5分钟之后之前你们还不知道的一些方法。

简单点说,就是你还在用望闻问切,而我借助工具已经用显微镜、红外、超声、X光、CT、PETCT、磁共振、电镜从表层看进灵魂。

.doc有什么问题

它是封闭的,没有公开的标准。.doc文件结构完全是微软内部定义的,没有公开规范。别人只能靠反编译、逆向工程去兼容,还有潜在的法律风险。

这个文件结构怎么说呢?搞网络的都知道IP报文,由首部加数据部分组成。首部里面还有很多字段。在payload部分,还可以打包各类上层协议,一层一层往上叠。

如果你用Java来实现,会从使用POJO进化到使用Record。反编译结果就是一堆互相嵌套的Record记录类。可能某些字段还会搞错。

字段值是二进制格式的。二进制格式里混合文本、字体、样式、图像流,调试和修复非常困难。

而且它自身版本兼容性差。由于格式太老了,没有预留扩展的空间,Word 95、97、2000、2003 的Record记录类结构都不同。版本升级常导致文档格式错乱。国密标准也塞不进去。

上面都还好,但是要命的是它会带来安全问题

因为是二进制结构,格式未公开,不易检测宏病毒、嵌入代码、OLE对象等恶意内容。加个什么东西,你完全是不知道的。

合规问题也很大,很多政府组织要求使用开放格式。2005年起,国际标准组织(OASIS)推出了ODF(OpenDocument Format),并被政府和开源社区OpenOffice、LibreOffice广泛采用。所以微软也就推出了Office Open XML (OOXML),并且承诺任何人(个人或组织)都可自由实现和使用OOXML标准,无需支付版权费或担心专利诉讼,并且附带不能撤回条款。

如果你要正版化,并且担心被人卡脖子,你应该使用.docx或者.odt后缀名的文件。其中ODF是唯一真正完全开放、厂商中立的办公文档标准。

高校正版化软件实施过程中的一些问题,还要记住的是,不管是Office还是WPS,家庭版是不能用于商业用途的。

.docx的开放性

.docx解决了传统.doc格式存在的几乎所有问题。它采用了OOXML(Office Open XML)标准,是把一堆描述文档结构、样式、内容的 XML 文件打包在一起形成的文档。图片、音频、视频都是独立的,再使用zip压缩打包。

XML是啥?可以理解成是HTML的兄弟,俩人都是SGML这位“老妈”生的。

HTML随性、包容,错几个标签也能跑起来,所以在互联网传播和应用很广;而XML则严谨得多,讲究结构、讲究规范。

然而它们都是纯文本文件,用记事本、vi都能改,就算到了末日,都有工具可以改 一种整理大量照片的方法

你可以将一个.docx改名为.zip,然后解开,就会看到。

所以,有能力,你都可以自己实现一个docx的编辑器来代替Word。

精通

经常有些人说Word格式很乱,不好用,那是因为没有掌握方法。

“熟悉”顶多只是会用,“精通”才是融会贯通。很多人做很多事,正常做下去没问题,一旦中间遇到错误,不会纠正。

就像一个具身智能机器人,能顺利跑十米,算是“熟悉”。只有当它被人推、被踢、被干扰、被打乱节奏时,还能踉踉跄跄跑完全程,那才叫“精通”。

得益于OOXML的Open属性,让我可以精通Word。接下来,我将分享一些工具与方法,希望能为你深入熟悉、迈向精通提供参考。

借助Word本身分析纠错

  • 使用“样式检查器”的“显示格式”,可以查看格式任何细微的改变,可以比较2个地方格式的差异。
  • 通过”审阅“的”比较“,可以比较2个文档从内容到格式的所有修改。审稿人经常用。
  • 使用VBA直接输出对应段落的段落或者字体属性来分析问题。借助AI,你可以很简单就生成想要的代码,举个例子,输出所有段落首行缩进不是2个字符的段落。
Sub CheckParagraphIndent()
    Dim para As Paragraph
    Dim i As Long
    Dim indentTarget As Single
    Dim tolerance As Single
    
    indentTarget = CentimetersToPoints(0.74)  ' 约等于 2 个字符宽
    tolerance = 0.5  ' 允许浮动误差(单位:磅)
    
    Debug.Print "检查首行缩进不是 2 个字符的段落:"
    
    For i = 1 To ActiveDocument.Paragraphs.Count
        Set para = ActiveDocument.Paragraphs(i)
        
        ' 判断首行缩进是否在目标范围内
        If Abs(para.Format.FirstLineIndent - indentTarget) > tolerance Then
            Debug.Print "第 " & i & " 段首行缩进为 " & _
                        Format(para.Format.FirstLineIndent, "0.00") & " 磅"
        End If
    Next i
    
    Debug.Print "检查完成。"
End Sub

程序化控制Word的方法

微软提供了多种编程接口用于操作.docx文档,这些接口功能完备、文档详尽且易于使用。其中最直接的方式,是在Word自带的VBA环境中进行开发。

为了追求幂等、自动化和简洁性,我之前做的 Word样式的使用和管理办法/工作条例模板下载(最终版)中小学课程表模板最终版下载和Excel源码,都是通过程序生成的,其中的Excel源码,我也已经在公众号中公开分享过。

在Word里直接编辑,其实很容易出问题。你删了又加、改了又调,文档结构早就被mess up了。更麻烦的是,Word文件里排版之间往往是相互关联的,改一处会影响到另外一处。

所以我更倾向于用程序生成Word文档。

比如你要把正文字体从宋体改成黑体,通常得打开Word、全选、再一个个调整。而我只需要改一下程序里的参数,比如把字体字号改成对应的值,重新跑一遍脚本,就能生成一个全新的、干净的文件。LaTeX、Markdown都是这么干的。

这也就是为什么我的XML“隐蔽工程”能做得那么好——因为他们每次都是重新Build,而不是在旧的结构上反复修改。

以下是一些工具:

  • Word VBA,Word自带的,可查看 https://learn.microsoft.com/en-us/office/vba/api/overview/word
  • Interop(COM),必须安装Office,类似RPA一样操作Word,可查看 https://learn.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word?view=word-pia
  • Open XML SDK for Office,不需要安装Office即可使用,可查看 https://learn.microsoft.com/en-us/office/open-xml/open-xml-sdk
  • 开源软件类库,比如Python的python-docx、docx2txt、openpyxl等等等
  • Sphinx、Pandoc、OpenOffice、LibreOffice等等打开或保存.docx的开源代码片段

其他软件

  • 使用zip加记事本。这个 http://officeopenxml.com/anatomyofOOXML.php 链接有.docx所有的结构,有详细的例子。
  • 使用Visual Studio Code的OOXML Viewer插件,以树状结构查看每个Part(XML部分)、查看修改内容、diff版本差异。