是否可以强制 Excel 自动识别 UTF-8 CSV 文件?

Is it possible to force Excel recognize UTF-8 CSV files automatically?

提问人:Lyubomyr Shaydariv 提问时间:5/14/2011 最后编辑:GuildensternLyubomyr Shaydariv 更新时间:10/3/2023 访问量:672532

问:

我正在开发一个应用程序的一部分,该应用程序负责将一些数据导出到 CSV 文件中。该应用程序始终使用 UTF-8,因为它在各个级别都具有多语言性质。但是在Excel中打开这样的CSV文件(包含例如变音符号,西里尔字母,希腊字母)并不能达到预期的结果,显示类似.而且我不知道如何强制 Excel 理解打开的 CSV 文件是以 UTF-8 编码的。我还尝试指定 UTF-8 BOM ,但 Excel 忽略了这一点。Г„/Г¤, Г–/Г¶EF BB BF

有什么解决方法吗?

P.S. 哪些工具可能像 Excel 一样运行?


更新

我不得不说,我把社区与问题的表述混淆了。当我问这个问题时,我要求一种在 Excel 中打开 UTF-8 CSV 文件的方法,以流畅和透明的方式对用户没有任何问题。但是,我使用了错误的表述,要求自动执行。这非常令人困惑,并且与VBA宏自动化相冲突。对于这个问题,我最欣赏两个答案:亚历克斯的第一个答案,我已经接受了这个答案;马克的第二个,稍后出现。从可用性的角度来看,Excel 似乎缺乏良好的用户友好型 UTF-8 CSV 支持,所以我认为这两个答案都是正确的,我首先接受了 Alex 的答案,因为它确实表明 Excel 无法透明地做到这一点。这就是我在这里自动混淆的。Mark 的回答为更高级的用户提供了一种更复杂的方法来达到预期的结果。两个答案都很棒,但亚历克斯的答案更适合我没有明确说明的问题。


更新 2

在上次编辑五个月后,我注意到亚历克斯的答案由于某种原因消失了。我真的希望这不是一个技术问题,我希望现在不再讨论哪个答案更大。所以我接受马克的答案是最好的答案。

Excel CSV UTF-8

评论

1赞 Tim Perry 5/17/2011
您可以使用制表符分隔的文件吗?如果是这样,你可能会有更多的运气。
11赞 Sebastian 11/10/2013
Office 2010+:最佳作品:UTF-16LE,带 BOM 和分隔符。将在英语和非英语Excel设置中工作。可以在不选择文件格式等的情况下按下。将保留 Unicode 字符。\tCtrl-S
3赞 Mark Ransom 9/18/2015
亚历克斯的回答被版主删除了。没有给出任何解释,但如果你有足够的声誉,你仍然可以看到它。
1赞 Lyubomyr Shaydariv 5/23/2017
@osexpert 您仅仅因为您的 Excel 2010 体验与 6 年多前的体验不同而投了反对票?好。我声称它当时并没有以直接的方式适用于 Excel。
3赞 hamayoun 7/19/2023
在这个线程 12 年后,我今天在 Excel 中遇到了完全相同的问题,这不是很疯狂吗?将数据翻译成西班牙语,然后将其提取为 CSV,并尝试在 Excel 中打开它。重音字符看起来像垃圾。Microsoft 真的会听取任何使用其产品的人的意见吗?

答:

497赞 Mark 6/27/2011 #1

Alex 是正确的,但由于您必须导出到 csv,因此您可以在打开 csv 文件时向用户提供以下建议:

  1. 将导出的文件另存为 csv
  2. 打开 Excel
  3. 使用数据导入数据-->导入外部数据-->导入数据
  4. 选择文件类型“csv”并浏览到您的文件
  5. 在导入向导中,将File_Origin更改为“65001 UTF”(或选择正确的语言字符标识符)
  6. 将分隔符更改为逗号
  7. 选择要导入的位置和完成位置

这样,特殊字符应该正确显示。

评论

1赞 mrblue6 7/20/2023
这个答案没有什么“自动”的
-1赞 Bragabondio 12/7/2011 #2

首先将 Excel 电子表格另存为 Unicode 文本。使用 Internet Explorer 打开 TXT 文件,然后单击“另存为” TXT 编码 - 选择适当的编码,即 Win Cyrillic 1251

59赞 e-zinc 1/26/2012 #3

我们使用了以下解决方法:

  1. CSV 转换成UTF-16 LE
  2. 在文件开头插入 BOM
  3. 使用制表符作为字段分隔符

评论

