Excel CSV-数字单元格格式


86

我将报告生成为CSV文件。当我尝试在Excel中打开文件时,它会根据单元格的内容对数据类型进行假设,并相应地重新格式化。

例如,如果CSV文件包含

...,005,...

然后Excel将其显示为5。是否有方法可以覆盖它并显示005?

我希望对文件本身做一些事情,以便用户可以双击CSV文件将其打开。

我使用Excel 2003。


有关此问题的宏解决方案,请参见此问题。
亚当·詹森

如今,有很多Excel编写库。以您选择的语言创建.xlsx文件应该很容易。如果您的用户由于某种原因仍在使用Excel 2003(最初问这个问题时很常见,但希望今天不太可能),那么还有一些生成.xls的选项。对于今天在这个问题上绊脚石的人们,很有可能您不必自己动手。
John Y

Answers:


129

打开.csv文件时,没有一种简单的方法可以控制Excel应用的格式。但是,下面列出的三种方法可能会有所帮助。

我的首选是第一选择。

选项1 –更改文件中的数据

您可以按如下方式更改.csv文件中的数据...,=“ 005”,...这将在Excel中显示为...,005,...

Excel会将数据保留为公式,但复制列并使用粘贴特殊值将摆脱公式,但保留格式

选项2 –格式化数据

如果仅是格式问题,并且该列中的所有数据长度均为三位数。然后在Excel中打开数据,然后使用此自定义格式000格式化包含数据的列

选项3 –将文件扩展名更改为.dif(数据交换格式)

更改文件扩展名,然后使用文件导入向导来控制格式。双击后,具有.dif扩展名的文件将由Excel自动打开。

一步步:

  • 将文件扩展名从.csv更改为.dif
  • 双击文件以在Excel中打开它。
  • “文件导入向导”将启动。
  • 将“文件类型”设置为“定界”,然后单击“下一步”按钮。
  • 在“分隔符”下,勾选“逗号”,然后单击“下一步”按钮。
  • 单击显示的数据的每一列,然后选择“列数据格式”。值为“ 005”的列应设置为“文本”。
  • 单击完成按钮,Excel将使用您指定的格式打开文件。

8
.dif在我的机器上不起作用;使用Excel 2007手动打开无法正常工作(警告我文件类型与扩展名不同),并且看起来.DIF与很多计算机上的Quicktime关联。仅供参考:)否则,很棒的提示!
尼古拉斯

15
我认为选项1是最好的,如果您想要一种轻松的方式来生成“可正常使用”的文件,即该文件在excel中在用户计算机上打开,而无需他们进行任何其他工作。
Kip

我遇到了同样的问题,以上都不是对不起的。认为我可能会导出为XML并使用XSLT转到CSV。我需要CSV文件是正确的,以便它可以被导入到另一个应用程序
马特

1
请注意,选项1并不总是很好,如果您有一个单元格,说“ 1E02,any text”,然后在前面放一个等号,Excel就会想象您输入了一个公式。首先,公式将是错误的,但是其次,最重要的是它将文本分成2个单元格。
ghiscoding 2014年

1
感谢选项1。解决了我的科学计数法问题,而无需进行任何其他工作。
2014年

28

不要使用CSV,请使用SYLK。
http://en.wikipedia.org/wiki/SYmbolic_LinK_(SYLK)

它提供了对格式的更多控制,并且Excel不会尝试通过检查内容来猜测字段的类型。看起来有点复杂,但是您可以使用很小的子集。


2
+1编写SYLK很容易实现,我是新手。
Matt H

1
我不知道这种格式。看起来像我可以使用的东西。为此+1!
Buggabill

+1花了我五分钟时间从CSV切换到SYLK。从现在开始我的goto输出格式!
TheFish 2012年

@xamde,你是对的。奇怪的是,他们从未像RTF那样扩展格式来支持它。
马克·兰瑟姆

WTF,或者我会从Wikipedia引用的任何人都会推荐它:“ Microsoft不会发布SYLK规范。”
索林2013年

14

这适用于Microsoft Office 2010,Excel版本14

我误读了OP的首选项“对文件本身做一些事情”。对于那些想要解决方案直接格式化导入格式的人,我仍然保留此设置

  1. 打开一个空白(新)文件(“文件”->“来自工作簿的新建”)
  2. 打开导入向导(数据->从文本)
  3. 选择您的.csv文件并导入
  4. 在对话框中,选择“定界”,然后单击“下一步”。
  5. 选择分隔符(取消选中“逗号”以外的所有内容),选择文本限定符(可能为{None}),然后单击“下一步”。
  6. 数据预览字段中,选择要作为文本的列。它应该突出显示。
  7. 在“列数据格式”字段中,选择“文本”。
  8. 点击完成。


2

您可以简单地将范围设置为文本格式。

另外,这里还有一篇很好的文章,介绍了数字格式以及如何对其进行编程。


