Python XLRD Error : formula/tFunc unknown FuncID:186

Python XLRD Error : formula/tFunc unknown FuncID:186

我被这个难住了,请帮助我哦,聪明的堆栈交换器...

我有一个使用 xlrd 读取 .xls 文件的函数,该文件是我公司每隔几个月发布一次的文件。该文件始终采用相同的格式,只是具有更新的数据。我过去在读取 .xls 文件时没有遇到问题,但最新版本的 .xls 文件未被读取并产生此错误:*** formula/tFunc unknown FuncID:186

我尝试过的事情:

有用信息:

我的猜测是新文件中有某种 xlrd 无法读取的公式。有人知道 FuncID: 186 是什么吗?

编辑:仍然不知道该去哪里。有人 运行 参与其中吗?我尝试搜索 FuncID 186 以查看它是否是 excel 函数,但无济于事...

我遇到了同样的问题,我认为我们必须查看单元格 excel,确保这些单元格没有空着,我就是这样解决的。

现在我只想确保 xlrd 读取正常。我破解了我的 xlrd 包,以便它加载。

我不保证输出的正确性。

只需在 pythonlibs/xlrd 包的 formula.py 中添加以下行。

在第 240 行附近,每个数字都映射到一个函数,在这里创建一个被黑函数。我在那里插入了 'HACKED'。我不明白到底发生了什么。

-- 添加了以 186 开头的行:

184: ('FACT', 1, 1, 0x02, 1, 'V', 'V'),
186: ('HACKED', 1, 1, 0x02, 1, 'V', 'V'), 
189: ('DPRODUCT', 3, 3, 0x02, 3, 'V', 'RRR'), 

这里是xlrd组的讨论。本质上,这是一个无法解决的复杂问题。 :)

https://groups.google.com/forum/#!topic/python-excel/ZS5PsC5A6iQ

在我们的案例中,一般原因是 "MySQL Excel COM add-in"。参见 BUG: XLS files saved by Excel 2013 on Windows cause AssertionError #154 in the python-excel xlrd repo on github

此加载项在电子表格中放置了一些全局公式(宏?)。通过打包我们自己的 xlrd .egg 并在各处设置 DEBUG = 1,我们能够看到:

name: u'LOCAL_DATE_SEPARATOR'
name: u'LOCAL_DAY_FORMAT'
name: u'LOCAL_HOUR_FORMAT'
name: u'LOCAL_MINUTE_FORMAT'
name: u'LOCAL_MONTH_FORMAT'
name: u'LOCAL_MYSQL_DATE_FORMAT'
name: u'LOCAL_SECOND_FORMAT'
name: u'LOCAL_TIME_SEPARATOR'
name: u'LOCAL_YEAR_FORMAT'

...在分析工作簿时,当其他人保存工作簿或禁用加载项时不存在。

OpenOffice 的 "Documentation of the Microsoft Excel File Format" document (pdf) 没有列出函数 ID 186,但似乎有各种证据表明这是某种命名函数间接寻址或调用。

似乎 answer here -- adding 186: ('HACKED', 1, 1, 0x02, 1, 'V', 'V'), to formula.py -- 可能会产生忽略所有这些条目的副作用:它似乎将 "HACKED()" 公式与 void arg 和 return 类型(我可能稍微误解了这一点)代替它。只要不尝试评估该公式,这可能会起作用,尽管没有更好地理解 186,但很难判断这是否会导致解析在某些情况下变得不同步。

如果我们能更好地理解问题或找到更安全的解决方法,将尝试 return 并更新此答案。