【问题标题】:Cannot read excel file via Python - workarounds?无法通过 Python 读取 excel 文件 - 解决方法?
【发布时间】:2021-11-19 10:39:09
【问题描述】:

无法使用各种 python 库 - Pandas、xlrd、openpyxl。我遇到了和这里一样的错误:Openpyxl: 'ValueError: Max value is 14' when using load_workbook.

我使用了pandas.read_excel (engine=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

【问题讨论】:

  • 您是否尝试过使用 xlwings?您参考的 SO 帖子中的一个答案表明 xlwings 可以处理此字体系列问题
  • 是的,我试过了,问题是它需要安装 excel,但这是不可能的

标签: python excel gmail


【解决方案1】:

我提供此作为答案并带有 MASSIVE 警告。我能够在 macOS 上为我完成这项工作。我不能保证它会在其他地方或任何其他人的特定 Excel 文件中工作。

问题与字体系列值有关。我不知道为什么 14 的 magic 数字会起作用,但它就是这样。此外,我不知道在 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>

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

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

<family val="22" />

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

但我们可以解决它。该过程包括提取(解压缩)电子表格、解析 xl/styles.xml 并在 family 元素中查找不适当的值。然后我们重新编写 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() 的调用仅仅是为了检查修改后的电子表格的有效性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多