2赞 Husky 5/6/2013
谢谢!我尝试了此线程中的所有其他答案,但转换为 UTF-8 根本不起作用。当我尝试使用 BOM 的 UTF-16 时,它立即起作用。
0赞 multidynamic 9/14/2016
对于 Excel for Mac 2011,我成功地使用了 UTF-16 小端 csv 文件
0赞 MmM 10/31/2016
谢谢,此解决方案非常适合为我的用户提供可以在 Excel 中打开的 unicode csv。
3赞 S.Serpooshan 2/23/2021
您能更准确地解释一下如何转换为 UTF-16 LE 以及使用哪种 BOM 吗?
0赞 Chris 12/2/2023
为了实现相同的目标,这个答案遵循在 Python 和 FastAPI 中完全相同的步骤。未来的读者可能会发现它很有帮助。
4赞 alc 3/19/2012 #4

用于打开 utf-8 文本和 csv 文件的简单 vba 宏

Sub OpenTextFile()

   filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv")
   If filetoopen = Null Or filetoopen = Empty Then Exit Sub

   Workbooks.OpenText Filename:=filetoopen, _
   Origin:=65001, DataType:=xlDelimited, Comma:=True

End Sub

Origin:=65001 是 UTF-8。 逗号:对于以列形式分发的 .csv 文件为 True

将其保存在 Personal.xlsb 中,使其始终可用。 个性化 excel 工具栏,添加一个宏调用按钮并从那里打开文件。 您可以向宏添加更多格式,例如列自动调整、对齐等。

评论

2赞 Lyubomyr Shaydariv 3/20/2012
谢谢。不幸的是,这是对真正高级 Excel 用户的建议,而我提出这个问题的目的是让 Excel 自动完成它。
0赞 Sharunas Bielskis 12/7/2016
我尝试使用此代码片段,但它对我不起作用。我使用 Excel 2013。
220赞 StriplingWarrior 7/10/2012 #5

UTF-8 字节顺序标记 (BOM) 将使 Excel 2007+ 了解您使用的是 UTF-8。(请参阅此 SO 帖子)。

如果有人遇到和我一样的问题,.NET 的 UTF8 编码类不会在调用中输出字节顺序标记。您需要使用流(或使用解决方法)来输出 BOM。GetBytes()

评论

30赞 vy32 11/26/2014
插入 UTF-8 BOM 似乎是要走的路。在那之后,它是透明的。
28赞 Sébastien 6/6/2016
我使用Notepad ++轻松地将.csv从转换为UTF-8UTF-8 with BOM
3赞 user369142 11/15/2016
是的 - 最佳解决方案。关于在 http 响应中设置标头的许多令人困惑的帖子。这样就解决了问题。在记事本中打开文件并使用 UTF-8 选项保存时,也可以看到同样的情况。还添加了字节顺序标记。
2赞 StriplingWarrior 11/27/2016
@Elmue:我想也许(像我一样)他以为他用字节顺序标记保存了它,但并不是因为某些库没有像他想象的那样工作。我发现添加这个答案是值得的,显然许多其他人也发现它很有用。无论如何,这似乎比说不使用 CSV 或指导用户如何以某种奇怪的方式打开文件更好。
2赞 StriplingWarrior 12/13/2018
@marsze:谢谢你指出这一点。在我发布的链接上还有另一个答案,它使用流。我想教训是,这从来都不是用来单独生成整个文件的内容的:我们应该使用流并让它们调用等等。GetBytes()GetPreamble()GetBytes()
0赞 Steve 3/25/2013 #6

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

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

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

例:

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

评论

0赞 Steve 8/10/2016
@elmue想详细说明一下吗?当然,使用正确的编码输出 CSV 可以确保在工作流的后期不会出现与 Excel 的兼容性问题?
0赞 Elmue 8/17/2016
代码是错误的,因为您不需要输出。如果您有 using() 语句,则为 Close()。除此之外,Excel CSV 输入非常原始。我根本不会使用它。如果要在 Excel 中导入,请改用 HTML 表格并在 Excel 中打开它。
0赞 Steve 11/23/2016
感谢您澄清@Elmue - 不幸的是,我遇到了许多场景(包括跨网络驱动器的文件),其中明确需要关闭以及处置。没有找到原因,因为我想我记得在堆栈中看到了一个调用,但我们开始了。你关于CSV导入是原始的陈述也是不正确的,因为它不需要你建议的低效的HTML方法。事实上,创建额外的编程步骤来获取纯文本数据,转换为 HTML,然后拉入 Excel 似乎有悖常理Close()Dispose
0赞 Steve 11/23/2016
继续。。。但是,不同的场景有不同的要求,我的示例正确地显示了如何将编码指定为请求的 OP
0赞 Elmue 11/25/2016
请再次阅读原始问题:“我也尝试指定 UTF-8 BOM EF BB BF,但 Excel 忽略了这一点。我测试了相同的结果并得出了相同的结果:Excel 无法识别 UTf8 BOM。试试吧!编写一个 CSV 文件,并将希腊语或俄语字符放入其中。然后在Excel中打开它,你会得到垃圾。所以你的答案并不能解决任何问题。
93赞 sshturma 4/26/2013 #7

忽略 BOM 的错误似乎已在 Excel 2013 中修复。我在使用西里尔字母时遇到了同样的问题,但添加 BOM 字符确实有所帮助。\uFEFF

评论

9赞 Galdo 9/28/2013
由于我在 CSV 文件(用 Java 生成)的开头添加了 \uFEFF,因此 Excel 能够正确打开它们!感谢
21赞 Abdullah 12/31/2013
这也解决了我的问题,在PHP中它看起来像这样:$utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText;
2赞 Nelson 9/16/2015
根据定义,UTF-8 不使用也不应使用 BOM 字符。Excel 读取 BOM 的方式搞砸了 UTF-8 相对于 Unicode 的优势,即向后兼容 ASCII。添加 BOM 将使 Excel 正常工作,但会破坏其他正确的 UTF-8/ASCII 文件读取。
2赞 Nelson 9/18/2015
@MarkRansom但这根本不是 UTF-8 规范。根据定义,UTF-8 应该在二进制级别与标准 ASCII 兼容,这意味着没有超过 127 的字符。下面的其他所有内容都应该是直接的“标准”,没有特殊字符。如果没有 BOM,Microsoft 应该做的是默认 UTF-8,而不是默认为他们的 MS crptastic 编码。
1赞 Nelson 9/18/2015
@MarkRansom Microsoft在保持正常运转方面做得很糟糕。看看这份关于处理 BOM 时 Excel 不一致的详尽报告:wiki.scn.sap.com/wiki/display/ABAP/......
14赞 Steve Jessop 7/9/2013 #8

我过去也遇到过同样的问题(如何生成 Excel 可以读取的文件,其他工具也可以读取)。我使用的是 TSV 而不是 CSV,但编码也出现了同样的问题。

我未能找到任何让 Excel 自动识别 UTF-8 的方法,并且我不愿意/无法对文件的消费者施加复杂的说明如何打开它们。因此,我将它们编码为 UTF-16le(带有 BOM)而不是 UTF-8。大小是原来的两倍,但 Excel 可以识别编码。而且它们压缩得很好,所以尺寸很少(但遗憾的是不是永远)很重要。

评论

0赞 Lyubomyr Shaydariv 7/10/2013
这是一个老问题,但我很高兴人们仍然回答它。谢谢。:)
1赞 Steve Jessop 7/12/2013
@LyubomyrShaydariv:自从我回答了这个问题以来,一位同事告诉我,最新的 Excel 确实可以识别 UTF-8 CSV 文件,前提是它们具有初始 BOM。因此,几年后,当世界上的每个人(或者无论如何,我们向其提供文件的每个人)都在该版本的 Excel 或更高版本上时,我可能会更改我的编码:-)
0赞 Veverke 5/13/2015
奇怪,对我来说它不起作用。将字符变成中文符号...(他们应该是希伯来语)
0赞 Henno 4/7/2016
当我保存在“UTF-16 BE with BOM”中时,我在 Excel 中有汉字。当我尝试“带有 BOM 的 UTF-16 LE”时,它起作用了!我使用Sublime Text进行测试。
3赞 Nobilis 10/18/2013 #9

这是我的工作解决方案:

vbFILEOPEN = "your_utf8_file.csv"
Workbooks.OpenText Filename:=vbFILEOPEN, DataType:=xlDelimited, Semicolon:=True, Local:=True, Origin:=65001

密钥是 Origin:=65001

25赞 Ixtlilton 10/22/2013 #10

PHP生成的CSV文件也有同样的问题。 当分隔符是在内容开头定义时(当然是在 BOM 之后)定义 BOM 时,Excel 会忽略 BOM。"sep=,\n"

因此,在内容开头添加 BOM () 并将分号设置为分隔符 via 就可以了。"\xEF\xBB\xBF"fputcsv($fh, $data_array, ";");

评论

0赞 adamsfamily 10/16/2023
对我来说最好的答案,谢谢!
3赞 zax 3/1/2014 #11

是的,这是可能的。在编写创建 csv 的流时,首先要做的是:

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)

评论

0赞 Elmue 11/25/2016
你没有读过这个问题!Lyubomyr Shaydariv 写道:“我也尝试过指定 UTF-8 BOM EF BB BF,但 Excel 忽略了这一点。
0赞 zax 11/28/2016
这是工作代码。如果使用此线索从 .Net 应用程序写出 UTF-8 文件,Excel 会将该文件识别为 UTF8。
0赞 Elmue 12/1/2016
可能在您的 Excel 中它可以工作。但至少在 Excel 2007 中,BOM 被完全忽略。因此,如果您打算编写适用于所有 Excel 版本的代码,则您的代码是无用的。
18赞 Aki 4/29/2014 #12

老问题,但哎呀,最简单的解决方案是:

  1. 在记事本中打开 CSV
  2. 另存为 ->选择正确的编码
  3. 打开新文件

评论

1赞 Lyubomyr Shaydariv 4/29/2014
您使用哪个 Excel 版本?
1赞 Auberon Vacher 7/23/2014
太棒了,简单地工作并解决问题(至少对我来说是这样)
1赞 Veverke 5/13/2015
不,因为问题是让 Excel 将 .csv 文件作为 csv 文件打开。我的意思是,我有一个生成 csv 文件的过程。然后,用户只需要打开文件。在这里,他/她需要做的不止于此。
2赞 Mark Ransom 9/18/2015
@Veverke,如果您定期生成文件,这不是最佳解决方案。但如果是一次性的,这个答案是完美的。它之所以有效,是因为记事本会将 BOM 放在 UTF-8 或 UTF-16 文件的开头。
0赞 user2925795 3/29/2019
像魅力一样工作。((:
3赞 Wagner Bertolini Junior 10/13/2015 #13

只是为了帮助有兴趣在 Excel 上打开文件以实现此线程的用户,例如我。

我使用了下面的向导,它对我来说工作正常,导入了一个 UTF-8 文件。 不透明,但如果您已经拥有该文件,则很有用。

  1. 打开 Microsoft Excel 2007。
  2. 单击“数据”菜单栏选项。
  3. 单击“从文本”图标。
  4. 导航到要导入的文件的位置。单击文件名,然后单击“导入”按钮。文本导入向导 - 步骤 1 或 3 窗口现在将出现在屏幕上。
  5. 选择最能描述数据的文件类型 - 分隔或固定宽度。
  6. 从“文件源”旁边显示的下拉列表中选择“65001: Unicode (UTF-8)”。
  7. 单击“下一步”按钮以显示“文本导入向导 - 第 2 步或第 3 步”窗口。
  8. 在要导入到 Microsoft Excel 2007 的文件中使用的分隔符旁边打勾。“数据预览”窗口将根据您选择的分隔符显示数据的显示方式。
  9. 单击“下一步”按钮以显示文本导入向导 - 第 3 步(共 3 步)。
  10. 为要导入的每列数据选择适当的数据格式。如果需要,您还可以选择不导入一列或多列数据。
  11. 单击“完成”按钮以完成将数据导入 Microsoft Excel 2007 的过程。

来源: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0

0赞 Cloudranger 5/10/2016 #14

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

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

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

81赞 Elmue 11/25/2016 #15

令人难以置信的是,有这么多答案,但没有一个回答这个问题:

“当我问这个问题时,我问了一种打开 UTF-8 的方法 Excel 中的 CSV 文件对用户没有任何问题,...”

标记为具有 200+ 赞成票的已接受答案的答案对我来说毫无用处,因为我不想给我的用户提供如何配置 Excel 的手册。 除此之外:本手册将适用于一个 Excel 版本,但其他 Excel 版本具有不同的菜单和配置对话框。每个 Excel 版本都需要一本手册。

那么问题来了,如何让Excel通过简单的双击来显示UTF8数据呢?

好吧,至少在 Excel 2007 中,如果您使用 CSV 文件,这是不可能的,因为 UTF8 BOM 被忽略,您将只看到垃圾。这已经是 Lyubomyr Shaydariv 问题的一部分:

“我还尝试指定 UTF-8 BOM EF BB BF,但 Excel 忽略了这一点。”

我有同样的经历:将俄语或希腊语数据写入带有 BOM 的 UTF8 CSV 文件会导致 Excel 中的垃圾:

UTF8 CSV文件内容:

Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ

Excel 2007中的结果:

CSV UTF8 Excel

解决方案是根本不使用 CSV。这种格式由 Microsoft 愚蠢地实现,如果使用号或分号作为分隔符,它取决于控制面板中的区域设置。因此,相同的 CSV 文件可以在一台计算机上正确打开,但在另一台计算机上则无法打开。 “CSV”表示“逗号分隔值”,但例如,在德语 Windows 上,默认情况下,分号必须用作分隔符,而号不起作用。(这里应该命名为 SSV = 分号分隔值)CSV 文件不能在不同语言版本的 Windows 之间互换。这是 UTF-8 问题的另一个问题。

Excel 已经存在了几十年。遗憾的是,Microsoft 这些年来未能实现 CSV 导入这样的基本功能。


但是,如果您将相同的值放入 HTML 文件中,并将该文件另存为 UTF8 文件,文件扩展名为 XLS,则将获得正确的结果。

UTF8 XLS文件内容:

<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>

Excel 2007中的结果:

UTF8 HTML Excel

您甚至可以在 HTML 中使用 Excel 将正确显示的颜色。

<style>
.Head { background-color:gray; color:white; }
.Red  { color:red; }
</style>
<table border=1>
<tr><td class=Head>Colum1</td><td class=Head>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td class=Red>Авиабилет</td><td class=Red>Tλληνικ</td></tr>
</table>

Excel 2007中的结果:

UTF8 HTML Excel

在这种情况下,只有表格本身具有黑色边框和线条。如果您希望所有单元格都显示网格线,这在 HTML 中也是可能的:

<html xmlns:x="urn:schemas-microsoft-com:office:excel">
    <head>
        <meta http-equiv="content-type" content="text/plain; charset=UTF-8"/>
        <xml>
            <x:ExcelWorkbook>
                <x:ExcelWorksheets>
                    <x:ExcelWorksheet>
                        <x:Name>MySuperSheet</x:Name>
                        <x:WorksheetOptions>
                            <x:DisplayGridlines/>
                        </x:WorksheetOptions>
                    </x:ExcelWorksheet>
                </x:ExcelWorksheets>
            </x:ExcelWorkbook>
        </xml>
    </head>
    <body>
        <table>
            <tr><td>Colum1</td><td>Column2</td></tr>
            <tr><td>Val1</td><td>Val2</td></tr>
            <tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
        </table>
    </body>
</html>

此代码甚至允许指定工作表的名称(此处为“MySuperSheet”)

Excel 2007中的结果:

enter image description here

评论

4赞 Lyubomyr Shaydariv 11/25/2016
令人难以置信的是,人们仍然回答这个问题。:)然而,我认为CSV已经死了:CSV是一种致命的简单纯流格式,而且,当我在那个项目上时,我们也非常大量地使用它来进行组件交互。我永远不会使用 HTML 格式,因为它太具有代表性,而且我永远无法让该项目的用户将数据导出为 HTML 只是为了使其对 Excel 友好。Excel 在 UTF-8 CSV 上很糟糕,我不知道从那时起 5 年发生了什么变化。但是,我猜,逗号、分号和制表符分隔的文件是真正的疯狂。
9赞 Elmue 11/25/2016
人们仍然回答你的问题并不令人难以置信,因为谷歌把他们带到了这里:所有人都有同样的问题:我如何让愚蠢的Excel做我想做的事?在 Google 中输入 3 个单词:“excel csv utf8”,您的问题就是全球第一个结果。你写了一本畅销书!
17赞 StriplingWarrior 12/2/2016
由于您已经花时间指出此处的其他答案如何导致 Excel 正确打开 CSV 文件,因此值得一提的是,此答案也没有这样做。最初接受的答案(已被版主删除)建议将数据直接导出到 Excel 文件,或导出 HTML 文件并允许用户在 Excel 中打开该文件。这两种解决方案中的任何一种都不如保存具有 XLS 文件扩展名的 HTML 文件那么麻烦,但还没有提出真正回答该问题的答案。
6赞 Elmue 12/2/2016
@Warrior:“..但还没有提出真正回答这个问题的答案。这是不正确的。我已经回答了这个问题:至少在Excel 2007中,这是不可能的。这是明确的答案。如果 Excel 忽略 UTF8 BOM 并将数据解释为 ANSI,则无法通过简单的双击文件(即“对用户没有任何问题”)通过 CSV 将希腊语或俄语文本导入 Excel。我建议的是一个可行的解决方案,只需双击即可与所有 Excel 版本一起使用,并且不需要在 Excel 菜单中执行其他步骤。
10赞 Jeremy 5/17/2018
这不仅没有回答问题,而且说CSV是“遗留的”和“死的”是完全错误的。仅仅因为你没有看到它的用途,并不意味着它已经死了。此外,您显然不了解它的历史或今天使用的广泛程度。这比 XML 更好(由于数据包大小较小),这里的问题是 Microsoft 根本不遵循 UTF8 格式的标准。正确的答案是使用开放式办公室而不是Microsoft,因为Microsoft从一开始就不擅长编码。
3赞 TheCharlatan 12/1/2016 #16

是的,这是可能的。正如多个用户之前所指出的,当文件以 UTF-8 编码时,excel 读取正确的字节顺序标记似乎存在问题。使用 UTF-16 似乎没有问题,因此它是 UTF-8 的特有现象。我用于此的解决方案是添加 BOM 两次。为此,我执行以下 sed 命令两次:

sed -I '1s/^/\xef\xbb\xbf/' *.csv

,其中通配符可以替换为任何文件名。但是,这会导致 .csv 文件开头的 sep= 突变。然后,.csv 文件将在 excel 中正常打开,但在第一个单元格中增加了一行带有“sep=”的行。 “sep=”也可以在源.csv本身中删除,但是当使用VBA打开文件时,应指定分隔符:

Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)

格式 6 是 .csv 格式。将 Local 设置为 true,以防文件中有日期。如果 Local 未设置为 true,则日期将被美国化,在某些情况下,这将损坏 .csv 格式。

评论

1赞 BiAiB 2/25/2020
运行 sed 命令时,我得到:“sed: invalid option -- 'I'”,我认为它应该是 'i'
4赞 Christoph 4/9/2017 #17

一个真正惊人的答案列表,但由于仍然缺少一个相当不错的答案,我将在这里提及它:使用 google 表格打开 csv 文件并将其作为 excel 文件保存回本地计算机。

与Microsoft相比,Google已设法支持UTF-8 csv文件,因此它可以在那里打开文件。导出为 excel 格式也可以正常工作。因此,尽管这可能不是所有人的首选解决方案,但它是相当安全的,并且点击次数并不像听起来那么高,尤其是当您已经登录谷歌时。

3赞 CannedMoose 11/2/2017 #18

这并不能准确地解决问题,但由于我偶然发现了这一点,并且上述解决方案对我不起作用或有我无法满足的要求,因此当您有权访问 vim 时,这是添加 BOM 的另一种方法:

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv
1赞 Dan 11/6/2017 #19
  1. 下载并安装 LibreOffice Calc
  2. 在 LibreOffice Calc 中打开您选择的 csv 文件
  3. 谢天谢地,出现了一个导入文本向导......
  4. ...选择分隔符和字符编码选项
  5. 在 Calc 中选择结果数据并复制粘贴到 Excel
