繁体   English   中英

openpyxl error raise ValueError('Min value is {0}'.format(self.min)) 在打开带有格式的重文件时

[英]openpyxl error raise ValueError('Min value is {0}'.format(self.min)) in opening heavy file with formatting

我第一次尝试在一个非常大的文件上使用 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)

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

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

预处理文件

我通过预处理 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"是否会导致文件出现格式问题。 这是我的工作解决方案,无法真正说出这些标签的效果。

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

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

我遇到了同样的问题——该文件未被 Openpyxl 接受。

我刚刚在MS Excel中打开了文件,并保存到一个新文件中。 在那之后它起作用了。

我遇到了这个问题,我的解决方案是找出导致电子表格错误的原因(与最近修改的表格有关)并在工作表中重建该表格。 对我来说比调试 openpyxl 或 xml 容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM