关于如何阻止Excel将文本解释为数字或如何使用openpyxl输出数字格式有很多问题,但我还没有看到任何解决此问题的方法:
我有一个别人给我的Excel电子表格,所以我没有创建它。当我用Excel打开文件时,我有一些像“5E12”(克隆编号,如果有人关心的话)似乎正确显示的值,但每个旁边都有一个绿色箭头警告我“这似乎是一个数字存储为文本“。 Excel然后询问我是否要将其转换为数字,如果我看到是,我得到5000000000000,然后自动转换为科学记数法并再次显示5E12,只有这次文本输出将显示带有零的完整数字。请注意,在转换之前,这确实是文本,甚至是Excel,我只是被警告/提供转换它。
因此,当使用openpyxl(来自openpyxl.reader.excel import load_workbook)读取此文件时,5E12将自动转换为5000000000000.我假设openpyxl正在做出与Excel相同的假设,只有转换发生在没有我的提示或输入。
如何防止这种情况发生?我不希望看起来像“存储为文本的数字”的文本转换为数字。除非我这样说,否则它们都是文本。
到目前为止,我发现的唯一解决方案是在每个单元格的前面添加单引号,但这不是一个理想的解决方案,因为它是手工劳动而不是程序化解决方案。此外,解决方案需要是通用的,因为我并不总是知道这个问题可能发生在哪里(我每天都在读数百万行,所以我不想手工做任何事情)。
我认为这是openpyxl的一个问题。从2011年开始有一个谷歌小组讨论提到了这个问题,但是假设这个问题太罕见了。 https://groups.google.com/forum/?fromgroups=#!topic/openpyxl-users/HZfpShMp8Tk
那么,有什么建议吗?
答案 0 :(得分:5)
如果您想再次使用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文件中,因此应该采用(这里我只对字符串执行此操作)而不是执行“智能”操作。
从代码中可以看出,测试是否是字符串已经存在。