openpyxl将数值视为日期。结果:OverflowError:日期值超出范围

时间:2016-05-05 06:43:03

标签: python excel openpyxl xlwt

我正在将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。

1 个答案:

答案 0 :(得分:2)

您似乎正在使用旧版本的openpyxl。垃圾收集是为了释放内存,删除空单元格,但还没有用于多个版本。

Excel仅通过使用格式来区分日期和数字。 openpyxl在读取文件时也依赖于此信息,或者在从Python转换为Excel时使用它,否则数字是数字。但是,一些旧版本在默认情况下还包括类型推断,其中一些字符串将被检查以查看它们是否与特别格式化的数字类似,并考虑类似于' 2016-05-05'。同样,暂时还没有这种情况。

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