为Excel生成CSV文件,如何在值中包含换行符

Nir*_*Nir 146 csv excel newline

我需要为Excel生成一个文件,该文件中的一些值包含多行.

那里还有非英文文本,所以文件必须是Unicode.

我现在生成的文件如下所示:(在UTF8中,非英文文本混合在一起并且有很多行)

Header1,Header2,Header3
Value1,Value2,"Value3 Line1
Value3 Line2"
Run Code Online (Sandbox Code Playgroud)

请注意,多行值用双引号括起来,其中包含正常的日常换行符.

根据我在网上发现的这应该有效,但它没有,至少没有赢得Excel 2007和UTF8文件,Excel将第3行视为第二行数据而不是第一行数据的第二行.

这必须在我客户的机器上运行,我无法控制他们的Excel版本,所以我需要一个适用于Excel 2000及更高版本的解决方案.

谢谢

编辑:我通过两个CSV选项"解决"了我的问题,一个用于Excel(Unicode,制表符分隔,字段中没有换行符),另一个用于世界其他地方(UTF8,标准CSV).

不是我想要的,但至少它是有效的(到目前为止)

Joh*_*hin 65

您应该在字段的开头只有空格字符,空格字符是数据的一部分.Excel不会剥离前导空格.您将在标题和数据字段中获得不需要的空格.更糟糕的是",应该"保护"第三列中的换行符将被忽略,因为它不在字段的开头.

如果文件中包含非ASCII字符(以UTF-8编码),则文件开头应该有UTF-8 BOM(3个字节hex EF BB BF).否则Excel将根据您的语言环境的默认编码(例如cp1252)而不是utf-8来解释数据,并且您的非ASCII字符将被删除.

以下评论适用于Excel 2003,2007和2013; 没有在Excel 2000上测试过

如果通过在Windows资源管理器中双击其名称来打开文件,则一切正常.

如果从Excel中打开它,结果会有所不同:

  1. 您在文件中只有ASCII字符(并且没有BOM):有效.
  2. 您在文件中有非ASCII字符(以UTF-8编码),在开头有一个UTF-8 BOM:它识别您的数据以UTF-8编码,但它忽略了csv扩展并将您放入文本不幸的是,导入非精灵,导致你遇到换行问题.

选项包括:

  1. 训练用户不要在Excel中打开文件:-(
  2. 考虑直接编写XLS文件...在Python/Perl/PHP/.NET/etc中有可用的包/库


小智 23

经过大量调整后,这里的配置可以在Linux上生成文件,在Windows + Excel上读取

  • 字段中的换行符必须为\n(显然用双引号引用)
  • 记录结束:\ r \n
  • 确保不使用equals启动字段,否则将其视为公式并截断

在Perl中,我使用Text :: CSV执行此操作,如下所示:

use Text::CSV;

open my $FO, ">:encoding(utf8)", $filename or die "Cannot create $filename: $!";
my $csv = Text::CSV->new({ binary => 1, eol => "\r\n" });

#for each row...:
$csv -> print ($FO, \@row);
Run Code Online (Sandbox Code Playgroud)

  • 是的,\ r \n做到了.我可以确认这适用于Windows + Excel,OSX + Numbers和Google Docs. (3认同)
  • 使用\n(也试过\n)在一个用",并使用\ r \n"来包含行的字段中.仍然没有在Excel 2010中为我解决这个问题.我已经尝试过ANSI和UTF8-with-BOM.没有成功 (3认同)
  • 在Windows 7的Excel 2003/2010中,Ian的答案对我不起作用.我尝试使用十六进制编辑器编辑我的UTF-8 BOM文件并从'0D0A'位(\ r \n)删除0D(\ r)对于字段内的换行符.但它不起作用. (2认同)

dtl*_*rek 20

最近我有类似的问题,我通过导入HTML文件解决了它,基线示例如下:

<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
  <head>
    <style>
      <!--
      br {mso-data-placement:same-cell;}
      -->
    </style>
  </head>
  <body>
    <table>
      <tr>
        <td>first line<br/>second line</td>
        <td style="white-space:normal">first line<br/>second line</td>
      </tr>
    </table>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我知道,它不是CSV,并且对于各种版本的Excel可能有不同的工作方式,但我认为值得一试.

我希望这有帮助 ;-)

  • @GusDeCooL OP的第一句"我需要为Excel生成一个文件,这个文件中的一些值包含多行"的措辞.建议也许它不需要是一个CSV文件.此外,Q&A格式也适用于其他读者,对于其中一些读者可能是一个可行的选择(即使OP必须使用CSV).我发现你的downvote不合理(仍然,谢谢你解释原因). (34认同)

小智 8

值得注意的是,当.CSV文件的字段用双引号括起来包含换行符时,如果.CSV文件以UTF-8格式写入,Excel将无法正确导入.CSV文件.Excel将换行视为CR/LF并开始换行.电子表格是乱码.即使将冒号用作字段分隔符(而不是逗号),这似乎也是正确的.

通过使用Windows记事本编辑.CSV文件,使用"文件">"另存为..."保存文件,在保存文件之前,将文件编码从UTF-8更改为ANSI,可以解决此问题.一旦文件以ANSI格式保存,我发现在Windows 7 Professional上运行的Microsoft Excel 2013将正确导入文件.


Clo*_*eto 8

在 Excel 365 中导入文件时:

数据 -> 来自文本/CSV: 从文本/CSV

-> 选择文件 > 转换数据:

选择文件 -> 转换数据

在 Power Query 编辑器的右侧“查询设置”处,在“应用步骤”下的“源”行上,单击“设置图标”

源设置图标

-> 在换行符下拉列表中选择忽略引号内的换行符。

忽略引用的换行符

然后按 OK -> File -> Close & Load

  • 我很高兴我为此向下滚动!我还添加了步骤的屏幕截图,并添加了英文 Excel 版本中的术语。 (2认同)

小智 6

如果您使用分号作为分隔符而不是逗号或制表符,并使用引号,则值内的换行似乎有效.

这在Excel 2010和Excel 2000中都适用.但是,令人惊讶的是,它仅在您将文件作为新电子表格打开时才有效,而不是在使用数据导入功能将其导入现有电子表格时.