openpyxl保存时自定义命名样式的Style Includes复选框异常全选问题
openpyxl保存后自定义样式的“Style Includes”复选框全勾选问题解决
问题概述
使用openpyxl加载包含自定义命名样式myNewStyle的Excel文件,直接保存为新文件后,新文件中该样式的“Style Includes”所有复选框被自动勾选,与原文件仅部分勾选的状态不符,影响后续手动编辑Excel。
复现代码:
import openpyxl workbook = openpyxl.load_workbook("testStyle.xlsx") # 加载含自定义样式的Excel workbook.save("newExcelFile.xlsx") # 直接保存为新文件
测试环境:Python 3.10,openpyxl==3.1.5,尝试过xlsm格式加keep_vba=True,问题依旧。
问题原因
openpyxl解析Excel自定义样式时,默认会将所有样式属性标记为“包含”(对应复选框勾选状态),即使原文件中部分属性未被选中。这是因为openpyxl未完整保留原样式中“哪些属性被显式设置”的标记,加载后默认认为所有属性都被包含,导致保存时强制勾选所有复选框。
解决方案
加载工作簿后,手动修改目标自定义样式的_includes字典,对应原文件中未勾选的复选框,将其值设为False。_includes字典的键与“Style Includes”选项的对应关系:
font:字体fill:填充border:边框alignment:对齐方式number_format:数字格式protection:保护
示例代码(假设原样式仅勾选了“字体”):
import openpyxl workbook = openpyxl.load_workbook("testStyle.xlsx") # 获取目标自定义样式 custom_style = workbook.named_styles["myNewStyle"] # 按照原文件复选框状态设置_includes custom_style._includes = { "font": True, "fill": False, "border": False, "alignment": False, "number_format": False, "protection": False } workbook.save("newExcelFile.xlsx")
注意事项
- 需根据原文件实际的复选框状态调整
_includes的键值对,确保与原样式一致。 _includes是openpyxl的内部属性,未来版本可能存在变更,但在3.1.5版本中可正常使用。
内容的提问来源于stack exchange,提问作者Richard Jones
相关产品推荐
相关产品推荐

