openpyxl请不要在导入时假定文本为数字

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

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

所以,当用openpyxl(从openpyxl.reader.excel import load_workbook)读取这个文件时,5E12会自动转换为5000000000000。我假设openpyxl和Excel做了相同的假设,只有转换没有提示或在我的部分input。

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

到目前为止,我find的唯一解决scheme是在每个单元格的前面添加单引号,但这不是一个理想的解决scheme,因为它是手工劳动而不是程序化解决scheme。 此外,解决scheme需要是一般的,因为我不知道这个问题可能发生在哪里(我每天读数百万行,所以我不想手工做任何事情)。

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

那么,有什么build议?

如果你想再次使用openpyxl (不pipe出于什么原因),下面的工作表读取器例程的改变openpyxlstring保持为string:

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 ,然后根据方法的doc执行一个Cell.bind_value :“给定值,推断types和显示选项”。 由于这些值的types是在XML文件中,因此应该采取这些措施(这里我只对string做),而不是做一些“聪明”的事情。

正如你从代码中看到的那样,testing它是否是一个string已经在那里了。