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

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

有没有解决办法?

PS哪些工具可能像Excel一样行为呢?


UPDATE

我不得不说,我已经把这个问题的提出混淆了社区。 当我提出这个问题的时候,我问了一个在Excel中打开一个UTF-8 CSV文件的方式,对用户来说没有任何问题,stream畅而透明。 但是,我用一个错误的expression方式自动地做这件事。 这是非常混乱,它与VBAmacros自动化冲突。 对于这个我最欣赏的问题有两个答案:Alex的第一个答案https://stackoverflow.com/a/6002338/166589 ,我已经接受了这个答案; 第二个是Mark https://stackoverflow.com/a/6488070/166589 ,稍后才出现。 从可用性的angular度来看,Excel似乎没有一个好的用户友好的UTF-8 CSV支持,所以我认为这两个答案都是正确的,我已经接受了亚历克斯的答案,因为它确实表明,Excel无法做到透明。 这是我在这里自动混淆了。 Mark的回答为更高级的用户提供了一个更复杂的方式来达到预期的结果。 两个答案都很好,但是Alex的一个答案更适合我的不明确的问题。


更新2

在最后一次编辑五个月后,我注意到Alex的答案因为某种原因已经消失了。 我真的希望这不是一个技术问题,我希望现在没有更多的讨论,哪个更好。 所以我接受马克的答案是最好的答案。

亚历克斯是正确的,但是因为您必须导出到csv,您可以在打开csv文件时给用户这个build议:

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

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

UTF-8字节顺序标记将会告诉Excel 2007+你正在使用UTF-8的事实。 (看到这个SOpost )。

如果有人遇到同样的问题,.NET的UTF8编码类即使在明确告诉构造函数时也不会输出字节顺序标记。 如果要真正使用字节顺序标记进行保存,则必须使用此解决方法 。

对于Excel 2013来说,被忽略的BOM错误似乎已经修复。我对西里尔字母也有同样的问题,但添加BOM字符\uFEFF的确有帮助。

我们已经使用了这个解决方法:

  1. 将CSV转换为UTF-16
  2. 在文件的开头插入BOM
  3. 使用标签作为字段分隔符

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

因此,在内容的开头添加一个BOM( "\xEF\xBB\xBF" ),并通过fputcsv($fh, $data_array, ";");将分号设置为分隔符fputcsv($fh, $data_array, ";"); 做的伎俩。

有这么多的答案是不可思议的,但没有人回答这个问题:

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

答案被标记为接受的答案与200 +票对我来说是无用的,因为我不想给我的用户手册如何configurationExcel。 除此之外:本手册将适用于一个Excel版本,但其他Excel版本具有不同的菜单和configuration对话框。 您需要每个Excel版本的手册。

所以问题是如何使Excel显示UTF8数据只需双击一下?

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

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

我做了相同的经验:写入俄罗斯或希腊的数据到一个UTF8 CSV文件与BOM结果在垃圾在Excel中:

UTF8 CSV文件的内容:

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

结果在Excel 2007中:

CSV UTF8 Excel

一个解决scheme是根本不使用CSV。 这个传统的格式完全被弃用 ,事实上,这取决于控制面板中的区域设置,如果逗号分号用作分隔符,这是Excel中最愚蠢的错误devise。 因此,同一个CSV文件可能在一台计算机上正确打开,但在另一台计算机上却不能。 “CSV”的意思是“ 逗号分隔值”,但例如在德语Windows默认情况下,分号必须用作分隔符,而逗号不起作用。 这与文件格式的名称相矛盾。

Excel数十年来一直存在。 微软在这些年来无法实现像CSV导入这样的基本function,真是遗憾。

如果将相同的值放入HTML文件中,并将该文件另存为带有文件扩展名为XLS的 BOM的UTF8文件,则会得到正确的结果。

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

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

我没有find任何方法让Excel自动识别UTF-8,我不愿意/能够对文件的复杂指令的使用者施加如何打开它们。 所以我把它们编码为UTF-16le(带有BOM)而不是UTF-8。 大小两倍,但Excel可以识别编码。 他们压缩得很好,所以很less(但可悲的是,永远不会)重要的大小。

老问题,但是,最简单的解决scheme是:

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

这是一个古老的问题,但出现在search顶部。 经过大量的努力,我发现在csv文件的开头添加BOM字符有所帮助。

我已经在这里介绍了: https : //sites.google.com/site/ritechtips/home/the-multi-line-fields-csv-file-and-excel-import—ha

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

 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 

起源:= 65001是UTF-8。 逗号:真正用于在colums中分发的.csv文件

将其保存在Personal.xlsb中以使其始终可用。 个性化Excel工具栏添加一个macros调用button,并从那里打开文件。 你可以添加更多的格式化macros,如列自动调整,alignment等。

只是为了帮助用户打开Excel上的文件,实现像我这样的线程。

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

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

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

一个真正令人惊讶的答案列表,但由于一个相当不错的一个仍然失踪,我会在这里提到:打开谷歌床单的csv文件,并将其保存到本地计算机作为Excel文件。

与微软相比,谷歌已经设法支持UTF-8 CSV文件,所以它只是在那里打开文件。 而出口到Excel格式也正常工作。 所以,尽pipe这可能不是所有人的首选解决scheme,但它是非常安全的,点击次数并不像听起来那么高,特别是当你已经login到谷歌。

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

在将CSV文本数据写入文件时出现同样的问题,然后在Excel中打开生成的.csv会将所有文本都转换为单个列。 读了上面的答案之后,我尝试了以下内容,这似乎将问题排除在外。

在创buildStreamWriter时应用UTF-8的编码。 而已。

例:

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

这是我的工作解决scheme:

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

关键是起源:= 65001

对的,这是可能的。 在编写创buildcsv的stream时,首先要做的是:

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

如果你想完全自动化,单击一下,或者从一个网页自动加载到Excel中,但是不能生成正确的Excel文件,那么我会build议以SYLK格式作为替代。 好吧,它不是简单的CSV,但它是基于文本,很容易实现,它支持UTF-8没有问题。

我写了一个接收数据的PHP类,并输出一个SYLK文件,只需点击该文件即可直接在Excel中打开(或者如果将文件写入到具有正确MIMEtypes的网页中,将自动启动Excel。添加格式(如粗体,特定格式的数字等),更改列大小或自动大小的列到列中的文本,所有代码中的所有代码可能不超过大约100行。

通过创build一个简单的电子表格并保存为SYLK,然后使用文本编辑器读取,可以很容易地对SYLK进行反向工程。 第一个模块是头文件和标准的数字格式,你会认识到(你只是在你创build的每个文件中回stream),那么数据只是一个X / Y坐标和一个值。

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

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

,通配符可以用任何文件名replace。 但是,这会导致.csv文件开头处的sep =突变。 .csv文件将在Excel中正常打开,但在第一个单元格中带有“sep =”的额外行。 源文件.csv中也可以删除“sep =”,但是用VBA打开文件时应该指定分隔符:

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

格式6是.csv格式。 将本地设置为true,以防文件中有date。 如果“本地”未设置为“真”,则date将被美式化,在某些情况下会损坏.csv格式。

这不是准确地解决这个问题,但由于我偶然发现这一点,上述解决scheme没有为我工作或有我无法满足的要求,这是另一种方式来添加BOM时,您有权访问vim:

 vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv 
  1. 下载并安装LibreOffice Calc
  2. 在LibreOffice Calc中打开您select的csv文件
  3. 谢天谢地,一个导入文本向导出现了…
  4. …select您的分隔符和字符编码选项
  5. 在Calc中select结果数据并将其粘贴到Excel中

首先将Excel电子表格保存为Unicode文本。 使用Internet Explorer打开TXT文件并点击“另存为”TXT编码 – select合适的编码,例如Win Cyrillic 1251