原因
只出现在已存在 sharedStrings.xml(共享字符串表) 的 .xlsx 文件;
用 openpyxl 加载→修改单元格→保存后,长文本(通常 > 200--500 字符)后半段丢失;
调试时 cell.value 是完整的,仅写入后截断;
触发条件:
openpyxl ≥3.0(默认优先用 lxml);
lxml ≤5.3.x(有 bug);
文件使用 sharedStrings(Excel 默认开启)。
底层原因:旧版 lxml 在序列化 XML 长文本节点时,缓冲区处理不当导致截断,而 openpyxl 在写入 sharedStrings 时依赖了这个逻辑。
解决方法:升级 lxml 到 5.4.0+
bash
pip install --upgrade lxml
- lxml 5.4.0 修复了长文本序列化 bug;
- 无需改代码,openpyxl 自动使用新版 lxml。