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


453

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

有什么解决方法吗?

PS哪些工具的行为可能类似于Excel?


更新

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


更新2

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


1
可以使用制表符分隔的文件吗?如果是这样,您可能会有更多的运气。
蒂姆·佩里

8
Office 2010+:最佳作品:具有BOM表并\t作为分隔符的UTF-16LE 。适用于英语和非英语Excel设置。可以按Ctrl-S而无需选择文件格式,等等。将保留Unicode字符。
塞巴斯蒂安

@Duncan坦白地说,我很困惑,很难“判断”。我已经在2年前接受了alex的回答(5月14日分别是Q和A),然后Mark回答了一个棘手的解决方法(我实际上没有检查过),令人惊讶地在我的问题上获得了更高的分数,结果令人惊讶地成为也很受欢迎 实际上,很久以前,我们实际上拒绝了我项目中的Excel支持,并且我不想拿走alex的声誉得分,因为Excel似乎并且可能仍然(如果我错了,请纠正我)对CSV的处理不当。很难说,对不起。
Lyubomyr Shaydariv

2
亚历克斯的答案已被主持人删除。没有给出任何解释,但是如果您有足够的声誉,您仍然可以看到它。
Mark Ransom 2015年

1
由于时间机器还不存在,只需要不同意。
osexpert

Answers:


398

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

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

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


163

UTF-8字节顺序标记将提示Excel 2007+您正在使用UTF-8。(请参阅此SO帖子)。

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


18
插入UTF-8 BOM似乎是可行的方法。之后,它是透明的。
vy32 2014年

12
我用记事本+ +可以轻松地从转换的.csv UTF-8UTF-8 with BOM
塞巴斯蒂安

3
是的-最佳解决方案。有关在http响应中设置标题的许多令人困惑的帖子。这样就解决了问题。在记事本中打开文件并使用UTF-8选项右击保存时,可以看到相同的结果。还添加字节顺序标记。
user369142

1
@Elmue:我想也许(像我一样)他以为他用字节顺序标记保存了它,但这不是因为某些库不能像他想象的那样工作。我发现值得添加此答案,而且显然其他人也发现它很有用。无论如何,这似乎比说不使用CSV或指示用户如何以某种怪异的方式打开文件更好。
StriplingWarrior

1
Mac版本的Excel似乎仍然忽略BOM。(Excel for Mac2011。)
Thomas Andrews'Mar

74

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


8
由于我在CSV文件(以Java生成)的开头添加了\ uFEFF,因此Excel能够正确打开它们!Thx
Galdo 2013年

16
这解决了我的问题太多,在PHP它看起来像这样: $utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText;
阿卜杜拉

@updola非常感谢您的评论,为我节省了时间
森·

根据定义,UTF-8不使用也不应该使用BOM字符。Excel读取BOM表的方式巩固了UTF-8优于Unicode的优势,而Unicode向后兼容。添加BOM可使Excel工作,但会破坏其他正确的UTF-8 / ASCII文件读取。
尼尔森2015年

1
\ FE \ FF使Mac OS Excel 2016的整个文件成为日文象形文字。
Nakilon

55

令人难以置信的是,答案如此之多,却没有一个答案:

“当我问这个问题时,我想提供一种在Excel中打开UTF-8 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文件,然后将该文件另存为带有BOM扩展名XLS的 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

在这种情况下,只有表格本身具有黑色边框和线条。如果您希望所有单元格都显示网格线,则在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中的结果:

在此处输入图片说明


1
人们仍然回答它也令人难以置信。:)但是,我认为CSV已死:CSV是一种致命的简单纯流格式,并且当我在该项目中时,我们也确实将其大量用于组件交互。我永远不会使用HTML格式,因为它的代表性太强了,我永远也无法让该项目的用户将数据导出到HTML只是为了使其对Excel友好。Excel吸收了UTF-8 CSV,从那以后的5年中,我不知道发生了什么变化。但是我猜,逗号,分号和制表符分隔的文件确实是疯狂的事情。
Lyubomyr Shaydariv

5
人们仍然回答您的问题并不令人难以置信,因为Google将他们带到了这里:所有人都有相同的问题:我如何让愚蠢的Excel来做我想做的事情?在Google中输入3个字:“ excel csv utf8”,您的问题是全世界第一个结果。您写了畅销书!
Elmue '16

