首页 > 解决方案 > 无法通过 Python 读取 excel 文件 - 解决方法?

问题描述

使用各种 python 库——Pandas、xlrd、openpyxl——是不可能的。我遇到与此处相同的错误:Openpyxl: 'ValueError: Max value is 14' when using load_workbook

我用过pandas.read_excel(引擎=openpyxl)。

我试过的示例代码:

import pandas as pd
import os
from openpyxl import Workbook,load_workbook


download_folder = "path"
excel='sample.xlsx'
xls = pd.read_excel(download_folder+excel, sheet_name='Sheet1',header=1,skiprows=list(range(5)))

#wb = load_workbook(filename = download_folder+excel)

总是返回相同的错误:

   raise ValueError('Max value is {0}'.format(self.max))
ValueError: Max value is 14

标签: pythonexcelgmail

解决方案


我提出这个作为一个巨大警告的答案。我能够在 macOS 上为我完成这项工作。我不能保证它会在其他地方或任何其他人的特定 Excel 文件中工作。

该问题与字体系列值有关。我不知道为什么 14 这个神奇的数字会起作用,但它就是这样。此外,我不知道在 Excel 中会做什么以导致出现 14 以上的值。所以这就是我所做的......

我创建了一个非常基本的 Excel 电子表格。Excel 文件只是 zip 风格的档案,所以我解压缩了我的 .xlsx 文件。作为该摘录的一部分,我们看到 xl/styles.xml 并且在其中我们看到了这个摘录:-

<fonts count="1" x14ac:knownFonts="1">
        <font>
            <sz val="12" />
            <color theme="1" />
            <name val="Calibri" />
            <family val="2" />
            <scheme val="minor" />
        </font>
    </fonts>

当大于 14 时,family元素的val属性会导致问题。

然后我修改了 xl/styles.xml 以包含:-

<family val="22" />

现在,如果我重新打包提取的数据(即重新构建 Excel 文件),然后尝试使用openpyxl在 Python 中打开它,我会得到@NewGirl 观察到的异常

但我们可以修复它。该过程涉及提取(解压缩)电子表格、解析 xl/styles.xml 并在家庭元素中查找不适当的值。然后我们重新编写 XML 文件并重新打包电子表格。

警告:如果这对您不起作用,它很可能会损坏您的电子表格,因此请务必复制一份!

这是代码: -

import tempfile
from openpyxl import load_workbook
import os
import shutil
from lxml import etree


EXCELFILE = '~/Book1.xlsx'
STYLES = 'xl/styles.xml'
FORMAT = 'zip'


with tempfile.TemporaryDirectory() as tdir:
    os.chdir(tdir)
    shutil.unpack_archive(filename=EXCELFILE, format=FORMAT)
    with open(STYLES, 'r') as styles:
        tree = etree.parse(styles)
        for family in tree.xpath('//*[local-name()="fonts"]//*[local-name()="font"]//*[local-name()="family"]'):
            try:
                if int(family.attrib['val']) > 14:
                    family.set('val', '2')
            except Exception:
                pass
    with open(STYLES, 'wb') as styles:
        tree.write(styles)
    shutil.make_archive(base_name=EXCELFILE, format=FORMAT)
    shutil.move(f'{EXCELFILE}.{FORMAT}', EXCELFILE)

load_workbook(EXCELFILE)

调用 load_workbook() 只是为了检查修改后的电子表格的有效性


推荐阅读