那只会影响值的显示方式。您需要使用公式或在导入期间使用此线程中采用的许多方法之一将其转换为文本
leo

2

实际上,我发现,至少从Office 2003开始,您可以将Excel电子表格另存为XML文件。因此,我可以生成一个XML文件,当我双击它时,它将在Excel中打开。它提供与SYLK相同的控制级别,但是XML语法更直观。


2

在单元格中添加一个不间断的空间可能会有所帮助。例如: "firstvalue";"secondvalue";"005 ";"othervalue"

它强制Excel将其视为文本,并且空格不可见。在Windows上,您可以通过按Alt + 0160来添加不间断空格。有关更多信息,请参见此处:http : //en.wikipedia.org/wiki/Non-breaking_space

在Excel 2010上进行了尝试。希望这对仍在搜索此问题的正确解决方案的人们有所帮助。


2

从C#代码导出CSV数据时遇到了这个问题,并通过在制表符\ t前面加上前导零数据来解决此问题,因此在Excel中数据被解释为文本而不是数字(但与其他字符不同,它不会看不到)。

我确实喜欢=“ 001”的方法,但这不允许将导出的CSV数据再次重新导入到我的C#应用​​程序中,而不会从导入的CSV文件中删除所有这种格式(相反,我将只修剪导入数据) 。


1

我相信当您导入文件时,您可以选择列类型。使它成为文本而不是数字。我现在没有复印件要检查。



1

我知道这是一个老问题,但是这里没有列出解决方案。

当您生成csv时,请在逗号之后但在值之前添加一个空格,例如, 005,

无论如何,这可以防止在Excel 2007中自动设置日期格式。


2
经过测试,似乎不适用于Excel 2007和数字列。:-/
Norman H

1

当要导入的CSV文件在单元格内有换行符时,“文本导入向导”方法不起作用。此方法处理这种情况(至少使用制表符分隔的数据):

  1. 创建新的Excel文件
  2. Ctrl + A选择所有单元格
  3. 在“数字格式”组合框中,选择“文本”
  4. 在文本编辑器中打开制表符分隔的文件
  5. 全选,复制并粘贴到Excel中


1

这使我整日疯狂(因为实际上在打开CSV文件之前您无法控制Excel列类型),并且使用VB.NET和Excel Interop对我有用:

        'Convert .csv file to .txt file.
        FileName = ConvertToText(FileName)

        Dim ColumnTypes(,) As Integer = New Integer(,) {{1, xlTextFormat}, _
                                                        {2, xlTextFormat}, _
                                                        {3, xlGeneralFormat}, _
                                                        {4, xlGeneralFormat}, _
                                                        {5, xlGeneralFormat}, _
                                                        {6, xlGeneralFormat}}

        'We are using OpenText() in order to specify the column types.
        mxlApp.Workbooks.OpenText(FileName, , , Excel.XlTextParsingType.xlDelimited, , , True, , True, , , , ColumnTypes)
        mxlWorkBook = mxlApp.ActiveWorkbook
        mxlWorkSheet = CType(mxlApp.ActiveSheet, Excel.Worksheet)


Private Function ConvertToText(ByVal FileName As String) As String
    'Convert the .csv file to a .txt file.
    'If the file is a text file, we can specify the column types.
    'Otherwise, the Codes are first converted to numbers, which loses trailing zeros.

    Try
        Dim MyReader As New StreamReader(FileName)
        Dim NewFileName As String = FileName.Replace(".CSV", ".TXT")
        Dim MyWriter As New StreamWriter(NewFileName, False)
        Dim strLine As String

        Do While Not MyReader.EndOfStream
            strLine = MyReader.ReadLine
            MyWriter.WriteLine(strLine)
        Loop

        MyReader.Close()
        MyReader.Dispose()
        MyWriter.Close()
        MyWriter.Dispose()

        Return NewFileName
    Catch ex As Exception
        MsgBox(ex.Message)
        Return ""
    End Try

End Function

0

打开CSV时,您会看到文本导入向导。在向导的最后一步,您应该能够将特定的列作为文本导入,从而保留“ 00”前缀。之后,您可以按照需要的任何方式格式化单元格。

我尝试使用Excel 2007,它似乎可以正常工作。


1
Excel 2003不会弹出向导。
谢尔盖·斯塔德尼克

0

好吧,Excel永远不会弹出CSV文件向导。如果将其重命名为.txt,则下次在Excel中执行“文件”>“打开”时,将看到向导。


0

在字段前加单引号。Excel会将其视为文本,即使看起来像数字也是如此。

...,`005,...

编辑:这是错误的。仅当将数据直接输入到Excel中时,撇号技巧才起作用。当您在CSV文件中使用它时,不需要的字段中会出现撇号。

http://support.microsoft.com/kb/214233


4
人们可能会尝试这样做。因此,知道它不起作用是有用的,可以节省时间。
AndyM
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.