【问题标题】:openpyxl error raise ValueError('Min value is {0}'.format(self.min)) in opening heavy file with formattingopenpyxl error raise ValueError('Min value is {0}'.format(self.min)) 在打开带有格式的重文件时
【发布时间】:2021-06-04 13:33:58
【问题描述】:

我第一次尝试在一个非常重的文件上使用 openpyxl,它恰好超过 20 500 Ko,有很多格式和 VBA 宏。

我的代码不断返回以下错误:

File " \Anaconda3\lib\site-packages\openpyxl\styles\alignment.py", line 52, in __init__
    self.relativeIndent = relativeIndent
 
  File " \Anaconda3\lib\site-packages\openpyxl\descriptors\base.py", line 107, in __set__
    raise ValueError('Min value is {0}'.format(self.min))
 
ValueError: Min value is 0

有人知道问题出在哪里/如何访问该文件吗?我正在尝试将数据发布到现有的 Excel 文件中以简化流程并替换繁重的 VBA 代码。所以我不能只是将它发布到不同的 xlsx 文件中并使用 VBA 代码调用它(这会破坏目的)。

非常感谢!

这是我的代码:

wb = load_workbook(filename='C:/dev/CodeRep/ProjectName/MainFile 2021_01.xlsm', read_only = False, keep_vba = True)

【问题讨论】:

  • 这当然不可能是您的全部代码。回溯说的是您试图将单元格上的相对缩进更改为负值,这是不允许的。
  • @TimRoberts 公平地说,例外没有说明提供的值是什么。也许我们应该把它添加到消息中。

标签: python vba openpyxl valueerror xlsm


【解决方案1】:

回溯表明工作簿样式表中的对齐定义存在问题。 openpyxl 非常严格地遵循 OOXML 规范,以尽量减少以后不愉快的意外,这就是为什么它倾向于引发异常或给出警告而不是让事情过去。

要了解更多细节,我们需要查看样式表的 XML 源代码,或者至少查看对齐部分。您可以通过解压缩 XLSM 文件并查找 styles.xml 文件来找到它。这将为您提供更多信息,并允许您向 openpyxl 提交错误报告。

【讨论】:

    【解决方案2】:

    预处理文件

    我通过预处理 excel 文件解决了这个问题。

    发现mi问题出在“*/myfile.xlsx/xl/styles.xml”,其中几个xf标签有一个属性indent="-1",而openpyxl只支持非负值,当一个负数时引发该异常找到值。

    在尝试覆盖整个 openpyxl 层次结构以捕获异常之后,我决定处理 XLSX。

    这是我的代码:

    def fix_xlsx(file_name):
        with zipfile.ZipFile(file_name) as input_file, zipfile.ZipFile(file_name + ".out", "w") as output_file:
             # Iterate over files
             for inzipinfo in input_file.infolist():
                with input_file.open(inzipinfo) as infile:
                    if "xl/styles.xml" in inzipinfo.filename:
                        # Read, Process & Write
                        lines = infile.readlines()
                        new_lines = b"\n".join([line.replace(b'indent="-1"', b'indent="0"') for line in lines])
                        output_file.writestr(inzipinfo.filename, new_lines)
                    else:
                        # Read & Write
                        output_file.writestr(inzipinfo.filename, b"\n".join([line for line in infile.readlines()]))
        # Replace file
        os.replace(file_name + ".out", file_name)
    

    免责声明:

    我必须说这不是一个非常优雅的解决方案,因为处理了整个文件,并且使用了一个辅助文件。 另外,我不是 excel 专家,无法判断将这些标签的 indent="-1" 更改为 indent="0" 是否会导致文件出现格式问题。这是我的工作解决方案,无法真正说出这些标签的效果。

    【讨论】:

      【解决方案3】:

      我遇到了同样的错误并且无法找出确切的原因,但是当我在不同的环境中运行我的 python 脚本时发现它没有问题。

      我意识到这可能与我使用的 openpyxl 和 xlrd 软件包的版本有关,所以我将它们降级为 openpyxl==3.0.4xlrd==1.2.0(之前使用 openpyxl==3.0.7xlrd==2.0.1)并解决了我的问题。

      【讨论】:

        猜你喜欢
        • 2020-04-29
        • 2023-03-19
        • 2020-06-06
        • 2020-09-06
        • 1970-01-01
        • 2019-09-26
        • 2019-01-18
        • 2021-03-27
        • 2021-02-21
        相关资源
        最近更新 更多