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
我尝试过的事情:
我将新的 .xls 文件与旧的进行了比较,看是否能发现任何问题
差异。 None 我能找到。
我删除了文件中包含的所有宏(旧版本也有宏)
已将 xlrd 更新到版本 0.9.3 但出现相同的错误
这些文件最初是 .xlsm 文件。我打开它们并将它们另存为
.xls 文件,以便 xlrd 可以读取它们。这在文件的先前版本上工作得很好。升级到据称支持 .xlsx 的 xlrd 0.9.3 后,我尝试保存 .xlsm 文件 as.xlsx 并尝试读入它,但出现错误并显示空白错误消息
有用信息:
- Python 2.7
- xlrd 0.9.3
- Windows 7(不确定这是否重要但是...)
我的猜测是新文件中有某种 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 并更新此答案。
我被这个难住了,请帮助我哦,聪明的堆栈交换器...
我有一个使用 xlrd 读取 .xls 文件的函数,该文件是我公司每隔几个月发布一次的文件。该文件始终采用相同的格式,只是具有更新的数据。我过去在读取 .xls 文件时没有遇到问题,但最新版本的 .xls 文件未被读取并产生此错误:*** formula/tFunc unknown FuncID:186
我尝试过的事情:
我将新的 .xls 文件与旧的进行了比较,看是否能发现任何问题 差异。 None 我能找到。
我删除了文件中包含的所有宏(旧版本也有宏)
已将 xlrd 更新到版本 0.9.3 但出现相同的错误
这些文件最初是 .xlsm 文件。我打开它们并将它们另存为 .xls 文件,以便 xlrd 可以读取它们。这在文件的先前版本上工作得很好。升级到据称支持 .xlsx 的 xlrd 0.9.3 后,我尝试保存 .xlsm 文件 as.xlsx 并尝试读入它,但出现错误并显示空白错误消息
有用信息:
- Python 2.7
- xlrd 0.9.3
- Windows 7(不确定这是否重要但是...)
我的猜测是新文件中有某种 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,但似乎有各种证据表明这是某种命名函数间接寻址或调用。
似乎 186: ('HACKED', 1, 1, 0x02, 1, 'V', 'V'),
to formula.py -- 可能会产生忽略所有这些条目的副作用:它似乎将 "HACKED()" 公式与 void arg 和 return 类型(我可能稍微误解了这一点)代替它。只要不尝试评估该公式,这可能会起作用,尽管没有更好地理解 186
,但很难判断这是否会导致解析在某些情况下变得不同步。
如果我们能更好地理解问题或找到更安全的解决方法,将尝试 return 并更新此答案。