.docx和.xlsx本质是zip压缩包而非纯xml文件,解压后才可见xml文件;直接修改xml易破坏结构,因ooxml存在关系依赖、字符串索引、命名空间等严格规范。

docx/xlsx 真的是 XML 文件?别被字面意思骗了
不是“是 XML 文件”,而是“里面装着 XML 文件”——.docx 和 .xlsx 本质是 ZIP 压缩包,解压后才能看到一堆 XML(比如 document.xml、sharedStrings.xml),但直接用 xml.etree.ElementTree 打开并修改这些 XML,十有八九会破坏文档结构,导致 Word 或 Excel 打不开。
原因很简单:OOXML 规范里存在大量隐式依赖,比如:
-
relationships文件定义了部件之间的引用关系(比如图片在哪、样式表在哪) -
sharedStrings.xml把重复文本抽出来统一索引,改正文本不更新索引 = 文字变乱码 - 命名空间(
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main")必须严格匹配,漏一个前缀就解析失败
python-docx 和 openpyxl 为什么不能互相替代
python-docx 只能读写 .docx,openpyxl 只能处理 .xlsx,它们底层都封装了 OOXML 的复杂性,但封装路径完全不同——不是“同一套 API 换个后缀”,而是两套独立实现。
常见误用场景:
- 想用
python-docx修改表格里的公式?不行,它不解析 Excel 公式引擎 - 用
openpyxl给 Word 插入带样式的段落?根本没这个接口,连Document类都没有 - 试图把
.xlsx当成.docx传给Document()构造函数 → 报错KeyError: 'word/document.xml'
手动解压改 XML 的适用场景和致命风险
极少数情况可以手动操作 ZIP+XML,比如批量替换文档中所有硬编码的旧域名、删除特定嵌入对象(如无用的 OLE 链接),但前提是:你清楚自己在动哪几个文件、是否影响关系映射、是否要同步更新校验值(如 app.xml 里的页数统计)。
容易踩的坑:
- 用普通 ZIP 工具(如 Windows 自带压缩功能)重新打包 → 缺少 ZIP 中央目录顺序或压缩方式错误 → Office 拒绝打开
- 修改
document.xml后忘了更新core.xml里的修改时间戳 → Word 提示“文件已损坏,尝试恢复?” - 用 Notepad++ 直接保存 XML → 默认加了 BOM 头 →
lxml解析时报XMLSyntaxError: Document is empty
怎么判断该用库还是该碰 ZIP
看改动粒度:
- 改文字内容、段落样式、表格行列、单元格值、图表数据 → 用
python-docx/openpyxl - 删整个
media/下某张图、替换所有embeddings/中的旧 PPT 对象、清除所有vbaProject.bin→ 解压 ZIP 更直接 - 需要保留原始格式微调(比如只改某个字体名但不动其他样式链)→ 别碰 XML,
openpyxl的font.name或python-docx的run.font.name更安全
OOXML 的“XML”是给机器读的协议层,不是给人手写的配置文件;它的压缩包结构是契约,不是便利贴。真要绕过库,得先读透 ECMA-376 标准第1部分,而不是靠试错。










