Openpyxl: 'ValueError: Max value is 14' when using load_workbook

问题描述 投票:0回答:11

我试图打开一个 excel 文件,我需要在其中向某些工作表插入数据框,同时保留其他工作表。当我在其他 excel 文件上测试它时,该脚本工作正常。当我在我真正需要的那个上使用它时,我收到一条错误消息。

这是脚本:

from openpyxl import load_workbook
book = load_workbook(self.directory)

Self.directory 指的是我的文件位置。正如您在回溯中看到的那样,当尝试执行 load_workbook() 时,它已经在此行失败,并给出以下错误消息:

ValueError:最大值为 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 文件以便加载工作簿。

谁能指出我正确的方向?

提前致谢!

python excel pandas openpyxl valueerror
11个回答
3
投票

我不得不删除我正在使用的工作表中的所有格式。

在自由办公室;全选,“清除直接格式”


2
投票

这是为我修复此错误的原因。 我编辑了 lib\site-packages\openpyxl\descriptors ase.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) 并保存。
所有这一切之后,错误就消失了。


2
投票

对于 Pandas 的使用——如何彻底清除 XLSX 样式

这将修复各种样式错误,例如

'ValueError: Max value is 14'

1. 在自动加载的 init.py 文件之一中添加您自己的熊猫 XLSX 引擎

from openpyxl.reader.excel import ExcelReader
from openpyxl.xml import constants as openpyxl_xml_constants
from pandas import ExcelFile
from pandas.io.excel._openpyxl import OpenpyxlReader

class OpenpyxlReaderWOFormatting(OpenpyxlReader):
    """OpenpyxlReader without reading formatting
    - this will decrease number of errors and speedup process
    error example https://stackoverflow.com/q/66499849/1731460 """

    def load_workbook(self, filepath_or_buffer):
        """Same as original but with custom archive reader"""
        reader = ExcelReader(filepath_or_buffer, read_only=True, data_only=True, keep_links=False)
        reader.archive.read = self.read_exclude_styles(reader.archive)
        reader.read()
        return reader.wb

    def read_exclude_styles(self, archive):
        """skips addings styles to xlsx workbook , like they were absent
        see logic in openpyxl.styles.stylesheet.apply_stylesheet """

        orig_read = archive.read

        def new_read(name, pwd=None):
            if name == openpyxl_xml_constants.ARC_STYLE:
                raise KeyError
            else:
                return orig_read(name, pwd=pwd)

        return new_read

ExcelFile._engines['openpyxl_wo_formatting'] = OpenpyxlReaderWOFormatting
print('Monkey patching pandas XLS engines. See OpenpyxlReaderWOFormatting')

2. 使用它,读取XLSX文件时指定engine='openpyxl_wo_formatting'

import pandas as pd
df = pd.read_excel(filepath, engine='openpyxl_wo_formatting')

2
投票

您可以修补特定描述符的最大值,而不是修补

__set__
方法。

这种方法更具手术性,因为它只修补导致错误的字体系列描述符。相比之下,如果您按照其他答案中的建议修补

descriptors\base.py
,您将允许all描述符的潜在错误值,而不仅仅是字体系列。

# 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!

此方法使用

mock
,但原则上您也可以修补包含
.py
描述符的
openpyxl.styles.fonts.Font.family.max
文件。


1
投票

在删除工作表上的第 15 个以上的小“评论框”后,我能够解决这个错误。


1
投票

是WPS生成的excel文件,不是MS office。

  1. 可以用xlwings打开
  2. 您可以手动保存到CSV文件并阅读。

1
投票

如果您抑制/注释掉 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)

0
投票

评论数量没有解决我的问题。我不得不删除一些工作表,直到总共有 14 个工作表才能打开/阅读文档。


0
投票

我遇到了同样的问题——文件中的字体不受支持。

我刚刚在 MS Excel 中打开文件,将字体重置为基本的 Arial 并保存了一个新文件。 Openpyxl 接受了新文件。


0
投票

如果工作簿中的文件超过 14 个,则会出现此错误。所以,尝试将excel的内容粘贴到一个新文件中,然后尝试加载它。这解决了我的问题。希望它也能解决你的问题。


-1
投票

只需注释掉 openpyxl 中引发错误的代码行。

© www.soinside.com 2019 - 2024. All rights reserved.