【问题标题】:openpyxl please do not assume text as a number when importingopenpyxl 请不要在导入时将文本假定为数字
【发布时间】:2012-11-30 01:56:01
【问题描述】:

关于如何阻止 Excel 将文本解释为数字,或者如何使用 openpyxl 输出数字格式有很多问题,但我还没有看到任何解决此问题的方法:

我有一个别人给我的 Excel 电子表格,所以我没有创建它。当我用 Excel 打开文件时,我有某些值,如“5E12”(克隆数字,如果有人关心的话)似乎正确显示,但每个值旁边都有一个绿色小箭头警告我“这似乎是一个数字存储为文本”。 Excel 然后询问我是否要将其转换为数字,如果我看到是,我得到 5000000000000,然后它会自动转换为科学计数法并再次显示 5E12,只有这一次文本输出会显示带有零的完整数字.请注意,在转换之前,这实际上是文本,甚至是 Excel,我只是被警告/提供转换它。

因此,当使用 openpyxl(从 openpyxl.reader.excel 导入 load_workbook)读取此文件时,5E12 会自动转换为 5000000000000。我假设 openpyxl 与 Excel 所做的假设相同,只有转换发生时没有我的提示或输入。

如何防止这种情况发生?我不希望看起来像“存储为文本的数字”的文本转换为数字。除非我这么说,否则它们是文本。

到目前为止,我发现的唯一解决方案是在每个单元格的前面添加单引号,但这不是一个理想的解决方案,因为它是手工劳动而不是编程解决方案。此外,解决方案必须是通用的,因为我并不总是知道这个问题可能发生在哪里(我每天要阅读数百万行,所以我不想手动做任何事情)。

认为这是 openpyxl 的问题。 2011 年初有一个谷歌小组讨论提到了这个问题,但认为它太罕见了。 https://groups.google.com/forum/?fromgroups=#!topic/openpyxl-users/HZfpShMp8Tk

那么,有什么建议吗?

【问题讨论】:

  • 您是否必须写入 XLSX 文件以及读取它们?如果没有,您可能需要查看xlrd,它同时读取 XLS 和 XLSX 文件,并且更擅长保留它找到的任何数据类型。
  • @John 谢谢——这正是我所需要的。自从我第一次开始这个项目以来,xlrd 已经有所改进,所以即使这不能回答我的实际问题,它确实解决了我转储 openpyxl 并切换到 xlrd 的问题。 (编辑:它确实回答了我的问题“我如何防止这种情况发生”,它只是没有解决如何使用 openpyxl 做到这一点的问题,如果其他人仍然想知道的话。)

标签: python excel openpyxl


【解决方案1】:

如果您想再次使用openpyxl(无论出于何种原因),对工作表阅读器例程进行以下更改可以将字符串保留为字符串:

diff --git a/openpyxl/reader/worksheet.py b/openpyxl/reader/worksheet.py

--- a/openpyxl/reader/worksheet.py
+++ b/openpyxl/reader/worksheet.py
@@ -134,8 +134,10 @@
             data_type = element.get('t', 'n')
             if data_type == Cell.TYPE_STRING:
                 value = string_table.get(int(value))
-
-            ws.cell(coordinate).value = value
+                ws.cell(coordinate).set_value_explicit(value=value,
+                                                data_type=Cell.TYPE_STRING)
+            else:
+                ws.cell(coordinate).value = value

         # to avoid memory exhaustion, clear the item after use
         element.clear()

Cell.value 是一个属性,在赋值时调用Cell._set_value,然后根据方法的文档执行Cell.bind_value:“给定一个值,推断类型和显示选项”。由于值的类型在 XML 文件中,因此应该采用这些类型(这里我只对字符串这样做)而不是做一些“智能”的事情。

从代码中可以看出,是否是字符串的测试已经存在了。

【讨论】:

  • 谢谢,xlrd 正在为我工​​作,但我也很高兴看到 openpyxl 解决方案。如果有机会我会测试它并留下我的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2014-09-18
  • 2018-10-10
  • 2018-02-11
  • 2021-09-12
  • 2013-06-30
相关资源
最近更新 更多