11赞 Nestor Urquiza 12/9/2017 #20

正如我在 http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html 上发布的那样:

告诉负责生成 CSV 的软件开发人员进行更正。作为一种快速解决方法,您可以使用 gsed 在字符串的开头插入 UTF-8 BOM:

gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv

此命令插入 UTF-4 BOM(如果不存在)。因此,它是一个幂等命令。现在,您应该能够双击该文件并在Excel中打开它。

评论

0赞 RandomGuy 2/9/2018
谢谢这修好了。我刚刚在Notepad ++中将csv';'转换为UTF-BOM,并且知道excels可以正确打开它。
0赞 EFC 7/26/2018
正是所需要的!这是如何在 PHP stackoverflow.com/questions/25686191/ 中实现这一点的指针......
0赞 cobp 5/6/2019
这是 excel 无法识别 csv 文件中的 utf 字符的解决方法。所以这个更正是为了解决excel问题。
0赞 NameOfTheRose 11/15/2019
这适用于带有逗号分隔符的 Excel 2007 希腊语版本。谢谢。
0赞 rahul shukla 12/19/2019
在 fs.createWriteStream(fileName,{encoding: 'UTF-16le'}) 中将编码更改为 'UTF-16le',并且 excel 正确打开了 CSV 文件
0赞 yoyo 8/15/2018 #21

我正在从一个简单的 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);
}

您的里程可能会有所不同 - 我使用的是 Office 365 中的 .NET 4 和 Excel。

2赞 praaveen V R 8/15/2018 #22

嗨,我正在使用 Ruby on Rails 生成 CSV。在我们的应用程序中,我们计划使用多语言(I18n),我们在Windows excel的CSV文件中查看I18n内容时遇到了一个问题。

Linux(Ubuntu)和Mac都很好。

我们发现 windows excel 需要再次导入数据才能查看实际数据。在导入时,我们将获得更多选项来选择字符集。

但这并不能为每个用户提供教育,因此我们寻找的解决方案是只需双击即可打开。

然后,我们确定了在 aghuddleston gist 的帮助下,在 Windows excel 中通过打开模式和 bom 显示数据的方式。在引用时添加。

示例 I18n 内容

在 Mac 和 Linux 中

瑞典语 : Förnamn 中文 : 名字

在 Windows 中

瑞典语 : Förnamn 中文 : 名字

