openpyxl将数值作为date处理。 结果:OverflowError:date值超出范围

我将Excel导出例程从xlwt迁移到openpyxl 。 一切都是好的,直到我真的想保存我制作的东西。 一个垃圾收集在openpyxl的引擎下openpyxl ,它会抛出一个错误,因为像5或6(测量),或24242757(id)数字看起来被认为是date。 使用xlwt我们没有任何代码来向库提示这些值是数字而不是date。 (我曾在多个平台上的Excel导出之前,我知道深入Exceldate实际上是整数( 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只通过使用格式来区分date和数字。 当读取文件时,openpyxl也依赖这些信息,或者在从Python转换为Excel时使用它,否则数字就是数字。 然而,一些旧版本还包括默认的types推断,其中一些string将被检查以查看它们是否类似于特定格式的数字,如“2016-05-05”。 再说一次,情况并非如此。

我build议您升级openpyxl,如果问题仍然存在,请提供示例代码和文件的错误报告。