8
由于您已花时间指出此处的其他答案都没有导致Excel正确打开CSV文件的原因,因此值得一提的是,此答​​案也没有做到这一点。最初接受的答案(由主持人删除)建议直接将数据导出到Excel文件,或导出HTML文件并允许用户在Excel中打开文件。与保存带有XLS文件扩展名的HTML文件相比,这些解决方案中的任何一种都没有那么强大,但是没有提出任何答案可以真正回答问题。
StriplingWarrior

3
@Warrior:“ ..但是没有提出任何答案,实际上没有回答这个问题。” 这是不正确的。我已经回答了这个问题:至少在Excel 2007中是不可能的。这是肯定的答案。如果Excel忽略UTF8 BOM并将数据解释为ANSI,则无法通过双击文件(例如,问题:“用户没有任何问题”)通过CSV将例如希腊或俄语文本导入到Excel中。 )。我所建议的是一种可以双击运行所有Excel版本的工作解决方案,并且不需要Excel菜单中的其他步骤。
Elmue '16

2
这不仅不能回答问题,而且将CSV声明为“旧版”和“失效”是完全错误的。仅仅因为您没有看到它的用途,并不意味着它已经死了。另外,您显然不了解它的历史或今天的用途。这比XML更好(由于较小的数据包大小),这里的问题是Microsoft如何根本不遵循UTF8格式的标准。正确的答案是使用开放办公室而不是Microsoft,因为Microsoft从来没有擅长编码。
杰里米

48

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

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

1
谢谢!我尝试了该线程中的所有其他答案,但是转换为UTF-8根本不起作用。当我尝试使用BOM的UTF-16时,它立即起作用。
赫斯基

对于Mac 2011的Excel,我成功使用了UTF-16小字节序csv文件
多重动态

谢谢,此解决方案非常适合为我的用户提供可以在Excel中打开的Unicode csv。
2016年

21

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

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


13

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

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


这是一个古老的问题,但我很高兴人们仍然可以回答。谢谢。:)
Lyubomyr Shaydariv

1
@LyubomyrShaydariv:因为我回答了这个问题,所以一位同事告诉我,最新的Excel可以识别UTF-8 CSV文件,只要它们具有初始BOM。因此,几年后,当世界上每个人(或无论如何,我们将文件传送到的每个人)都在该版本或更高版本的Excel上时,我也许都可以更改自己的编码:-)
Steve Jessop 2013年

