You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用openpyxl保存calc文件丢失sharedStrings.xml的解决方案咨询

openpyxl 相关问题解答

openpyxl 没有直接保留原文件结构的开关,它的保存逻辑是基于内存中的工作簿对象重新生成完整的 xlsx 压缩包,不会继承原文件中未被识别、未被使用的文件。你遇到的 sharedStrings.xml 消失的问题,是因为 openpyxl 检测到当前工作簿内没有需要存储的共享字符串时,就不会生成这个文件。
对应解决方法如下:

  • 如果你只需要强制保留 sharedStrings.xml,可以在保存前手动向共享字符串集合中添加至少一个内容,示例代码如下:
wb = load_workbook(file_name)
# 你的原有处理逻辑
# 手动添加空字符串到共享字符串,触发生成sharedStrings.xml
wb.shared_strings.add("")
wb.save(file_name)
  • 如果你需要完全保留原文件的所有结构,建议不要通过 openpyxl 做保存操作,改为直接操作 xlsx 的原始 zip 包:用 Python 内置的 zipfile 模块解压原 xlsx 文件,修改你需要调整的 xml 部件后,再重新打包为 xlsx 格式,这种方式可以 100% 保留原有的目录结构和文件,不会丢失任何原文件内容。

xml.dom.minidom 保存问题解答

xml.dom.minidom 本身支持 xml 内容的序列化,你可以用 toprettyxml() 或者 toxml() 方法将修改后的 dom 对象转为字符串,再写入到对应 xml 文件中,之后配合 zipfile 模块完成整个 xlsx 文件的打包即可,示例逻辑如下:

from xml.dom.minidom import parse
import zipfile
import os

# 读取xlsx包内的xml文件
with zipfile.ZipFile("your_file.xlsx", "r") as zf:
    with zf.open("xl/sharedStrings.xml") as f:
        dom = parse(f)

# 此处插入你的dom修改逻辑

# 序列化修改后的dom
xml_content = dom.toxml(encoding="UTF-8")

# 写入回xlsx包
with zipfile.ZipFile("temp.xlsx", "w", zipfile.ZIP_DEFLATED) as zf_out:
    with zipfile.ZipFile("your_file.xlsx", "r") as zf_in:
        # 复制所有原有文件
        for item in zf_in.infolist():
            if item.filename != "xl/sharedStrings.xml":
                zf_out.writestr(item, zf_in.read(item.filename))
        # 写入修改后的xml
        zf_out.writestr("xl/sharedStrings.xml", xml_content)

# 替换原文件
os.replace("temp.xlsx", "your_file.xlsx")

内容的提问来源于stack exchange,提问作者Its Me

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 17:00:05