![](/img/trans.png)
[英]Python openpyxl load_workbook Errors: TypeError (NoneType not Iterable) and ValueError (Max. Value is 180)
[英]Openpyxl: 'ValueError: Max value is 14' when using load_workbook
我试图打开一个 excel 文件,在该文件中我需要将数据框插入某些工作表,而其他工作表则不理会。 当我在其他 excel 文件上测试它时,该脚本运行良好。 当我在我真正需要的地方使用它时,我收到一条错误消息。
这是脚本:
from openpyxl import load_workbook
book = load_workbook(self.directory)
Self.directory 是指我的文件位置。 正如您在回溯中看到的,当尝试执行 load_workbook() 时,它已经在这一行失败,并给出以下错误消息:
值错误:最大值为 14
这是相关的回溯(我离开了从虚拟环境文件夹“virtual”开始的目录位置):
"""
book = load_workbook(self.directory)
virtual\lib\site-packages\openpyxl\reader\excel.py", line 217, in load_workbook
shared_strings = read_string_table(archive.read(strings_path))
virtual\lib\site-packages\openpyxl\reader\strings.py", line 22, in read_string_table
text = Text.from_tree(node).content
virtual\lib\site-packages\openpyxl\descriptors\serialisable.py", line 84, in from_tree
obj = desc.expected_type.from_tree(el)
virtual\lib\site-packages\openpyxl\descriptors\serialisable.py", line 84, in from_tree
obj = desc.expected_type.from_tree(el)
virtual\lib\site-packages\openpyxl\styles\fonts.py", line 110, in from_tree
return super(Font, cls).from_tree(node)
virtual\lib\site-packages\openpyxl\descriptors\serialisable.py", line 100, in from_tree
return cls(**attrib)
virtual\lib\site-packages\openpyxl\cell\text.py", line 114, in __init__
self.family = family
virtual\lib\site-packages\openpyxl\descriptors\nested.py", line 36, in __set__ 6, in __set__
super(Nested, self).__set__(instance, value)
virtual\lib\site-packages\openpyxl\descriptors\base.py", line 110, in __set__ , in __set__
super(Min, self).__set__(instance, value)
virtual\lib\site-packages\openpyxl\descriptors\base.py", line 89, in __set__ in __set__
raise ValueError('Max value is {0}'.format(self.max))
ValueError: Max value is 14
"""
我意识到我使用的 excelfile 超出了 self.max 的限制。
我尝试自己筛选 openpyxl 脚本,但我无法弄清楚 self.max 指的是什么,或者如何更改我的 Excel 文件以便我可以加载工作簿。
谁能指出我正确的方向?
提前致谢!
我不得不删除我正在使用的工作表中的所有格式。
在 Libreoffice 中; 全选,“清除直接格式”
这是为我修复此错误的方法。 我编辑了lib\\site-packages\\openpyxl\\descriptors\\base.py并在类 Max 的第 86 行之后添加了一个打印语句,如下所示:
def __set__(self, instance, value):
if ((self.allow_none and value is not None)
or not self.allow_none):
value = _convert(self.expected_type, value)
if value > self.max:
print(f"value is {value}")
raise ValueError('Max value is {0}'.format(self.max))
super(Max, self).__set__(instance, value)
这打印了 34 的值,这显然高于最大值 14(这是一个字体系列值)。
然后,我使用 .zip 扩展名保存了我的 Excel 电子表格的副本,提取了所有 XML 文件,然后使用 grep 搜索 val="34"。 这让我找到了 3 个以某种方式具有 font-family=34 的单元格。 我在 Excel 中将字体更改为其他字体,保存电子表格,然后将其更改回原始字体 (Arial) 并保存。
在这一切之后,错误消失了。
删除工作表上第 15 个以上的小“评论框”后,我能够解决该错误。
评论的数量并没有解决我的问题。 我不得不删除一些工作表,直到我总共得到 14 个工作表以下才能打开/阅读文档。
它是由 WPS 生成的 excel 文件,但不是 MS Office。
如果您在 openpyxl 中抑制/注释掉如下所示的异常,问题将得到解决:
def __set__(self, instance, value):
if ((self.allow_none and value is not None)
or not self.allow_none):
value = _convert(self.expected_type, value)
if value > self.max:
self.max=self.max
#raise ValueError('Max value is {0}'.format(self.max))
super(Max, self).__set__(instance, value)
它解决了问题,现在我可以使用
pd.read_excel(io.BytesIO(obj['Body'].read()), engine='openpyxl', sheet_name=[0], header=None)
只需注释掉 openpyxl 中引发错误的代码行。
您可以修补特定描述符的最大值,而不是修补__set__
方法。
# IMPORTANT, you must do this before importing openpyxl
from unittest import mock
# Set max font family value to 100
p = mock.patch('openpyxl.styles.fonts.Font.family.max', new=100)
p.start()
import openpyxl
openpyxl.open('my-bugged-worksheet.xlsx') # this works now!
如果您修补descriptors\\base.py
您将允许所有描述符使用潜在的错误值。 这种方法更具手术性,因为它只修补导致错误的字体系列描述符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.