2011-08-03 08:39:00 +0000 2011-08-03 08:39:00 +0000
64
64

对以逗号分隔的CSV进行格式化,以迫使Excel将其解释为一个字符串。

我一直在寻找一段时间,试图找出如何以这样的方式输出CSV文件,迫使Excel将值解释为字符串,而不是试图将它们转换为数字或日期。

例如: "141", "10/11/2002", "350.00", "1311742251"

0x1&

Excel试图 “智能地 "将这些值转换成它的本地日期/数字格式。有什么方法可以解决这个问题吗?


_EDIT: 澄清了我的问题的意图,抱歉造成了混淆。

答案 (5)

70
70
70
2011-08-03 08:39:57 +0000

对于那些控制源数据的人来说,显然Excel会自动检测CSV字段的格式,除非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!)

39
39
39
2014-01-20 13:02:48 +0000

和许多人一样,我一直在为微软做出的相同决定而苦恼,并尝试了各种建议的解决方案。

对于Excel 2007来说,下面的内容。

  • 把所有的值都放在双引号里没有任何帮助
  • 在所有的值之前加上=的双引号确实有帮助,但是会让csv文件对大多数其他的应用程序没有用处
  • 在所有的值的双引号周围加上括号是垃圾
  • 在所有的值之前加上一个空格,然后再加上双引号,确实可以防止转换为日期,但是不能防止修剪前导或尾部的零。
  • 只有在Excel中输入数据时,在值前加上单引号才有效。

然而:

在所有值前加一个制表符,然后再在它们周围加双引号,这样可以防止转换为日期,也可以防止修剪前导或尾部的零,而且工作表甚至不会在每个单元格的左上角显示讨厌的警告标记。

E.g:

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

请注意制表符必须在双引号之内 编辑:原来双引号根本不需要。

双击csv文件,可以在Excel中以电子表格的形式打开该文件,显示所有的数值,这些数值就像文本数据一样,就像上面的处理一样。一定要设置Excel使用‘.’作为小数点,而不是‘,’,否则csv文件的每一行最终都会在每行的第一个单元格中变成一个文本。显然微软认为CSV的意思是 “不是小数点 "Separated Value。

22
22
22
2011-08-03 09:13:56 +0000

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

在Excel 2007/2010中,你可以发现它是DataGet External DataFrom Text
或者在Excel 2003中为DataImport External DataImport Data

下面是Excel 2003文本导入向导在给出的示例数据上的操作图像,显示我将后两列导入为文本。

2
2
2
2013-01-13 22:37:27 +0000

Simon的例子对我来说并不适用,我怀疑这是语言的差异。在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的惯例。

我使用的是Excel 2010。顺便说一下,Google Sheets不会打开/转换这样格式的文件。如果你去掉等号,这样"VALUE",就可以工作了,Excel仍然会打开文件,但会忽略你希望你的列是字符串这一事实。

-2
-2
-2
2013-01-13 23:23:56 +0000

强制Excel将日期解释为文本的一个简单方法是在日期前面加上一个单引号,而不是使用全引号,如:'10/11/2002

‘。

'10/11/2002

如果你能导入CSV而不是打开它,你可以告诉Excel每一列应该是什么格式。看看【这个问题我问了】(https://superuser.com/questions/497367/how-to-force-excel-to-treat-dates-in-csv-as-text-in-a-macro)。