为Excel生成CSV文件,如何在值中包含换行符
我需要为Excel生成一个文件,这个文件中的一些值包含多行。
那里还有非英文文本,所以文件必须是Unicode。
我现在生成的文件看起来像这样:(在UTF8中,非英文文本混合在一起,并有很多行)
Header1,Header2,Header3 Value1,Value2,"Value3 Line1 Value3 Line2"
注意多行值用双引号引起来,每行换行符都是正常的。
根据我在网上发现的这个应该工作,但它不,至less没有赢得Excel 2007和UTF8文件,Excel将第三行作为数据的第二行而不是作为第一个数据行的第二行。
这必须在我的客户的机器上运行,我无法控制他们的Excel版本,所以我需要一个可以在Excel 2000及更高版本中使用的解决scheme。
谢谢
编辑:我解决了我的问题,有两个CSV选项,一个用于Excel(Unicode,制表符分隔,字段中没有换行符),另一个用于世界其他地方(UTF8,标准CSV)。
不是我正在寻找,但至less它的作品(到目前为止)
只有在空格字符是数据的一部分的情况下,字段的起始处应该有空格字符。 Excel不会剥离前导空格。 您的标题和数据字段中会有不需要的空格。 更糟糕的是, "
应该”保护“第三栏中的换行符将被忽略,因为它不在现场开始。
如果文件中包含非ASCII字符(用UTF-8编码),则应在文件的开始处使用UTF-8 BOM(3字节, hex EF BB BF
)。 否则,Excel将根据您的语言环境的默认编码(例如cp1252)而不是utf-8解释数据,并且您的非ASCII字符将被丢弃。
以下评论适用于Excel 2003,2007和2013; 未在Excel 2000上进行testing
如果通过在Windows资源pipe理器中双击其名称来打开该文件,则一切正常。
如果您从Excel中打开它,结果会有所不同:
- 在文件中只有ASCII字符(并且没有BOM):工作。
- 您在文件中使用非ASCII字符(使用UTF-8编码),并在开始时使用UTF-8 BOM:它可以识别您的数据是以UTF-8编码的,但忽略csv扩展名并将您放入文本导入不是一个向导 ,不幸的是你得到了换行问题。
选项包括:
- 训练用户不要从Excel中打开文件:-(
- 考虑直接编写一个XLS文件…有Python / Perl / PHP / .NET /等可用的包/库
经过大量的调整,这里有一个在Linux上生成文件的configuration,在Windows + Excel上阅读
- 字段中的换行符必须是\ n(明显用双引号引用)
- logging结束:\ 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);
最近我有类似的问题,我通过导入一个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的各种版本工作不同,但我认为这是值得一试。
我希望这有帮助 ;-)
如果您使用分号作为分隔符,而不是逗号或制表符,并使用引号,则值内的换行似乎可行。
这在Excel 2010和Excel 2000中都适用于我。然而,令人惊讶的是,它仅在您将文件作为新电子表格打开时才起作用,而不是在使用数据导入function将其导入到现有电子表格时起作用。
值得注意的是,当一个.CSV文件的字段用换行符包含换行符时,如果.CSV文件是以UTF-8格式编写的话,Excel将不会正确导入.CSV文件。 Excel将换行视为CR / LF,并开始换行。 电子表格出现乱码。 即使将分号用作字段分隔符(而不是逗号),似乎也是如此。
使用Windows记事本编辑.CSV文件,使用文件>另存为…来保存文件,并在保存文件之前,将文件编码从UTF-8更改为ANSI,即可解决该问题。 一旦文件以ANSI格式保存,我发现运行在Windows 7 Professional上的Microsoft Excel 2013将正确地导入文件。
在PC上,ASCII字符#10是你想要在一个值内放置一个换行符。
但是,一旦将其放入Excel中,则需要确保多行单元格的换行符已打开,否则换行符将显示为方框。
如果您尝试将文件导入EXCEL,这将不起作用。
将文件扩展名csv与EXCEL.EXE关联起来,这样你就可以通过双击csv文件来调用EXCEL。
在这里,我放置一些文本,其次是NewLine字符,后跟一些更多的文本,并用双引号括住整个string。
不要使用CR,因为EXCEL会将string的一部分放在下一个单元格中。
""text" + NL + "text""
当你调用EXCEL时,你会看到这个。 您可能必须自动调整高度以查看全部。 换行符取决于单元格的宽度。
2
date
这里是基本的代码
CHR$(34,"2", 10,"DATE", 34)
包含BOM的UTF文件将导致Excel直接处理新行,即使在该字段中包含引号。 (经过testing的Excel 2008 Mac)
解决办法是使任何新行回车(CHR 13),而不是换行。
在每一行的末尾加上“\ r”实际上在excel中有换行符的效果,但在.csv中它却消失了,并留下一个丑陋的混乱,每一行都被压扁,没有空格,没有换行符
我们这样做的方式(我们使用VB.Net)是用Chr(34)中的新行将文本括起来,它是代表双引号的char,并replaceLF的所有CR-LF字符。
我发现这一点,它已经为我工作
$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
. PHP_EOL
脚本的结尾打印出一个链接,以便用户可以下载文件。
echo 'Click <a href="myfile.csv">here</a> to download file';
通常新行是“\ r \ n”。 在我的CSV中,我用空值replace了“\ r”。 这里是Javascript中的代码:
cellValue = cellValue.replace(/\r/g, "")
当我在MS Excel中打开CSV时,它运行良好。 如果一个值有多行,它将保留在Excel工作表的单个单元格中。
testing这个:它完全适用于我:将下面的行放在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打开。
在某些情况下会直接打开,否则将需要使用列来进行数据转换。 展开列宽并点击换行button。 或格式化单元格并激活换行文本。
并感谢其他的build议,但他们没有为我工作。 我在一个纯粹的Windows环境,并不想玩unicode或其他有趣的事情。
这样你从csv到Excel的公式。 这种工作方法可能有很多用途。 (注意在报价前)
pd:在你的build议中,请把一些样本的数据不仅仅是代码。
这是一个有趣的方法使用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");
你可以做下一个“\”Value3 Line1 Value3 Line2 \“”。 它适用于我在java中生成一个csv文件
在内容中打印一个HTML换行符,并在Excel中打开,对任何Excel都可以正常工作