为 Excel 生成 CSV 文件,如何在值内添加换行符
Posted
技术标签:
【中文标题】为 Excel 生成 CSV 文件,如何在值内添加换行符【英文标题】:Generating CSV file for Excel, how to have a newline inside a value 【发布时间】:2010-11-17 11:50:30 【问题描述】:我需要为 Excel 生成一个文件,该文件中的某些值包含多行。
里面还有非英文文本,所以文件必须是 Unicode。
我现在生成的文件如下所示:(UTF8 格式,混入非英文文本且行数很多)
Header1,Header2,Header3
Value1,Value2,"Value3 Line1
Value3 Line2"
请注意,多行值用双引号括起来,其中包含一个正常的日常换行符。
根据我在网上找到的内容,这应该可以工作,但它不能,至少不能赢得 Excel 2007 和 UTF8 文件,Excel 将第三行视为第二行数据而不是第二行第一个数据行。
这必须在我客户的机器上运行,我无法控制他们的 Excel 版本,所以我需要一个适用于 Excel 2000 及更高版本的解决方案。
谢谢
编辑:我通过两个 CSV 选项“解决”了我的问题,一个用于 Excel(Unicode,制表符分隔,字段中没有换行符),另一个用于世界其他地方(UTF8,标准 CSV)。
不是我想要的,但至少它有效(到目前为止)
【问题讨论】:
仅供参考:这一切都可以在 LibreOffice 中完美运行,并且首先导入 CSV 要容易得多。 既然您已经编辑了问题并删除了空格,那么关于额外空格的公认答案非常令人困惑...... 【参考方案1】:只有在空格字符是数据的一部分时,您才应该在字段的开头使用空格字符。 Excel 不会去掉前导空格。您将在标题和数据字段中获得不需要的空格。更糟糕的是,应该“保护”第三列中的换行符的 "
将被忽略,因为它不在字段的开头。
如果文件中有非 ASCII 字符(以 UTF-8 编码),则文件开头应该有一个 UTF-8 BOM(3 个字节,hex EF BB BF
)。否则 Excel 将根据您的语言环境的默认编码(例如 cp1252)而不是 utf-8 解释数据,并且您的非 ASCII 字符将被丢弃。
以下 cmets 适用于 Excel 2003、2007 和 2013;未在 Excel 2000 上测试
如果您在 Windows 资源管理器中双击文件名打开文件,一切正常。
如果您从 Excel 中打开它,结果会有所不同:
-
文件中只有 ASCII 字符(没有 BOM):有效。
文件中有非 ASCII 字符(以 UTF-8 编码),开头为 UTF-8 BOM:它识别出您的数据以 UTF-8 编码,但忽略 csv 扩展名并丢弃您进入 Text Import not-a-Wizard,不幸的是,你遇到了换行问题。
选项包括:
-
培训用户不要从 Excel 中打开文件 :-(
考虑直接编写 XLS 文件...在 Python/Perl/php/.NET/etc 中有可用于执行此操作的包/库
【讨论】:
谢谢,我修复了问题中的前导空格问题,我手动输入了 CSV 示例并且没有从真实文件中复制粘贴,真实文件不包含这些空格,很好. @Nir:现在让我们谈谈你真正的问题。所以这意味着你有一个 UTF-8 BOM,并从 Excel 中打开文件并让文本导入向导没有识别你的 Value3 换行符应该被“保护”——对吗?或者您可能没有 UTF-8 BOM,而您必须告诉 TIW 您的数据是 UTF-8 编码的,但它仍然搞砸了换行符? 如果我要使用怎么办 |作为字段分隔符,换行作为记录分隔符,使用“保护文本字段的内容,文本字段可能包含|、”和换行符。这可能吗? 仅供参考:我已经从 Redmine 系统导出了 Excel2007 和 CSV。在开头添加 UTF-8 BOM (EFBBBF) 后,Excel 完美打开了文件。 “问题描述”列中嵌入的新行处理正确,行结构没有损坏,所有国家字符都被正确读取(在没有 UTF8 BOM 的情况下读取时被丢弃)。 Excel 甚至没有显示文本导入向导。目前,该 CSV 现在具有EFBBBF
标头,使用 0A
作为行分隔符,并使用 0D0A
作为文本单元格中字符串内的新行。
如果您想让 Excel for OS X 正确读取 CSV,以及 Excel for Windows,这里有一个很好的资源:@987654321@【参考方案2】:
经过大量调整,这是一个可以在 Linux 上生成文件,在 Windows+Excel 上读取的配置,尽管嵌入的换行符格式不符合 the standard:
字段中的换行符必须是\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);
【讨论】:
是的,\r\n 做到了。我可以确认这适用于 Windows+Excel、OSX+Numbers 和 Google Docs。 在用 " 括起来的字段中使用 \n (也尝试过 \n),并使用 \r\n 来划分行。在 Excel 2010 中仍然没有为我解决这个问题。我试过了ANSI 和 UTF8-with-BOM。没有成功 但这是因为我使用 |作为字段分隔符。如果我使用 ;作为字段分隔符,导入CSV数据时问题依然存在,但在文件资源管理器中双击打开CSV时问题消失。 Ian 的答案在 Windows 7 上的 Excel 2003/2010 中对我不起作用。我尝试使用十六进制编辑器编辑我的 UTF-8 BOM 文件并从 '0D0A 中删除了 0D (\r) ' 位 (\r\n) 用于字段内的换行符。但它不起作用。 这个答案对我有用(零修改!)使用 Excel 2010 和 WINdows 7;还使用 cygwin 附带的 perl v5.14.2。我嵌入的换行符都是\n
。谢谢【参考方案3】:
最近遇到类似的问题,我通过导入HTML文件解决了,baseline的例子是这样的:
<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 中可能会有所不同,但我认为值得一试。
我希望这会有所帮助;-)
【讨论】:
@GusDeCooL OP第一句话的措辞“我需要为Excel生成一个文件,这个文件中的一些值包含多行。”表明它可能不需要是 CSV 文件。此外,问答格式也适用于其他读者,对于其中一些读者来说,这可能是一个可行的选择(即使 OP 必须使用 CSV)。我认为您的反对票不合理(不过,感谢您解释原因)。 事实上,这对我来说是最好的选择;谢谢你的建议!【参考方案4】:在 Excel 365 中导入文件时:
数据 -> 来自文本/CSV:
-> 选择文件> 转换数据:
在 Power Query 编辑器的“查询设置”右侧,在“应用步骤”下的“源”行中,单击“设置图标”
-> 在换行下拉列表中选择忽略引号内的换行。
然后按 OK -> 文件 -> 关闭并加载
【讨论】:
我很高兴我为此向下滚动!我还添加了步骤中的屏幕截图,并添加了英文 Excel 版本中的术语。 不错的答案。奇怪的是 Excel 默认不使用这个。【参考方案5】:值得注意的是,当 .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 中。但是,令人惊讶的是,它仅在您将文件作为新电子表格打开时才有效,而不是在您使用数据导入功能将其导入现有电子表格时。
【讨论】:
是的,但后来我没有找到在 excel 中使用分号结束行的选项 如果某些实际文本数据包含分号怎么办?这行不通。【参考方案7】:在 PC 上,ASCII 字符 #10 是您要在值中放置换行符的内容。
但是,一旦将其导入 Excel,您需要确保为多行单元格打开自动换行,否则换行符将显示为方形框。
【讨论】:
【参考方案8】:如果您尝试将文件导入 EXCEL,这将不起作用。
将文件扩展名 csv 与 EXCEL.EXE 相关联,这样您就可以通过双击 csv 文件来调用 EXCEL。
在这里,我放置了一些文本,然后是 NewLine Char,然后是一些文本,并用双引号将整个字符串括起来。
不要使用 CR,因为 EXCEL 会将部分字符串放在下一个单元格中。
""text" + NL + "text""
当您调用 EXCEL 时,您会看到这一点。您可能必须自动调整高度才能看到所有内容。换行的位置取决于单元格的宽度。
2
日期
这是基本的代码
CHR$(34,"2", 10,"DATE", 34)
【讨论】:
【参考方案9】:我发现了这个,它对我有用
$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';
【讨论】:
【参考方案10】:包含 BOM 的 UTF 文件将导致 Excel 按字面意思处理新行,即使该字段被引号包围。 (测试 Excel 2008 Mac)
解决方案是将任何新行设为回车符 (CHR 13) 而不是换行符。
【讨论】:
Excel 2016 似乎可以正确处理我的 CSV 文件,即使它具有 UTF8 BOM。然而,所有不同之处在于使用';'作为字段分隔符(这是 Excel 对所有以 ',' 作为小数分隔符的语言环境所做的)。【参考方案11】:测试一下:
它完全适合我:
将以下行放入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:请在您的建议中放一些数据样本,而不仅仅是代码。
【讨论】:
【参考方案12】:将“\r”放在每一行的末尾实际上具有在 excel 中换行的效果,但在 .csv 中它消失了并留下了一个丑陋的混乱,每一行都被挤压到下一行,没有空格也没有行-休息
【讨论】:
【参考方案13】:仅对于文件打开,语法为
,"one\n
two",...
关键是第一个“,”之后没有空格。通常空格很好,如果字符串没有被引用,则修剪。但除此之外很讨厌。我花了一段时间才弄明白。
行结束是\n还是\c\n似乎并不重要。
确保展开公式栏,以便实际看到单元格中的文本(经过漫长的一天后得到我...)
当然,File Open 将无法正确支持 UTF-8(除非使用技巧)。
Excel > 数据 > 获取外部数据 > 从文本中
可以设置为 UTF-8 模式(在字体列表的下方)。但是,在这种情况下,新行似乎不起作用,我不知道如何解决。
(有人可能会认为,在 30 年后,MS 会做对这些事情。)
【讨论】:
【参考方案14】:我们这样做的方式(我们使用 VB.Net)是在 Chr(34) 中用新行括起文本,这是表示双引号的字符,并将所有 CR-LF 字符替换为 LF。
【讨论】:
【参考方案15】:通常换行是“\r\n”。在我的 CSV 中,我将“\r”替换为空值。 这是javascript中的代码:
cellValue = cellValue.replace(/\r/g, "")
当我在 MS Excel 中打开 CSV 时,它运行良好。如果一个值有多行,它将保留在 Excel 工作表中的 1 个单元格内。
【讨论】:
【参考方案16】:你可以做下一个"\"Value3 Line1 Value3 Line2\""
。它适用于我在 java 中生成 csv 文件
【讨论】:
【参考方案17】:这是一个使用 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");
【讨论】:
【参考方案18】:在内容中打印 HTML 换行符 <br/>
并在 excel 中打开在任何 excel 上都可以正常工作
【讨论】:
【参考方案19】:您可以使用键盘快捷键 ALT+Enter。
-
选择要编辑的单元格
通过双击或按 F2 进入编辑模式
3.按 Alt+回车。这将在单元格中创建一个新行
【讨论】:
如何将其集成到 CVS 文件生成中?以上是关于为 Excel 生成 CSV 文件,如何在值内添加换行符的主要内容,如果未能解决你的问题,请参考以下文章