170

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

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

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

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

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

根据我在网上发现的内容,这应该可以工作,但至少不能赢得 Excel 2007 和 UTF8 文件,Excel 将第三行视为第二行数据而不是第一行数据的第二行.

这必须在我客户的机器上运行,而且我无法控制他们的 Excel 版本,所以我需要一个适用于 Excel 2000 及更高版本的解决方案。

谢谢

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

不是我想要的,但至少它有效(到目前为止)

4

19 回答 19

73

仅当空格字符是数据的一部分时,您才应该在字段的开头使用空格字符。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 扩展名并将您放入Text导入 not-a-Wizard,不幸的是,您会遇到换行问题。

选项包括:

  1. 训练用户不要从 Excel 中打开文件 :-(
  2. 考虑直接编写一个 XLS 文件...在 Python/Perl/PHP/.NET/etc 中有可用于执行此操作的包/库
于 2009-08-09T13:26:52.507 回答
32

经过大量调整,这是一个可以在 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);
于 2012-03-01T08:04:13.040 回答
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 可能会有所不同,但我认为值得一试。

我希望这有帮助 ;-)

于 2013-06-06T22:05:36.737 回答
10

在 Excel 365 中导入文件时:

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

-> 选择文件 > 转换数据:

选择文件 -> 转换数据

在 Power Query 编辑器的“查询设置”右侧,在“应用步骤”下的“源”行中,单击“设置图标”

源设置图标

-> 在换行符下拉列表中选择忽略引号内的换行符。

忽略引用的换行符

然后按 OK -> File -> Close & Load

于 2019-09-11T13:46:55.087 回答
8

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

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

于 2015-04-28T21:40:50.027 回答
7

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

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

于 2011-09-22T09:49:40.987 回答
4

在 PC 上,ASCII 字符 #10 是您想要在值中放置换行符的内容。

但是,一旦将其导入 Excel,您需要确保为多行单元格打开自动换行,否则换行符将显示为方形框。

于 2009-08-06T21:57:01.377 回答
3

如果您尝试将文件导入 EXCEL,这将不起作用。

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

在这里,我放置了一些文本,然后是 NewLine Char,然后是一些文本,并用双引号将整个字符串括起来。

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

""text" + NL + "text""

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

2

日期

这是Basic中的代码

CHR$(34,"2", 10,"DATE", 34)
于 2013-09-15T20:09:04.330 回答
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';
于 2011-07-22T21:06:06.013 回答
1

包含 BOM 的 UTF 文件将导致 Excel 按字面意思处理新行,即使该字段被引号包围。(经过测试的 Excel 2008 Mac)

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

于 2011-12-09T08:02:14.410 回答
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:在您的建议中,请放一些数据样本,而不仅仅是代码。

于 2016-01-28T05:37:28.813 回答
1

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

于 2017-02-04T08:42:24.953 回答
1

仅对于文件打开,语法为

 ,"one\n
 two",...

关键是第一个“,”之后没有空格。通常空格很好,如果字符串没有被引用,则修剪。但除此之外很讨厌。我花了一段时间才弄清楚。

行结束是 \n 还是 \c\n 似乎并不重要。

确保展开公式栏,以便您可以实际看到单元格中的文本(经过漫长的一天后得到我......)

当然,现在 File Open 将不会正确支持 UTF-8(除非使用技巧)。

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

可以设置为UTF-8模式(它位于字体列表的下方)。但是,在这种情况下,新线路似乎不起作用,我不知道如何解决。

(有人可能会认为,30 年后 MS 会做对这些事情。)

于 2019-04-20T11:40:53.597 回答
0

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

于 2009-10-06T14:03:55.850 回答
0

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

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

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

于 2015-05-14T05:48:09.547 回答
-1

你可以做下"\"Value3 Line1 Value3 Line2\""。它适用于我在java中生成一个csv文件

于 2013-12-06T14:01:02.013 回答
-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");                  
于 2013-06-02T08:40:08.810 回答
-4

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

于 2013-10-25T12:18:08.230 回答
-4

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

  1. 选择您要编辑的单元格
  2. 通过双击或按 F2 进入编辑模式 3.按 Alt+enter。这将在单元格中创建一个新行
于 2018-02-07T11:24:10.470 回答