【问题标题】:CSV for Excel, Including Both Leading Zeros and CommasExcel 的 CSV,包括前导零和逗号
【发布时间】:2010-09-23 10:14:20
【问题描述】:

我想生成一个 CSV 文件供用户使用 Excel 打开它。

如果我想转义值中的逗号,我可以将其写为“640,480”。

如果我想保留前导零,我可以使用 ="001234"。

但如果我想在值中同时保留逗号和前导零,写为 ="001,002" 将被拆分为两列。似乎没有办法表达正确的数据。

有没有什么方法可以在 CSV for Excel 中表达 001, 002

【问题讨论】:

    标签: excel csv


    【解决方案1】:

    这很简单,使用 Excel 的 Power Query 功能可以执行分步转换。

    原始文件:

    添加自定义列:

    【讨论】:

      【解决方案2】:

      由于没有人提到它,因此认为值得在这篇旧帖子中提及它。

      如果在数字前添加水平制表符\t,则 MS Excel 也会显示前导零。并且制表符不会显示在 Excel 工作表中。即使它被双引号包围。 (例如\"\t001,002\"

      它在 Notepad++ 中看起来也更好,与在此类数字前放置 \0 aka NULL 相比。

      【讨论】:

      • 我试过空值,但没有用。制表符会产生一个问题:如果您尝试编辑字段,则光标位置已关闭(这里很难解释,请尝试一下!)。如果初始空格不是问题,您可以改为在 "\xA0" 非中断空格字符前添加前缀 - 这将起作用,并且它不是可见字符。
      【解决方案3】:

      Excel 根据内容使用 CSV 列的默认格式。所以如果你的csv中有001,excel会自动把它变成1。

      在 csv 文件中保留前导零的唯一方法是将 csv 文件的扩展名更改为 .txt,然后打开 excel,单击打开,选择 txt 文件,您将看到文本导入向导。选择您的 csv 格式(以逗号分隔),然后确保选择“文本”作为格式。

      就是这样,现在您可以将以前的 csv 数据导出到任何其他数据,同时保留前导零。

      【讨论】:

        【解决方案4】:

        相当老的线程,但你为什么不在你的价值之后添加空格。然后它将被视为字符串,并且不会去除前导零。

        “001,002”。“”

        【讨论】:

        • 所以,是的 - 将我的 sql 查询更改为:s.TextColumnThatLooksLikeANumber + ' '
        【解决方案5】:

        在所有当前 Excel 版本或 OS X 上的 Numbers 应用程序中,所有建议的答案现在似乎都不适合我(“=""blahblah""" 等)。

        我发现通过摆弄来工作的唯一解决方案是在字符串的开头添加一个转义的空字符(在基于 PHP 或 C 的语言中是 \0)。打开计算表时,所有内容都按原样处理,无需软件计算或处理。

        echo "\0" . $data;
        

        【讨论】:

          【解决方案6】:

          在你的数据上加上前缀字符串:

           "N001,002","N002,003" 
          

          (只要该前缀不是 E )

          上面的表示法(至少在 OpenOffice 中)将总共解析为 2 列,其中 N001,002 字节正确存储。

          CSV 规范说 , 在引号字符串中是允许的。

          另外,来自经验的警告:确保您也使用电话号码执行此操作。 Excel 会将电话号码解释为浮点数并将它们保存为科学计数法 :/ ,而 1.800E10 并不是一个真正好的电话号码。

          在 OpenOffice 中,这个 RawCSV 块也可以按预期解码:

            "=""001,002""","=""002,004"""
          

          即:

             $rawdata = '001,002'; 
             $equation = "=\"$rawdata\"";
             $escaped = str_replace('"','""',$equation); 
             $csv_chunk = "\"$escaped\"" ; 
          

          【讨论】:

          • 请注意,虽然前缀 space 不起作用,但前缀不间断空格 "\xA0" - 并且具有以下优点它不是一个可见的字符。 (也不会像前缀制表符那样搞乱编辑)。
          • 为什么“E”不起作用?理解它用于科学记数法的数字,但从不作为第一个字符,因此作为前缀它应该触发解释为字符串,就像所有其他字母一样,确定吗?
          【解决方案7】:

          如果您使用“Content-Disposition”并使用 HTML 标签从 asp 导出到 excel,则必须将“style='mso-number-format:\@;'”添加到该标签并使其接受只有文本值,从而避免前导零遗漏,如果接受正斜杠“\”,则使用双正斜杠“\”

          【讨论】:

            【解决方案8】:

            我正在摆弄 CSV 到 Excel(我使用 PHP 创建 CSV,但我猜这个解决方案适用于任何语言。当您发现前导字符(例如 + 、 - 或 0 正在消失时,创建以 chr(13) 为前缀的 CSV。这是一个不可打印的字符,它对我的​​ Excel Office 2010 版本非常有用。我尝试了其他不可打印的字符,但没有成功。

            所以我使用 Chirp Internet 解决方案,但使用我的前缀进行了调整:

            if (preg_match("/^0/", $str) || preg_match("/^\+?\d{8,}$/", $str) || preg_match("/^\d{4}.\d{1,2}.\d{1,2}/", $str)) {
                $str = chr(13)."$str";
            }
            

            【讨论】:

              【解决方案9】:

              Kent Fredric 的回答包含解决方案:

               "=""001,002"""

              (我懒得将此作为单独的答案发布,因为从 Kent 的回答中不清楚这是一个有效的 Excel 解决方案。)

              【讨论】:

              • 太棒了。完全按照我的需要工作。
              • 附注:这似乎适用于任何超过 253 个左右字符的值除外(在 255 个字符之后,Excel 停止寻找右引号并感到困惑......?)
              • 奇怪的是,虽然这行得通:000,"=""001,002""" 这行不通:000, "=""001,002"""
              • @eyaler:Excel 只检查第一个字符中的“分隔符保护”引号。如果引号没有出现在第一个字符中,则该字段将照常解析,换行符为记录结尾,逗号为字段结尾,其他所有文字(包括引号)。另请注意,用于分隔符保护的相应结束引号不必是字段中的最后一个字符;它只需要匹配开场白。在结束引号之后,解析规则在该字段的其余部分恢复正常。
              • @eyaler:您可以将长字符串拆分成更小的块,并使用& 运算符将它们连接起来。例如,"=""123""&""456""&""789""" 会产生 字符串 123456789。请注意,Excel 2003 及更早版本的公式中有 1024 个字符的限制。 Excel 2007 及更高版本将限制增加到 8192。
              【解决方案10】:

              我博客的一位读者找到了一个解决方案,="001" & CHAR(44) & "002",在我的机器上似乎可行!

              【讨论】:

                【解决方案11】:

                更多地查看 Excel 电子表格,它看起来您想要的内容无法使用 CSV 完成。

                此站点http://office.microsoft.com/en-us/excel/HP052002731033.aspx 说“如果单元格显示公式而不是公式值,则公式将转换为文本。所有格式、图形、对象和其他工作表内容都将丢失。欧元符号将转换为问号。”

                但是,您可以更改加载方式以获得所需的结果。请参阅此网页: Microsoft import a text file.

                关键是选择导入外部数据-导入数据-文本文件,下一步,下一步,然后在列数据格式下勾选“文本”。这将防止它被解释为数字并丢失格式。

                【讨论】:

                  【解决方案12】:

                  """001,002"""
                  

                  我通过键入“001,002”然后在 Excel 中另存为 CSV 发现了这一点。如果这不是您想要的(您不需要引号),这可能是您找到所需内容的好方法。

                  如果您愿意,另一个选项可能是使用制表符分隔的文本。

                  【讨论】:

                    猜你喜欢
                    • 2016-12-05
                    • 2018-04-28
                    • 1970-01-01
                    • 2018-10-10
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多