openpyxl错误在打开带有格式的重文件时引发ValueError('Min值为{0}'。格式(self.Min))

2024-09-30 00:33:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我第一次尝试在一个非常重的文件上使用openpyxl,这个文件刚好超过20500千,有很多格式和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)

Tags: 文件代码inpyselflibpackagesline
3条回答

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

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

我遇到了同样的错误,无法找出确切的原因,但我注意到,当我在不同的环境中运行python脚本时,它工作正常

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

预处理文件

我通过预处理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专家,我不知道wheter将这些标记的indent="-1"更改为indent="0"可能会导致文件中的格式问题。这是我的工作解决方案,不能真正说出这些标签的效果

相关问题 更多 >

    热门问题