我提供此作为答案并带有 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() 的调用仅仅是为了检查修改后的电子表格的有效性