不要再用.doc和.wps文件后缀名了,使用.docx吧
在我去年的 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版本差异。