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

问题描述 投票:144回答:18

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

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

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

Header1,Header2,Header3
Value1,Value2,"Value3 Line1
Value3 Line2"

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

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

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

谢谢

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

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

excel csv newline
18个回答
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中有可用的包/库

1
投票

测试一下:它完全适合我:将以下行放在xxxx.csv文件中

hola_x,="este es mi text1"&CHAR(10)&"I sigo escribiendo",hola_a

hola_y,="este es mi text2"&CHAR(10)&"I sigo escribiendo",hola_b

hola_z,="este es mi text3"&CHAR(10)&"I sigo escribiendo",hola_c

用excel打开。

在某些情况下会直接打开,否则将需要使用列到数据转换。展开列宽并点击换行文本按钮。或格式化单元格并激活换行文本。

并感谢其他建议,但他们没有为我工作。我是一个纯粹的Windows环境,并不想玩unicode或其他有趣的东西。

这样你就可以将csv中的公式放到excel中。这种工作方法可能有很多用途。 (注意引号前的=)

pd:在您的建议中,请提供一些数据样本,而不仅仅是代码。


1
投票

把“\ r”放在每一行的末尾实际上有excel的换行效果,但在.csv中它消失了,留下了一个丑陋的混乱,每一行被压扁而没有空格而且没有换行符


0
投票

我们这样做的方式(我们使用VB.Net)是在Chr(34)中用新行包含文本,这是表示双引号的char并替换LF的所有CR-LF字符。


0
投票

通常新行是“\ r \ n”。在我的CSV中,我将“\ r \ n”替换为空值。这是Javascript中的代码:

cellValue = cellValue.replace(/\r/g, "")

当我在MS Excel中打开CSV时,它运行良好。如果值有多行,则它将保留在Excel工作表中的1个单个单元格内。


0
投票

仅对于文件打开,语法为

 ,"one\n
 two",...

关键是第一个“,”之后没有空间。通常空格很好,如果没有引用字符串则修剪。但其他令人讨厌的。我花了一段时间来弄清楚这一点。

线是否结束似乎无关紧要\ n或\ c \ n。

确保展开公式栏,以便您可以实际看到单元格中的文本(经过漫长的一天后得到我...)

当然,File Open不会正确支持UTF-8(除非使用技巧)。

Excel>数据>获取外部数据>从文本

可以设置为UTF-8模式(它是字体列表的下方)。但是,在这种情况下,新行似乎不起作用,我知道无法解决这个问题。

(有人可能会说,30年后,MS会把这些东西弄好。)


-1
投票

你可以做下一个"\"Value3 Line1 Value3 Line2\""。它适用于我在java中生成csv文件


-2
投票

这是一个使用JavaScript的有趣方法......

  String.prototype.csv = String.prototype.split.partial(/,\s*/);  

  var results = ("Mugan, Jin, Fuu").csv();                        

  console.log(results[0]=="Mugan" &&                                   
         results[1]=="Jin" &&                                     
         results[2]=="Fuu",                                       
         "The text values were split properly");                  

-2
投票

您可以使用键盘快捷键ALT + Enter。

  1. 选择要编辑的单元格
  2. 通过双击或按F2进入编辑模式。按Alt + Enter。这将在单元格中创建一个新行

-3
投票

将HTML换行符<br/>打印到内容中并在excel中打开将在任何excel上正常工作


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);

18
投票

最近我有类似的问题,我通过导入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>

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

我希望这有帮助 ;-)


8
投票

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

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


6
投票

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

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


4
投票

在PC上,ASCII字符#10是您想要在值中放置换行符的内容。

但是,一旦进入Excel,您需要确保为多行单元格打开自动换行,否则换行符将显示为方框。


3
投票

如果您尝试将文件导入EXCEL,则无效。

将文件扩展名csv与EXCEL.EXE相关联,这样您就可以通过双击csv文件来调用EXCEL。

在这里,我放置一些文本,然后是NewLine Char,接着是一些文本,并用双引号括起整个字符串。

不要使用CR,因为EXCEL会将字符串的一部分放在下一个单元格中。

""text" + NL + "text""

当您调用EXCEL时,您将看到这一点。您可能需要自动调整高度以查看全部内容。换行的位置取决于单元格的宽度。

2

日期

这是Basic中的代码

CHR$(34,"2", 10,"DATE", 34)

2
投票

我找到了这个,它对我有用

$delimiter = ',';
$enc1 = '"';
$enc2 = '""';

然后你需要把东西封闭

$myfile = ('/path/to/myfile.csv');
//erase any previous contents
$fp = fopen($myfile, 'w+');
fwrite($fp, $enc1 .  'Column Heading 1' . $enc1 . $delimiter );
//append to new file
$fp2 = fopen($myfile, 'a');
fwrite($fp2, $enc1 .  'Column Heading 2' . $enc1 . $delimiter );

.....

fwrite($fp2, $enc1 .  'Last Column Heading' . $enc1 . $delimiter. PHP_EOL );

然后,当你需要写出一些东西时 - 比如包含“你可以做到这一点的HTML”

fwrite($fp2, $enc2 .  $myhtmlstring . $enc2 . $delimiter);

新线以. PHP_EOL结束

脚本末尾打印出一个链接,以便用户可以下载该文件。

echo 'Click <a href="myfile.csv">here</a> to download file';

1
投票

包含BOM的UTF文件将导致Excel在字面上处理新行,即使该字段被引号括起来也是如此。 (经过测试的Excel 2008 Mac)

解决方案是使任何新行回车(CHR 13)而不是换行。

© www.soinside.com 2019 - 2024. All rights reserved.