簡體   English   中英

Openpyxl: 'ValueError: Max value is 14' 使用 load_workbook 時

[英]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。

  1. 你可以使用xlwings來打開它。
  2. 您可以手動保存到 CSV 文件並閱讀。

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM