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

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

里面还有非英文文本,所以文件必须是 Unicode。

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

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

注意,多行值用双引号括起来,其中包含一个正常的日常换行符。

根据我在网上的发现,这应该是有效的,但是它没有,至少没有赢得 Excel 2007和 UTF8文件,Excel 把第三行作为第二行数据,而不是第一行数据的第二行。

这必须在我的客户的机器上运行,我对他们的 Excel 版本没有控制权,所以我需要一个解决方案,将与 Excel2000和更高版本。

谢谢

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

虽然不是我想要的,但至少它起作用了(到目前为止)

387391 次浏览

在个人电脑上,ASCII 字符 # 10是您希望在值中放置换行符的位置。

然而,一旦您将其放入 Excel 中,您需要确保为多行单元格打开了自动换行,否则换行将显示为一个正方形框。

只有在空格字符为数据一部分的字段的开头才应该有空格字符。Excel 不会去掉前导空格。您将在标题和数据字段中获得不需要的空格。更糟糕的是,应该“保护”第三列中的换行符的 "将被忽略,因为它不在字段的开头。

如果文件中有非 ASCII 字符(以 UTF-8编码) ,则在文件的开头应该有一个 UTF-8 BOM (3字节,hex EF BB BF)。否则,Excel 将根据您的区域设置的默认编码(例如 cp1252)而不是 utf-8来解释数据,并且您的非 ASCII 字符将被垃圾处理。

以下注释适用于 Excel2003、2007和2013; 未在 Excel2000上测试

如果你用文件资源管理器双击文件名打开它,一切都会正常工作。

如果从 Excel 中打开它,结果会有所不同:

  1. 文件中只有 ASCII 字符(没有 BOM) : 可用。
  2. 文件中有非 ASCII 字符(用 UTF-8编码) ,在开始处有一个 UTF-8 BOM: 它识别出数据是用 UTF-8编码的,但是它忽略了 csv 扩展名并将您放入 导入非向导,不幸的是,结果是您得到了换行问题。

备选方案包括:

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

我们的方法(使用 VB.Net)是在 Chr (34)中用新行封装文本,Chr (34)是表示双引号的字符,并替换 LF 的所有 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结束

脚本的末尾打印出一个链接,以便用户可以下载该文件。

echo 'Click <a href="myfile.csv">here</a> to download file';

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

这在 Excel2010和 Excel2000中都适用。然而,令人惊讶的是,只有当您将文件作为新的电子表格打开时,它才能工作,而不是当您使用数据导入功能将其导入到现有的电子表格中时。

包含 BOM 的 UTF 文件将导致 Excel 按字面意义处理新行,即使该字段被引号包围。(TestedExcel2008Mac)

解决方案是将任何新行设置为回车符(CHR13) ,而不是换行符。

经过大量的调整,这里有一个可以在 Linux 上生成文件的配置,可以在 Windows + Excel 上阅读,不过嵌入式换行格式不符合 标准:

  • 一个字段中的 Newlines 需要是 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);

下面是一个使用 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");

最近我也遇到了类似的问题,我通过导入一个 超文本标示语言文件解决了这个问题,基线示例是这样的:

<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,这将不起作用。

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

这里我放置了一些文本,后面跟着 NewLine 字符,后面跟着一些文本,用双引号包围整个字符串。

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

""text" + NL + "text""

当您调用 EXCEL 时,您将看到这一点。您可能必须自动调整高度才能看到全部内容。换行的位置取决于单元格的宽度。

2

日期

这是 Basic 中的代码

CHR$(34,"2", 10,"DATE", 34)

打印一个 HTML 换行 <br/>到内容和打开 Excel 将工作良好的任何 Excel

你可以做下一个 "\"Value3 Line1 Value3 Line2\""。它工作为我生成一个 csv 文件在 java

值得注意的是,当。CSV 文件的字段用双引号包装,其中包含换行符,Excel 不会导入。正确的 CSV 文件,如果。CSV 文件以 UTF-8格式编写。Excel 将换行符视为 CR/LF 并开始一个新行。电子表格是混乱的。即使使用分号作为字段分隔符(而不是逗号) ,这似乎也是正确的。

可以通过使用 Windows 记事本编辑。CSV 文件,使用 File > Save As... 保存文件,在保存文件之前,将文件编码从 UTF-8更改为 ANSI。一旦该文件以 ANSI 格式保存,那么我发现在 Windows7Professional 上运行的 MicrosoftExcel2013将正确导入该文件。

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

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

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

试试这个: 它完全适合我: 在 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 env,并不想玩 Unicode 或其他有趣的东西。

这样你可以把一个公式从 csv 放到 excel 中。这种工作方法可能有很多用途。 (注意引号前的 =)

在您的建议中请不要只放一些样本数据代码。

将“ r”放在每行的末尾实际上在 excel 中具有换行的效果,但是在。Csv 消失了,留下了一个丑陋的混乱,每一行被挤压到下一个没有空间和没有断行

你可以使用快捷键 ALT + E nter。

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

仅对于 打开文件,语法为

 ,"one\n
two",...

关键是 没有空间在第一个“ ,”之后。通常情况下,空格是合适的,如果字符串没有引号,空格就会被修剪。除此之外还很恶心。我花了好久才想明白。

直线的结尾是 n 还是 c n 似乎并不重要。

确保你展开了公式栏,这样你就可以看到单元格中的文本(经过漫长的一天...)

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

Excel > Data > 获取外部数据 > From Text

可以设置为 UTF-8模式(它是字体列表的下方)。然而,在这种情况下,新的行似乎不工作,我知道没有办法解决这个问题。

(有人可能会认为,30年后,多发性硬化症患者会把这些东西做对。)

在 Excel365中导入文件时:

数据-> 来自文本/CSV: From Text/CSV

- > 选择档案 > 转换资料:

Select File -> Transform Data

在电源查询编辑器的“查询设置”右侧的“应用程序步骤”下的“源”行上,单击“设置图标”

Source settings icon

- > 在分行符下拉菜单中选择忽略引号中的分行符。

Ignore quoted line breaks

然后按确定-> 文件-> 关闭和加载