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


158

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

那里也有非英语文本,因此文件必须是Unicode。

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

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

请注意,多行值包含在双引号中,并带有普通的日常换行符。

根据我在网上发现的信息,该方法行之有效,但至少在不赢得Excel 2007和UTF8文件的情况下,它没有,Excel将第三行视为第二行数据,而不是第一行第二行。

这必须在我的客户的计算机上运行,​​并且我无法控制他们的Excel版本,因此我需要一个可以在Excel 2000及更高版本上使用的解决方案。

谢谢

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

不是我一直在寻找的东西,但至少它能起作用(到目前为止)


1
仅供参考:这一切在LibreOffice中都可以很好地工作,并且导入CSV首先很容易。
user2061057 '16

9
对多余的空格接受的答案是现在难以置信的混乱,你已经编辑您的问题,并删除空格...
马蒂·Virkkunen

Answers:


70

只有在空格字符是数据的一部分的情况下,才应在字段的开头使用空格字符。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扩展名并将您放入文本中不幸的是,导入not-a-Wizard会导致出现换行问题。

选项包括:

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

1
谢谢,我解决了该问题中的前导空格问题,我手动输入了CSV示例,并且没有从真实文件中复制粘贴,真实文件中不包含那些空格,这很不错。
Nir

@Nir:现在让我们谈谈您的真正问题。因此,这意味着您拥有一个UTF-8 BOM,并在Excel中打开了文件,并且使文本导入向导无法识别您的Value3换行符应受到“保护”-对吗?或者,也许您没有UTF-8 BOM,而您不得不告诉TIW您的数据是UTF-8编码的,但它仍然使换行符变得杂乱无章?
约翰·马钦

如果我想使用| 作为字段分隔符,将新行用作记录分隔符,请使用“保护文本字段的内容,并且文本字段可能包含|,”和换行符。这可能吗?
乔治

1
仅供参考:我已经从Redmine系统导出了Excel2007和CSV。在开始添加UTF-8 BOM(EFBBBF)之后,Excel完美地打开了该文件。正确处理了在“问题描述”列中嵌入的新行,并且行结构没有损坏,并且所有本国字符均已正确读取(在读取不带UTF8 BOM的情况下,它们会被丢弃)。Excel甚至没有显示文本导入向导。当前,该CSV现在具有EFBBBF标题,0A用作行分隔符,并0D0A用作文本单元格中字符串的换行符。
quetzalcoatl 2015年

1
如果你试图让Excel的OS X阅读你的CSV正确,以及 Excel的Windows,这里是一个很好的资源:stackoverflow.com/questions/4348802/...
亚历山大R. Janini

25

经过大量调整后,这是一个配置,该配置可在Linux上生成文件,在Windows + Excel上读取,尽管嵌入式换行格式不符合该标准

  • 字段中的换行符必须为\ n(并且显然用双引号引起来)
  • 记录结束:\ r \ n
  • 确保不要以等号开头的字段,否则它将被视为公式并被截断

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

3
是的,\ r \ n做到了。我可以确认它可用于Windows + Excel,OSX + Numbers和Google Docs。
Yorick Sijsling,2012年

3
在用“括起来的字段中使用\ n(也尝试过\ n),并使用\ r \ n来分隔行。在Excel 2010中仍然无法解决此问题。我已经尝试过ANSI和UTF8-BOM。没有成功
nl-x

1
但这是因为我使用| 作为字段分隔符。如果我使用; 作为字段分隔符,导入CSV数据时问题仍然存在,但是通过在文件资源管理器中双击打开CSV时问题消失了。
nl-x

2
Ian的答案在Windows 7的Excel 2003/2010中对我不起作用。我尝试使用十六进制编辑器编辑UTF-8 BOM文件,并从“ 0D0A”位(\ r \ n)中删除了0D(\ r)。用于字段中的换行符。但这是行不通的。
Dan W

使用Excel 2010和Windows 7,此答案对我有效(零修改!);还使用cygwin附带的perl v5.14.2。我所有的嵌入式换行符\n。谢谢
ardnew

21

最近,我遇到了类似的问题,我通过导入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中可能会有所不同,但是我认为值得尝试。

我希望这有帮助 ;-)


35
@GusDeCooL OP第一句的措辞是:“我需要为Excel生成一个文件,该文件中的某些值包含多行。” 建议也许不需要是CSV文件。此外,Q&A格式也适用于其他阅读器,对于某些阅读器来说,这可能是一个可行的选择(即使OP必须使用CSV)。我发现您的否决票不合理(仍然,感谢您解释原因)。
dtldarek

1
实际上,这对我来说是最好的选择。谢谢你的建议!
约旦·格雷

8

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

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


7

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

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


是的,但是后来我没有找到在Excel中用分号做终点线的选项
GusDeCooL

如果某些实际文本数据包含半冒号怎么办?这行不通。
htm11h

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

然后,当您需要写出一些内容(例如包含“

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),而不是换行符。


Excel 2016似乎可以正确处理我的CSV文件,即使它具有UTF8 BOM。然而,使一切与众不同的是使用';'。作为字段分隔符(这是Excel对所有以','作为小数点分隔符的语言环境所做的工作)。
Ale

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

在excel的每行末尾加上“ \ r”实际上具有换行的效果,但是在.csv中,它消失了,并留下了一个丑陋的混乱,其中每一行都紧紧挤压到下一行,没有空格且没有换行


0

我们这样做的方法(我们使用VB.Net)是在Chr(34)中用新行括起来,该行是表示双引号的字符,并将所有CR-LF字符替换为LF。


0

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

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

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


0

仅对于“ 打开文件”,语法为

 ,"one\n
 two",...

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

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

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

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

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

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

(30年后,MS可能会正确处理此问题。)


0

在Excel 365中,导入文件时:

数据->从文本/ 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");                  

-3

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


-3

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

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

您如何将其集成到CVS文件生成中?
jikuja
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.