Excel是否可以自动识别UTF-8格式的CSV文件?

620
我正在开发一个应用程序的一部分,负责将一些数据导出到CSV文件中。该应用程序始终使用UTF-8编码,因为它在所有层面上都具有多语言特性。但是,在Excel中打开这些包含重音符、西里尔字母和希腊字母等内容的CSV文件时,并不能达到预期的结果,显示出类似于“Г„/Г¤, Г–/Г¶”这样的内容。我不知道如何强制Excel理解打开的CSV文件是以UTF-8编码的。我还尝试了指定UTF-8 BOM“EF BB BF”,但Excel忽略了它。
是否有任何解决方法?
附注:哪些工具可能会像Excel一样表现?

更新

我必须说,我在提问的方式上让社区感到困惑了。当我提出这个问题时,我是想要一种在Excel中以流畅和透明的方式打开UTF-8格式的CSV文件,对用户没有任何问题的方法。然而,我使用了错误的表述,要求自动完成这个操作。这非常令人困惑,并且与VBA宏自动化相冲突。对于这个问题,有两个答案我最为赞赏:Alex给出的第一个答案,我已经接受了这个答案;以及稍后出现的Mark的第二个答案。从可用性的角度来看,Excel似乎缺乏友好的UTF-8 CSV支持,所以我认为两个答案都是正确的,我之所以首先接受了Alex的答案,是因为他确实指出了Excel无法透明地完成这个任务。这就是我在这里与自动混淆的地方。Mark的答案提供了一种更复杂的方法,适用于更高级的用户来实现预期的结果。两个答案都很棒,但Alex的答案稍微更符合我没有明确说明的问题。


更新2

距离上次编辑已经过去了五个月,我注意到Alex的回答不知何故消失了。我真的希望这不是技术问题,并且希望现在不再有关于哪个答案更好的讨论。因此,我接受Mark的答案作为最佳答案。


1
你能使用制表符分隔的文件吗?如果可以,你可能会更加幸运。 - Tim Perry
11
Office 2010+:最佳工作方式是使用带BOM的UTF-16LE编码,以\t作为分隔符。适用于英文和非英文Excel设定。可以直接按Ctrl-S进行保存,无需选择文件格式等操作。可以保留Unicode字符。 - Sebastian
3
Alex的回答被版主删除了。没有给出任何解释,但如果您有足够的声望,仍然可以看到它。 - Mark Ransom
1
@osexpert,你因为你的Excel 2010经验与我六年前的经验不同就给我点了个踩?好吧。我声称那时它并没有以直接的方式适用于Excel。 - Lyubomyr Shaydariv
2
这不是很疯狂吗?在这个帖子发布12年后的今天,我竟然遇到了完全相同的问题,与Excel有关。我将数据翻译成西班牙语,并将其导出为CSV文件,然后尝试在Excel中打开它。重音字符看起来像垃圾一样。微软真的会听取使用他们产品的任何人的建议吗? - hamayoun
显示剩余11条评论
33个回答

1
我几天前遇到了同样的问题,因为我无法使用“从csv导入”功能,所以找不到任何解决方法,因为它会将所有内容都设置为字符串格式。
我的解决方案是首先使用notpad++打开文件并将编码更改为ASCII。然后只需在Excel中打开文件即可按预期工作。

1
  1. 下载并安装LibreOffice Calc
  2. 在LibreOffice Calc中打开您选择的csv文件
  3. 感谢上天,导入文本向导出现了...
  4. ...选择您的分隔符和字符编码选项
  5. 在Calc中选择结果数据,然后复制粘贴到Excel中

1
发现了一个解决方案,可以在ASP.NET Core中使用POM将CSV文件下载为UTF8:
byte[] csvBytes = Encoding.Default.GetBytes(csvString);
UTF8Encoding utf8 = new UTF8Encoding(true);
byte[] bom = utf8.GetPreamble();
var result = bom.Concat(csvBytes).ToArray();
return new FileContentResult(result, MediaTypeHeaderValue.Parse("text/csv; charset=utf-8"));

Excel 会将下载的 CSV 文件识别为 UTF8 格式。


1
运行得很好,不错。 - Ben Croughs

1

Office 365的有效解决方案

  • 保存为UTF-16(不要LE,BE)
  • 使用分隔符\t

PHP代码

$header = ['číslo', 'vytvořeno', 'ěščřžýáíé'];
$fileName = 'excel365.csv';
$fp = fopen($fileName, 'w');
fputcsv($fp, $header, "\t");
fclose($fp);

