openpyxl treats numeric values as dates. Result: OverflowError: date value out of range
openpyxl treats numeric values as dates. Result: OverflowError: date value out of range
我正在将 Excel 导出例程从 xlwt
迁移到 openpyxl
。一切都很糟糕,直到我想真正保存我做的东西。垃圾收集在 openpyxl
的幕后启动并抛出错误,因为像 5 或 6(测量值)或 24242757(id)这样的数字似乎被视为日期。对于 xlwt
,我们没有任何代码可以向库建议这些值是数字而不是日期。 (我之前曾在多个平台上进行过 Excel 导出工作,我知道 Excel 日期的深处实际上是整数 (OADate
))。
OverflowError : date value out of range
Traceback (most recent call last):
File "C:\Users\foobar\spoolerque\models.py", line 82, in run
result = task_function(self, **kwargs)
File "C:\Users\foobar\ratings\views.py", line 1332, in create_analytics_report_task
return foobar_export(task=task, players=report_list, ev=ev, sort_by=sb)
File "C:\Users\foobar\ratings\views.py", line 1177, in foobar_export
xls_export.save(file_contents)
File "C:\Users\foobar\main\utils.py", line 602, in save
self.wb.save(io)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\workbook.py", line 214, in save
save_workbook(self, filename)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\writer\excel.py", line 150, in save_workbook
writer.save(filename)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\writer\excel.py", line 133, in save
self.write_data(archive)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\writer\excel.py", line 64, in write_data
shared_string_table = self._write_string_table(archive)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\writer\excel.py", line 84, in _write_string_table
ws.garbage_collect()
File "C:\Users\foobar\env\lib\site-packages\openpyxl\worksheet.py", line 478, in garbage_collect
iteritems(self._cells) if (not cell.merged and cell.value in ('', None) and \
File "C:\Users\foobar\env\lib\site-packages\openpyxl\cell.py", line 319, in _get_value
value = self._shared_date.from_julian(value)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\shared\date_time.py", line 162, in from_julian
return EPOCH + datetime.timedelta(days=utc_days)
OverflowError: date value out of range
有人 运行 参与其中吗?我没有看到明显的报道,所以我想我做错了什么?
更新 1
原来项目中openpyxl的版本非常旧 (1.6.1)。足够老以至于 API 改变得足够多(例如样式),我需要继续努力。期待新版本(2.3.5)能流畅
更新 2
成功导出 xlsx。
看来您使用的是旧版本的 openpyxl。垃圾回收是为了释放内存以删除空单元格,但尚未用于多个版本。
Excel 仅通过使用格式来区分日期和数字。 openpyxl 在读取文件时也依赖于此信息,或者在从 Python 转换为 Excel 时使用它,否则数字就是数字。但是,一些旧版本还默认包含类型推断,其中将检查某些字符串以查看它们是否类似于特定格式的数字,例如“2016-05-05”。同样,这种情况已经有一段时间了。
我建议您升级 openpyxl,如果问题仍然存在,请提交包含示例代码和文件的错误报告。
我正在将 Excel 导出例程从 xlwt
迁移到 openpyxl
。一切都很糟糕,直到我想真正保存我做的东西。垃圾收集在 openpyxl
的幕后启动并抛出错误,因为像 5 或 6(测量值)或 24242757(id)这样的数字似乎被视为日期。对于 xlwt
,我们没有任何代码可以向库建议这些值是数字而不是日期。 (我之前曾在多个平台上进行过 Excel 导出工作,我知道 Excel 日期的深处实际上是整数 (OADate
))。
OverflowError : date value out of range
Traceback (most recent call last):
File "C:\Users\foobar\spoolerque\models.py", line 82, in run
result = task_function(self, **kwargs)
File "C:\Users\foobar\ratings\views.py", line 1332, in create_analytics_report_task
return foobar_export(task=task, players=report_list, ev=ev, sort_by=sb)
File "C:\Users\foobar\ratings\views.py", line 1177, in foobar_export
xls_export.save(file_contents)
File "C:\Users\foobar\main\utils.py", line 602, in save
self.wb.save(io)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\workbook.py", line 214, in save
save_workbook(self, filename)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\writer\excel.py", line 150, in save_workbook
writer.save(filename)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\writer\excel.py", line 133, in save
self.write_data(archive)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\writer\excel.py", line 64, in write_data
shared_string_table = self._write_string_table(archive)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\writer\excel.py", line 84, in _write_string_table
ws.garbage_collect()
File "C:\Users\foobar\env\lib\site-packages\openpyxl\worksheet.py", line 478, in garbage_collect
iteritems(self._cells) if (not cell.merged and cell.value in ('', None) and \
File "C:\Users\foobar\env\lib\site-packages\openpyxl\cell.py", line 319, in _get_value
value = self._shared_date.from_julian(value)
File "C:\Users\foobar\env\lib\site-packages\openpyxl\shared\date_time.py", line 162, in from_julian
return EPOCH + datetime.timedelta(days=utc_days)
OverflowError: date value out of range
有人 运行 参与其中吗?我没有看到明显的报道,所以我想我做错了什么?
更新 1
原来项目中openpyxl的版本非常旧 (1.6.1)。足够老以至于 API 改变得足够多(例如样式),我需要继续努力。期待新版本(2.3.5)能流畅
更新 2
成功导出 xlsx。
看来您使用的是旧版本的 openpyxl。垃圾回收是为了释放内存以删除空单元格,但尚未用于多个版本。
Excel 仅通过使用格式来区分日期和数字。 openpyxl 在读取文件时也依赖于此信息,或者在从 Python 转换为 Excel 时使用它,否则数字就是数字。但是,一些旧版本还默认包含类型推断,其中将检查某些字符串以查看它们是否类似于特定格式的数字,例如“2016-05-05”。同样,这种情况已经有一段时间了。
我建议您升级 openpyxl,如果问题仍然存在,请提交包含示例代码和文件的错误报告。