【问题标题】:Openpyxl: 'ValueError: Max value is 14' when using load_workbookOpenpyxl:使用 load_workbook 时出现“ValueError:最大值为 14”
【发布时间】:2018-10-18 14:25:41
【问题描述】:

我试图打开一个 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
"""

我意识到我使用的excel文件超过了self.max的限制。

我自己尝试过筛选 openpyxl 脚本,但我无法弄清楚 self.max 指的是什么,或者我如何更改我的 Excel 文件以便加载工作簿。

谁能指出我正确的方向?

提前致谢!

【问题讨论】:

    标签: python excel pandas openpyxl valueerror


    【解决方案1】:

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

    在 Libreoffice 中;全选,“清除直接格式”

    【讨论】:

    • 我遇到了类似的问题,这给了我这个错误:'min value is {0}' 用于通过使用 openpyxl 引擎的pd.read_excel 加载 Excel 文件。按照您在此处的建议,我通过 清除所有格式 解决了这个问题,并且没有问题!谢谢!!
    【解决方案2】:

    以下是为我解决此错误的原因。 我编辑了 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) 并保存。
    经过这一切,错误消失了。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这很有趣。我自己没有任何评论框,但我可能有其他东西与 self.max 中的评论框混为一谈。我会做一些挖掘工作。感谢您的回答!
      【解决方案4】:

      如果您在 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)
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          这是一个excel文件生成的WPS,而不是MS office。

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

          【讨论】:

            【解决方案7】:

            您可以修补特定描述符的最大值,而不是修补 __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,您将允许 all 描述符的潜在错误值。这种方法更具外科性,因为它只修补导致错误的字体系列描述符。

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-23
                • 2015-01-30
                • 1970-01-01
                • 1970-01-01
                • 2021-05-31
                相关资源
                最近更新 更多