$handle = fopen($fileName, "r");
$contents = fread($handle, filesize($fileName));
$contents = iconv('UTF-8', 'UTF-16', $contents);
fclose($handle);

$handle = fopen($fileName, "w");
fwrite($handle, $contents);
fclose($handle);

你说的“没有LE或BE”是什么意思?它必须是其中之一,对吧? - Phil

1
15年后,我终于找到了解决方案:使用UTF-16-LE编码写入CSV文件,且不带BOM,这样在Excel 2007+上就能正常工作。
使用Python示例:
import csv
with open('test.csv', "w", encoding="utf-16-le", newline='') as csvfile:
    w = csv.writer(csvfile, delimiter=';')
    w.writerow(["abc", "def"])
    w.writerow(["été", "hiver"])

输出的CSV文件可以直接用Excel打开,并且:
- 没有重音符号的问题 - 分隔符会自动解析成多个列

感谢您发布这个。在撰写此答案时,它证明非常有帮助。 - undefined

0

这是一个老问题,但我刚遇到了类似的问题,解决方案可能会帮助其他人:

写出 CSV 文本数据到文件中,然后在 Excel 中打开生成的 .csv 文件时,所有文本都被移动到单个列中。在阅读了上面的答案后,我尝试了以下方法,似乎解决了这个问题。

在创建 StreamWriter 时应用 UTF-8 编码。就这样。

例如:

using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
   /* ... do stuff .... */
   output.Close();
}

@elmue 能否详细说明一下?确保最初使用正确的编码输出CSV,这样后续在Excel中就不会出现兼容性问题了,是吧? - Steve
代码有误,因为如果您使用了using()语句,就不需要output.Close()。除此之外,Excel CSV导入非常原始,我根本不会使用它。如果您想要在Excel中导入,请改用HTML表格,并在Excel中打开它。 - Elmue
我已经阅读了原帖 - 我提供了一种通过Excel创建CSV文件的方法,以解决问题,并且还打开了OP要求的特定编码。在Excel 2013和.NET 4中似乎可以正常工作,所以我猜测我们的实验之间存在Office类型库的版本差异?HTML方法效率低下,我仍然很惊讶你试图吹嘘它的优点 - 你所描述的纯文本异常是由于编码问题。尝试使用{}导入为纯文本并将其另存为新文件,强制进行编码。它有效。 - Steve
似乎在2007年和2013年都能正常工作,所以不确定你出了什么问题。 - Steve
UTF8 BOM 绝对不适用于 Excel 2007。它会被忽略。 - Elmue
显示剩余6条评论

0
我正在从一个简单的C#应用程序生成csv文件,并且遇到了相同的问题。我的解决方案是确保文件使用UTF8编码编写,如下所示:
// Use UTF8 encoding so that Excel is ok with accents and such.
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
    SaveCSV(writer);
}

我最初有以下代码,在Notepad++中重音符号看起来很好,但在Excel中却被搞乱了:

using (StreamWriter writer = new StreamWriter(path))
{
    SaveCSV(writer);
}

你的结果可能会有所不同 - 我正在使用.NET 4和来自Office 365的Excel。


0

我尝试了这个帖子和类似帖子中所有的方法,但都不能完全解决问题。然而,把数据导入到Google表格中,然后简单地下载为CSV格式文件,效果非常好。如果你也遇到了同样的困扰,可以试试这种方法。


0

如果您想要让它完全自动化,只需单击或从网页中自动加载到Excel中,但无法生成正确的Excel文件,那么我建议您考虑SYLK格式作为替代方案。好吧,它不像CSV那样简单,但它是基于文本的,非常容易实现,并且支持UTF-8而没有问题。

我编写了一个PHP类,接收数据并输出一个SYLK文件,通过点击该文件将直接在Excel中打开(如果您使用正确的mime类型将文件写入网页,则会自动启动Excel)。您甚至可以添加格式(如粗体,以特定方式格式化数字等)并更改列大小,或根据列中的文本自动调整列的大小,总体而言,代码可能不超过100行。

通过创建一个简单的电子表格并将其保存为SYLK,然后使用文本编辑器读取它,SYLK的反向工程非常容易。 第一个块是标题和标准数字格式,您将识别出它们(您只需在创建的每个文件中重复它们),然后数据只是X / Y坐标和值。


0

现在是2022年3月,似乎我们无法同时使用BOM和sep=...行。 添加sep=\t或类似的内容会使Excel忽略BOM。

使用分号似乎是Excel默认理解的方式,这种情况下我们可以跳过sep=...行并且它能够正常工作。

这是Microsoft 365带有Excel版本2110 build 14527.20276。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接