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

时间:2009-08-06 20:28:55

标签: excel csv newline

我需要为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)。

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

19 个答案:

答案 0 :(得分:64)

只有字段的开头才有空格字符,空格字符是数据的一部分。 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扩展名并丢弃了你不幸的是,你进入了文本导入非一个向导,结果你得到了换行问题。
  3. 选项包括:

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

答案 1 :(得分: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);

答案 2 :(得分: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可能有不同的工作方式,但我认为值得一试。

我希望这会有所帮助; - )

答案 3 :(得分:8)

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

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

答案 4 :(得分:6)

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

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:3)

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

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

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

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

""text" + NL + "text""

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

2

DATE

这里是基本

中的代码
CHR$(34,"2", 10,"DATE", 34)

答案 7 :(得分: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';

答案 8 :(得分:1)

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

解决方法是将任何新行换回(CHR 13)而不是换行。

答案 9 :(得分: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:在您的建议中,请提供一些数据样本,而不仅仅是代码。

答案 10 :(得分:1)

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

通常新行是&#34; \ r \ n&#34;。在我的CSV中,我替换了#34; \ r&#34;空值。 这是Javascript中的代码:

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

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

答案 13 :(得分:0)

仅对于打开文件,语法为

 ,"one\n
 two",...

关键是在第一个“,”之后没有没有空格。通常,空格是可以的,如果没有用引号将其括起来,则可以将其修剪掉。但否则令人讨厌。花了我一段时间才能弄清楚。

行尾\ n或\ c \ n似乎无关紧要。

请确保您展开了编辑栏,以便实际上可以看到单元格中的文本(漫长的一天后让我...)

现在,当然,文件打开将不正确支持UTF-8(除非有人使用技巧)。

Excel>数据> 获取外部数据>来自文本

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

(也许30年前MS会正确处理此事的。)

答案 14 :(得分:0)

在Excel 365中导入文件时:

数据->从文本/ CSV->选择文件>转换数据->数据源配置->选择数据源->单击编辑源->在换行符下拉列表中,选择忽略引号内的换行符。

以上文字是葡萄牙语翻译的,因此英文的措词可能有所不同。

答案 15 :(得分:-1)

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

答案 16 :(得分:-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");                  

答案 17 :(得分:-2)

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

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

答案 18 :(得分:-3)

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