def user_information_report(report_file_path, user_id)
    user = User.find(user_id)
    I18n.locale = user.current_lang
    open_mode = "w+:UTF-16LE:UTF-8"
    bom = "\xEF\xBB\xBF"
    body user, open_mode, bom
  end

def headers
    headers = [
        "ID", "SDN ID",
        I18n.t('sys_first_name'), I18n.t('sys_last_name'), I18n.t('sys_dob'),
        I18n.t('sys_gender'), I18n.t('sys_email'), I18n.t('sys_address'),
        I18n.t('sys_city'), I18n.t('sys_state'), I18n.t('sys_zip'),
        I18n.t('sys_phone_number')
    ]
  end

def body tenant, open_mode, bom
    File.open(report_file_path, open_mode) do |f|
      csv_file = CSV.generate(col_sep: "\t") do |csv|
        csv << headers
        tenant.patients.find_each(batch_size: 10) do |patient|
          csv <<  [
              patient.id, patient.patientid,
              patient.first_name, patient.last_name, "#{patient.dob}",
              "#{translate_gender(patient.gender)}", patient.email, "#{patient.address_1.to_s} #{patient.address_2.to_s}",
              "#{patient.city}", "#{patient.state}",  "#{patient.zip}",
              "#{patient.phone_number}"
          ]
        end
      end
      f.write bom
      f.write(csv_file)
    end
  end

这里需要注意的重要事项是开放模式和 BOM

open_mode = “w+:UTF-16LE:UTF-8”

bom = “\xEF\xBB\xBF”

在写入 CSV 之前,请插入 BOM

f.写入BOM

f.写入(csv_file)

Windows 和 Mac

双击可以直接打开文件。

Linux(ubuntu)

打开文件时,询问分隔符选项 - >选择“TAB”enter image description here

22赞 Christopher Pascual 9/20/2018 #23

您可以通过Notepad ++将.csv文件转换为带有BOM的UTF-8:

  1. Notepad++ 中打开文件。
  2. 转到菜单→。EncodingConvert to UTF-8-BOM
  3. 转到菜单→。FileSave
  4. 关闭 Notepad++。
  5. 在 Excel 中打开文件。

在 Windows 8.1 上的 Microsoft Office Professional Plus 2013 中使用 Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64 位,非 Unicode 程序的区域设置设置为“德语(德国)”。

评论

1赞 pakalbekim 12/21/2018
照你说的做了,根本没用。转换/编码,设置字符集,在我的情况下没有任何效果。将文件导入谷歌表格,下载为csv,完美无缺。2045年的欢迎
4赞 Igor Vuković 3/10/2020
我不得不用编码 -> Cinvert ti UTF-8-BOM Excel 版本 2016 转换它
1赞 Newbielp 4/20/2022
它运行良好,只有我必须使用 UTF-8 BOM 进行保存。最终,一种解决方法。
0赞 pakalbekim 12/21/2018 #24

我尝试了在这个线程上能找到的所有东西,但没有什么能完全发挥作用。但是,导入到谷歌表格并简单地下载为 csv 就像一个魅力。如果你来到我的挫败感点,那就试试吧。

1赞 lpinto.eu 7/25/2019 #25

几天前我遇到了同样的问题,找不到任何解决方案,因为我无法使用该功能,因为它使所有内容都设置为字符串样式。import from csv

我的解决方案是首先使用 notpad++ 和 . 然后只是在excel中打开文件,它按预期工作。change the encode to ASCII

6赞 vess 12/25/2019 #26

在 php 中,您只需将 $bom 添加到 $csv_string 之前:

$bom = sprintf( "%c%c%c", 239, 187, 191); // EF BB BF
file_put_contents( $file_name, $bom . $csv_string );

测试使用 MS Excel 2016, php 7.2.4

1赞 podolinek 4/23/2020 #27

Office 365 的工作解决方案

  • 保存在(无 LE、BE)UTF-16
  • 使用分隔符\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);

评论

0赞 Phil 11/28/2022
没有 LE 或 BE 是什么意思。一定是其中之一吧?
0赞 Herbert Van-Vliet 3/9/2022 #28

现在是 2022 年 3 月,似乎我们不能同时使用 BOM 和 sep=...线。 添加 sep=\t 或类似值,使 Excel 忽略 BOM。

使用分号似乎是 Excel 理解的默认设置,在这种情况下,我们可以跳过 sep=...行,它起作用了。

这是 Microsoft 365 与 Excel 版本 2110 内部版本 14527.20276。

1赞 Luca Ziegler 8/23/2022 #29

找到了 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 3/28/2023
工作像一个魅力,不错 🦾🦾🦾🦾🦾🦾🦾🦾🦾🦾
0赞 Oliver M Grech 11/3/2022 #30

