我需要为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)。
不是我想要的,但至少它有效(到目前为止)
答案 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 :(得分:23)
经过大量调整后,这里的配置可以在Linux上生成文件,在Windows + Excel上阅读
在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。
答案 18 :(得分:-3)
将HTML换行符<br/>
打印到内容中并在excel中打开将在任何Excel上正常工作