格式化逗号分隔的CSV以强制Excel将值解释为字符串


64

我一直在寻找一段时间,试图弄清楚如何以强制Excel将值解释为字符串而不是将其转换为数字或日期的方式输出CSV文件。

例如:

"141", "10/11/2002", "350.00", "1311742251"

Excel尝试“智能地”将所有这些转换为其原始日期/数字格式。有办法解决吗?


编辑:澄清了我的问题的意图,对不起造成混乱。

Answers:


67

对于那些可以控制源数据的人,除非CSV列采用以下格式,否则Excel显然会自动检测CSV字段的格式:

"=""Data Here"""

例如...

20,       5.5%,      "0404 123 351", "3-6",  "=""123"""
[number]  [percent]  [number]        [date]  [string]  <-- how Excel interprets

它也可以在Google Spreadsheet中使用,但不确定其他电子表格应用程序是否支持此表示法。

如果您怀疑任何数据本身可能包含引号,则需要像这样对它们进行两次转义 ...

"=""She said """"Hello"""" to him"""



(编辑:已更正,感谢DMA57361!)


太棒了,我们只需要更改数据即可。. 感叹
昂贵,

4
最后一列应该是"=""123"""错误的格式。包含的字段"必须定界,并且字段中的"s与其他"s 转义。
DMA57361 2011年

@ DMA57361实际上是很好的方式,它旁边的其他两个字段缺少前置的等号。他在那里放置的是设置该单元格的公式以返回字符串。为了避免这种情况,您可以将单元格的数据类型设置为“文本”。
突破

2
@突破该表代表一个CSV文件,而不是 Excel字段。最后一个值="123"不是有效的CSV字段,因为它包含字段分隔符," 但没有正确地分隔它或该字段。Excel恰好以公式形式读取它的事实完全取决于Excel,而与CSV文件无关。
DMA57361 2011年

2
@PriceChild,我最初的问题(我并没有很好地解释)的重点实际上是如何格式化CSV,以使其对用户来说尽可能容易。因此,这就是我发现自己想要发布的答案。DMA57361实际上也带来了有益的修正,谢谢!
西蒙·伊斯特

36

像许多人一样,我一直在努力做出与Microsoft相同的决定,并尝试了各种建议的解决方案。

对于Excel 2007,执行以下操作:

  • 将所有值都放在双引号中无济于事
  • 将值放在双引号后将所有值放在=之前确实有帮助,但BUT使CSV文件对大多数其他应用程序无用
  • 将括号括在所有值的双引号周围是垃圾
  • 在所有值之前加一个空格,然后在双引号前加上一个空格确实可以防止转换为日期,但不能防止修剪前导零或尾随零。
  • 仅在Excel中输入数据时,将单引号放在值前面。

然而:

在所有值之前放置一个制表符,然后在双引号周围加上双引号确实可以防止转换为日期,并且可以防止对前导零或尾随零进行修整,并且工作表甚至在每个单元格的左上角都没有显示讨厌的警告标记。

例如:

"<tab character><some value>","<tab character><some other value>"

请注意,制表符必须在双引号内。编辑:事实证明双引号甚至没有必要。

双击csv文件可以在Excel中以电子表格的形式打开该文件,其中显示了所有被视为上面的值,例如文本数据。确保将Excel设置为使用“。” 作为小数点而不是','或csv文件的每一行都将以文本形式出现在每一行的第一个单元格中。显然,Microsoft认为CSV表示“不是小数点”分隔值。


这个制表符使我度过了美好的一天,Excel将很长的数值转换成数字,并在15号以后丢失了所有数字。设法使Excel将它们视为带有制表符前缀的文本。因此也适用于数字,而不仅仅是日期。
MarkusYrjölä17年

这真的很有用,谢谢!
Flavio

22

使用Excel的导入功能,您可以指定应解释为每列的格式(自动,文本或日期),并且不需要对数据文件进行任何修改。

你可以找到它Data→交通Get External Data→交通From Text在Excel 2007/2010。
Data→交通Import External Data→交通Import Data在Excel 2003中。

这是对给定的示例数据起作用的Excel 2003文本导入向导的图像,向我展示了如何将后两列作为文本导入:

Excel 2003:步骤3-数据类型上的文本导入向导


出色的回答DMA57361,感谢所有详细信息。我没有真正提到的是我正在编写一个将数据导出到Excel的脚本,因此我试图防止用户不得不跳过诸如此类的令人困惑的选项。但是无论如何还是投票给你。:-)
西蒙·伊斯特

@Simon,您在用什么编写脚本?有什么方法可以让它直接生成实际的Excel文件,而不是通过中间格式?
DMA57361 2011年

这是一个导出数据库表的PHP脚本。CSV可能是最容易使用的,但是您是正确的,我可能可以借助一些开源代码来生成XLS,或者甚至可以是一个HTML表,我认为从过去的经验中可以在Excel中产生合理的结果(允许颜色和格式等,但不确定数据类型)。
西蒙·伊斯特

1
SO 上有一些关于PHP→Excel的问题,我尝试过的前几个问题都有指向PHP Excel的答案,因此可能值得一看。
DMA57361 2011年

在阅读了很多答案之后,多数民众赞成非常有帮助
greg121

1

西蒙的例子对我没有用,我怀疑这是语言上的差异。在C#中,我的工作格式字符串如下所示:

var linebreak = (i++ == list.Count) ? "" : "\r\n";

csv += String.Format("=\"{0}\",{1},{2},{3},=\"{4}\"{5}",
    item.Value, item.Status, item.NewStatus, item.Carrier, c.Status, linebreak);

这是输出文件的样子:

="abababababab",INVALID,INVALID,USPS,="",
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793000216184",UNKNOWNSTATUS,INVALID,USPS,=""

可以看出,输出文件中的格式="VALUE",不是"=""VALUE""",我认为可能是Visual Basic约定的格式。

我正在使用Excel2010。顺便说一句,Google表格不会打开/转换以这种方式设置格式的文件。如果这样删除等号,它将起作用"VALUE",-Excel仍将打开文件,但忽略您希望列为字符串的事实。


-2

强制Excel将日期解释为文本的一种简单方法是在日期前加上单引号,而不是使用全引号,如下所示:

'10 / 11/2002

如果可以导入CSV而不是打开它,则可以告诉Excel每列应采用的格式。看看我问的这个问题


5
拒绝投票,因为这不适用于导入Excel的CSV文件。Excel将报价解释为文字报价,因此将其显示在单元格中。
psynnott 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.