奇怪,对我来说,它不起作用。将这些字符转换成中文符号...(应该是
希伯来语

当我将“ UTF-16 BE with BOM”保存时,我在Excel中有汉字。当我尝试“带BOM的UTF-16 LE”时,它起作用了!我使用Sublime Text进行测试。
Henno '16

12

老问题但棘手的,最简单的解决方案是:

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

1
您使用哪个Excel版本?
Lyubomyr Shaydariv 2014年

1
出色,干脆就能解决问题(至少对我而言)
Auberon Vacher 2014年

1
否,因为问题是让Excel将.csv文件作为csv文件打开。我的意思是,我有一个生成csv文件的过程。然后,仅需要用户打开文件。在这里,他/她必须做更多的事情。
Veverke

2
@Veverke,如果您定期生成文件,则不是最佳解决方案。但是,如果是一次性的,这个答案是完美的。之所以起作用,是因为记事本会将BOM表放在UTF-8或UTF-16文件的开头。
Mark Ransom 2015年

奇迹般有效。((::
user2925795,19年

10

正如我在http://thinkinginsoftware.blogspot.com/2017/12/post-ly-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中打开它。


谢谢修复。我刚刚转换了csv';' 在Notepad ++中与UTF-BOM分开,并且知道擅长将其正确打开。
RandomGuy

确实需要什么!这里是一个指向如何实现这个在PHP stackoverflow.com/questions/25686191/...
EFC

这是无法识别csv文件中utf字符的excel的解决方法。因此,此更正旨在解决excel问题。
COBP

这适用于带有逗号分隔符的Excel 2007希腊文版本。谢谢。
NameOfTheRose

在fs.createWriteStream(fileName,{encoding:'UTF-16le'})中将编码更改为'UTF-16le',并且excel正确打开了CSV文件
rahul shukla

9

您可以通过记事本++使用BOM将.csv文件转换为UTF-8:

  1. Notepad ++中打开文件。
  2. 进入菜单EncodingConvert to UTF-8
  3. 进入菜单FileSave
  4. 关闭记事本++。
  5. 在Excel中打开文件。

在Windows 8.1上的Microsoft Office 2013 Plus的Microsoft Excel 2013(15.0.5093.1000)MSO(15.0.5101.1000)中工作,并且将非Unicode程序的区域设置设置为“德语(德国)”。


1
做了你说的话,根本没有用。转换/编码,设置字符集,在我的情况下无济于事。将文件导入到Google表格中,然后以csv格式下载,工作正常。从2045
开始的

1
我必须使用编码-> Cinvert ti UTF-8-BOM Excel版本2016
IgorVuković

4

简单的vba宏,用于打开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。逗号:True for .csv文件分布在列中

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


2
谢谢。不幸的是,这是对真正的Excel高级用户的建议,而我的目标是,提出这个问题,就是要使Excel本身自动完成。
Lyubomyr Shaydariv

我尝试使用此代码段,但它对我不起作用。我使用Excel 2013年
Sharunas Bielskis

3

只是为了帮助有兴趣像我一样在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


3

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

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

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

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

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


1
运行sed命令时,我得到:“ sed:无效选项
-'I

2

这是我的工作解决方案:

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

关键是Origin:= 65001


2

是的,有可能。在编写创建csv的流时,要做的第一件事是:

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

您没有阅读问题!Lyubomyr Shaydariv写道:“我也尝试指定UTF-8 BOM EF BB BF,但Excel忽略了这一点。”
Elmue

这是工作代码。如果以此线索从.Net应用程序中写出UTF-8文件,则Excel会将其识别为UTF8。
zax

可能在您的Excel中有效。但是至少在Excel 2007中,物料清单被完全忽略了。因此,如果您打算编写适用于所有Excel版本的代码,则该代码将无用。
Elmue '16

2

确实是一个惊人的答案列表,但是由于仍然缺少一个不错的答案,我在这里将其提及:用Google表格打开csv文件,并将其另存为excel文件。

与Microsoft相比,Google设法支持UTF-8 csv文件,因此它只能在其中打开文件。并且导出为ex​​cel格式也可以。因此,即使这可能不是所有解决方案的首选解决方案,但它还是非常可靠的故障保护,并且点击次数并不像听起来那样高,特别是当您已经登录google时。


2

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

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv

2

嗨,我正在使用ruby在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。写宝

f.write(csv_file)

Windows和Mac

双击可以直接打开文件。

Linux(ubuntu)

打开文件时,请询问分隔符选项->选择“ TAB” 在此处输入图片说明


1

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

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


1

在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


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不会存在兼容性问题吗?
Rex

该代码是错误的,因为如果您具有using()语句,则不需要output.Close()。除此之外,Excel CSV导入非常原始。我根本不会使用它。如果要在Excel中导入,请改用HTML表,然后在Excel中打开它。
Elmue

感谢您澄清@Elmue-不幸的是,我遇到了许多情况(包括跨网络驱动器的文件),在这些情况下明确需要关闭处理。找不到原因,正如我想我记得Close()Dispose堆栈中看到对的调用,但是我们就可以了。您在有关CSV导入是原始的声明中也不正确,因为它不需要您建议的低效HTML方法。事实上创建额外的编程步骤,采取纯文本数据,转换成HTML ,然后拉成Excel中似乎和直觉
雷克斯

继续......然而,不同的情况有不同的要求和我的例子正确显示了如何指定为OP请求的编码
雷克斯

请再次阅读原始问题:“我也尝试指定UTF-8 BOM EF BB BF,但Excel忽略了这一点。” 我进行了相同的测试,并得出相同的结果:Excel无法识别UTf8 BOM。尝试一下!编写CSV文件,然后将希腊字母或俄语字符放入其中。然后在Excel中打开它,您将得到垃圾。因此,您的答案无法解决任何问题。
Elmue '16

0

如果要使其完全自动化,单击一下或从网页上自动加载到Excel中,但是无法生成正确的Excel文件,那么建议您选择SYLK格式。好的,它不像CSV那样简单,但它是基于文本的,非常易于实现,并且支持UTF-8,没有任何问题。

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

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


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

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);
}

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


0

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);

-1

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


-1

我尝试了在该线程上可以找到的所有内容,但类似的操作却没有完全起作用。但是,导入到Google表格中并简单地以csv格式下载就像一个魅力。如果您遇到我的挫败感,请尝试一下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.