只是共享一个全面的功能,可能会让您在处理 CSV 文件时更轻松......请注意与此主题相关的最后一个函数参数

function array2csv($data, $file = '', $download = true, $mode = 'w+', $delimiter = ',', $enclosure = '"', $escape_char = "\\", $addUnicodeBom = false)
{
    $return = false;

    if ($file == '') {
        $f = fopen('php://memory', 'r+');
    } else {
        $f = fopen($file, $mode);
    }

    if ($addUnicodeBom) {
        $utf8_with_bom = chr(239) . chr(187) . chr(191);
        fwrite($f, $utf8_with_bom);
    }


    foreach ($data as $line => $item) {

        fputcsv($f, $item, $delimiter, $enclosure, $escape_char);
    }

    rewind($f);

    if ($download == true) {
        $return = stream_get_contents($f);
    } else {
        $return = true;
    }

    return $return;
}
2赞 fantabolous 4/14/2023 #31

在 Python 中,使用 Python 对带有 BOM 的 UTF-8 的名称。只是不会被Excel或其他Microsoft软件所接受。 从 https://docs.python.org/3/library/codecs.htmlencoding=utf-8-sigutf-8

为了提高检测UTF-8编码的可靠性,Microsoft发明了UTF-8的变体(Python称之为“utf-8-sig”)

参见 utf-8 和 utf-8-sig 有什么区别?

使用标准的 python csv 库,这将是:

with open('some.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerows(someiterable)

它也适用于其他库,例如 pandas

df.to_csv('some.csv', encoding='utf-8-sig')
0赞 Thomas Ramé 10/3/2023 #32

我做了一个彻底的改变:我没有向我的用户提供.csv,而是提供.xlsx :)

由于我是以编程方式生成 CSV 文件,并且只有人类操作这些文件,因此没有理由继续使用简单格式 .csv(更适合解析)。注意:.xlsx 文件受到广泛支持(不仅在 Excel 中)。

我不必更改所有逻辑,我只是使用我以前的 CSV 生成脚本,并添加了一个 Excel 库,只需几行即可将 CSV 转换为 XLSX。无论使用何种语言:),您都应该能够这样做

理想情况下,我宁愿没有Microsoft的东西,但有时你只是坐在“标准”上。

1赞 Basj 11/28/2023 #33

15 年后,我终于找到了解决方案:在没有 的情况下编写 CSV,它将在 Excel 2007+ 上运行。UTF-16-LEBOM

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 打开,并且:

  • (1)口音没有问题
  • (2)分隔符会自动解析为多列

注意:如果使用 代替 ,(1) 仍然可以,但不能 (2)。encoding="utf-16"utf-16-le

评论

0赞 Chris 12/2/2023
感谢您发布此内容。事实证明,在写这个答案时很有帮助。
0赞 Basj 12/4/2023
谢谢@Chris。你确认你有同样的行为吗?即 解决所有问题?UTF-16-LE without BOM
0赞 Chris 12/4/2023
对于 Python 的内置模块,是的,无论使用或编码(都没有 BOM),行为都是相同的。csvutf-16utf-16-le
0赞 Basj 12/4/2023
@Chris内置Python,据我所知,一切正常,包括等(你用utf8的Python模块有问题吗?我的帖子特别提到了有问题的 Excel。你也确认了吗?csvutf8csvutf8
1赞 Chris 12/4/2023
这就是我所指的(Excel)。当使用时,当尝试在Excel中打开生成的CSV文件时,似乎需要BOM。请查看上面链接的答案了解更多详情。Pandas.DataFrame.to_csv()
0赞 ofri cofri 12/6/2023 #34

对于那些有能力手动转换一些文件的人,这里有一些答案,提到了如何使用 Notepad++ 转换它们,但我想使用 VS Code (Visual Studio Code / VSCode) 添加解决方案:

  • 在 VS Code 中打开 CSV 文件
  • 在底部栏中,单击编码(在我的情况下,是右起第 4 个:“UTF-8”、“LF”、“纯文本”、通知铃)。如果将鼠标悬停在它上面,它将显示“选择编码”。如果找不到,另一种方法是单击VS Code“帮助”菜单(顶部栏)->“显示所有命令”->键入“更改文件编码”
  • 它将在顶部栏中打开一个操作列表。点击“使用编码保存”
  • 它将打开一个可能的编码列表。单击您想要的那个,您就可以开始了,在 Excel 中打开它并在那里显示正确的字符。就我而言,我选择了“UTF-8 with BOM”,它在 Excel 365 中工作(“Excel for Microsoft 365 MSO(版本 2311)”)