使用openpyxl调用load_workbook时触发ValueError: Max value is 14
搞定Openpyxl加载Excel时的
ValueError: Max value is 14报错 问题还原
你说用openpyxl加载某个目标Excel文件时,刚执行load_workbook(self.directory)就炸了,抛出ValueError: Max value is 14,但其他文件测试都正常——你的需求是把DataFrame插入指定工作表,同时保留其他工作表不变对吧?
为啥会出这问题?
这个报错大概率和目标Excel里的单元格格式/样式有关:
- 旧版的openpyxl对Excel的数字格式ID(
numFmtId)有严格限制,超过14的自定义格式它就认不出来了; - 要么就是文件里有损坏的样式定义,或者用了openpyxl不兼容的特殊格式(比如某些第三方插件生成的奇怪格式)。
给你几个解决思路,按顺序试就行:
1. 先把openpyxl更到最新版
旧版本的格式兼容性拉胯,升级之后很多这类问题直接就没了,执行这个命令就行:
pip install --upgrade openpyxl
2. 加载时跳过样式解析
如果升级后还是不行,那就在加载文件的时候告诉openpyxl别管样式,只加载单元格的值:
from openpyxl import load_workbook # data_only=True会加载计算后的值,不加载公式和样式;如果需要保留公式,只去掉data_only参数即可 book = load_workbook(self.directory, data_only=True)
要是文件特别大,也可以试试只读模式,但只读模式没法修改保存,适合只读取数据的场景:
book = load_workbook(self.directory, read_only=True)
3. 手动修复Excel文件本身
打开那个出问题的Excel,做这几件事:
- 检查所有单元格的自定义格式,删掉那些看起来异常的格式;
- 另存为一个新的.xlsx文件(别直接覆盖原文件,留个备份),然后用脚本加载新文件试试;
- 如果文件带宏,记得另存为
.xlsm格式,加载的时候加上keep_vba=True:
book = load_workbook(self.directory, keep_vba=True)
4. 换个思路用pandas辅助实现需求
如果你的核心目的是把DataFrame插入指定工作表,其实可以用pandas来帮你处理文件读写,绕开直接用openpyxl加载的坑:
import pandas as pd from openpyxl import load_workbook # 先把所有工作表读成DataFrame字典 all_sheets = pd.read_excel(self.directory, sheet_name=None) # 把你要插入的DataFrame替换掉目标工作表(假设目标表叫"TargetSheet") all_sheets["TargetSheet"] = your_dataframe # 把所有工作表写回Excel,替换原目标表 with pd.ExcelWriter(self.directory, engine="openpyxl", mode="a", if_sheet_exists="replace") as writer: for sheet_name, df in all_sheets.items(): df.to_excel(writer, sheet_name=sheet_name, index=False)
建议尝试顺序
优先试升级openpyxl,这是成本最低的解决方式;不行再试跳过样式加载;最后再考虑修复文件或者换用pandas的方法。
内容的提问来源于stack exchange,提问作者Emil Zaharia-Kezdi
相关产品推荐
相关产品推荐

