【问题标题】:Excel CSV - Number cell formatExcel CSV - 数字单元格格式
【发布时间】:2010-09-13 08:02:19
【问题描述】:

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

例如,如果 CSV 文件包含

...,005,...

然后 Excel 将其显示为 5。 有没有办法覆盖它并显示 005?

我更愿意对文件本身做一些事情,这样用户只需双击 CSV 文件即可打开它。

我使用 Excel 2003。

【问题讨论】:

  • 请参阅this question 了解此问题的宏观解决方案。
  • 现在有很多 Excel 编写库。用您选择的语言创建 .xlsx 文件应该很容易。如果您的用户出于某种原因仍在使用 Excel 2003(最初提出此问题时很常见,但希望今天不太可能),还有一些 .xls 生成选项。对于今天遇到这个问题的人来说,很可能您不必自己动手。

标签: excel csv formatting number-formatting


【解决方案1】:

这让我整天发疯(因为在打开 CSV 文件之前确实无法控制 Excel 列类型),这对我有用,使用 VB.NET 和 Excel 互操作:

        '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

【讨论】:

    【解决方案2】:

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

    我确实喜欢 ="001" 方法,但这不允许在不从导入 CSV 文件中删除所有这些格式的情况下将导出的 CSV 数据重新导入到我的 C# 应用程序(相反,我将只修剪导入数据)。

    【讨论】:

      【解决方案3】:

      只需在 CSV 文档中的数字前添加 '。

      【讨论】:

      • 这在 Excel 2010 中不起作用(' 成为单元格内容的一部分)。
      【解决方案4】:

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

      它强制 Excel 将其视为文本并且空格不可见。 在 Windows 上,您可以通过提示 alt+0160 添加不间断空格。 更多信息请看这里:http://en.wikipedia.org/wiki/Non-breaking_space

      在 Excel 2010 上试过。 希望这可以帮助那些仍在为这个问题寻找一个非常合适的解决方案的人。

      【讨论】:

        【解决方案5】:

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

        我误读了 OP 的偏好“对文件本身做点什么”。我仍然为那些想要直接格式化导入的解决方案保留这个

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

        【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          我知道这是一个老问题,但我有一个未在此处列出的解决方案。

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

          无论如何,这有助于防止 excel 2007 中的自动日期格式设置。

          【讨论】:

          • 刚刚测试过,似乎不适用于 Excel 2007 和数字列。 :-/
          【解决方案8】:

          在字段前加上单引号。 Excel 会将其视为文本,即使它看起来像一个数字。

          ...,`005,...
          

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

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

          【讨论】:

          • 这是人们可能会尝试的东西。所以知道它不起作用是有用的并且可以节省时间。
          【解决方案9】:

          Load csv into oleDB and force all inferred datatypes to string

          我问了同样的问题,然后用代码回答了。

          基本上,当加载 csv 文件时,oledb 驱动程序会做出假设,您可以告诉它要做出什么假设。

          虽然我的代码强制所有数据类型为字符串...更改架构非常容易。 出于我的目的,我使用 xslt 来获得我想要的方式 - 但我正在解析各种各样的文件。

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

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

              我的偏好是第一个选项。

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

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

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

              选项 2 – 格式化数据

              如果这只是一个格式问题,并且您在该列中的所有数据都有三位数的长度。然后在 Excel 中打开数据,然后用这种自定义格式 000

              格式化包含数据的列

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

              更改文件扩展名并使用文件导入向导来控制格式。 带有 .dif 扩展名的文件在双击时会被 Excel 自动打开。

              一步一步:

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

              【讨论】:

              • .dif 在我的机器上不起作用;使用 Excel 2007 手动打开不起作用(警告我文件类型与扩展名不同),看起来 .DIF 在很多计算机上都与 Quicktime 相关联。仅供参考 :) 否则,很棒的提示!
              • 我认为选项 1 是最好的,如果您想要一种轻松的方式来生成“正常工作”的文件 - 即它在用户的计算机上以 excel 格式打开,无需他们做任何额外的工作。
              • 我也遇到了同样的问题,以上都不合适抱歉。想我可能会导出为 XML 并使用 XSLT 转到 CSV。我需要正确的 CSV 文件才能将其导入到另一个应用程序中
              • 请注意,选项 1 并不总是好的,如果你有一个单元格让我们说“1E02,无论文本”,然后你在前面加上一个等号,Excel 会假设你输入了一个公式。首先,公式会出错,但其次,最重要的是,它会将您的文本拆分为 2 个单元格。
              • 感谢选项 1。无需任何额外工作即可解决我的科学记数法问题。
              【解决方案12】:

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

              【讨论】:

                【解决方案13】:

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

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

                【讨论】:

                • +1 写SYLK很简单,我是新手。
                • 我不知道这种格式。它看起来像我可以使用的东西。为此 +1!
                • +1 我花了五分钟从 CSV 切换到 SYLK。从现在开始我的 goto 输出格式!
                • @xamde,你是对的。奇怪的是,他们从未像使用 RTF 那样扩展格式来支持它。
                • @JohnColeman 我不会争辩说 CSV 不流行,它的简单性无疑是一个重要因素。但是这种简单性使它变得不健壮。请参阅Scientists rename human genes to stop Microsoft Excel from misreading them as dates 以获取令人大开眼界的示例。我不知道 SYLK 漏洞。
                【解决方案14】:

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

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

                【讨论】:

                • Excel 2003 不弹出向导。
                【解决方案15】:

                我相信当您导入文件时,您可以选择列类型。将其设为文本而不是数字。不过,我目前没有副本可供查看。

                【讨论】:

                  【解决方案16】:

                  您可以简单地将您的范围格式化为文本。

                  另外,here 是一篇关于数字格式以及如何对其进行编程的好文章。

                  【讨论】:

                  • 这只会影响值的显示方式。您需要将其转换为文本,无论是使用公式,还是在导入期间,使用此线程中规定的众多方法之一
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-11-18
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多