如何使用Python读取包含扩展字体的Excel文件?(openpyxl 错误:最大值为 14)

Zep*_*hyr 3 python excel pandas openpyxl

作为 Python 的学习项目,我尝试读取目录中的所有 Excel 文件并提取所有工作表的名称。

我一直在尝试几个可用的 Python 模块来执行此操作(pandas在本示例中),但遇到了其中大多数依赖于openpyxl.

这是我当前的代码:

import os
import pandas

directory_root = 'D:\\testFiles'

# Dict to hold all files, stats
all_files = {}

for _current_path, _dirs_in_path, _files_in_path in os.walk(directory_root):

    # Add all files to this `all_files`
    for _file in _files_in_path:
        # Extract filesystem stats from the file
        _stats = os.stat(os.path.join(_current_path, _file))

        # Add the full file path and its stats to the `all_files` dict.
        all_files[os.path.join(_current_path, _file)] = _stats

# Loop through all found files to extract the sheet names
for _file in all_files:

    # Open the workbook
    xls = pandas.ExcelFile(_file)

    # Loop through all sheets in the workbook
    for _sheet in xls.sheet_names():
        print(_sheet)
Run Code Online (Sandbox Code Playgroud)

openpyxl这会在调用pandas.ExcelFile():时引发错误ValueError: Max value is 14

据我在网上找到的信息,这是因为该文件包含 14 以上的字体系列。如何读取 Excel (xlsx) 文件,同时忽略任何现有格式?

我能找到的唯一潜在解决方案建议修改原始文件并删除格式,但这不是一个选项,因为我不想以任何方式修改文件。

有没有另一种方法可以做到这一点,而没有这种格式限制?

syt*_*ech 5

问题是您的文件不符合 Open Office 规范。仅允许某些字体系列。一旦openpyxl遇到不符合规范的字体,就会抛出此错误,因为OpenPyxl 只允许符合规范的 excel 文件

某些 Excel 阅读器可能不会遇到此问题,并且对于不符合 OpenOffice 规范的文件更加灵活,但 openpyxl 仅实现 Apache Open Office 规范。

正在解析的 xml 将包含有关字体的信息,如下所示:

<font>
  <b/>
  <sz val="11"/>
  <color rgb="FF000000"/>
  <name val="Century Gothic"/>
  <family val="34"/>
</font>
Run Code Online (Sandbox Code Playgroud)

如果 family 值超过 14,openpyxl 会抛出此异常ValueError。Open Office 中有一个底层描述符可以控制这一点。

当其他读者(例如 Microsoft Office 365 Excel)遇到这种情况时,它会在将文件加载到兼容字体(默认字体 Calibri)时更改字体系列。

作为解决方法,如果您不想更改该值(如 Microsoft Excel 所做的那样),您可以对描述符进行猴子修补以允许更大的最大字体系列。

<font>
  <b/>
  <sz val="11"/>
  <color rgb="FF000000"/>
  <name val="Century Gothic"/>
  <family val="34"/>
</font>
Run Code Online (Sandbox Code Playgroud)

可以使用此 Excel 工作簿重现此​​内容。在补丁之前,这将无法加载。打完补丁后,加载没有错误。