我正在开发一个应用程序的一部分,负责将一些数据导出到csv文件中。应用程序总是使用UTF-8,因为它在所有级别都具有多语言特性。但是在Excel中打开这样的csv文件(包括音调符号、西里尔字母、希腊字母)并不能达到预期的结果,显示类似于Г?/Г¤, Г–/Г?。我不知道如何强制Excel理解打开的csv文件是用utf-8编码的。我还尝试指定utf-8 bom EF BB BF,但excel忽略了这一点。
有什么解决办法吗?
P.S.哪些工具可能表现得像Excel?
更新
我不得不说,我把社区与问题的形成混淆了。当我问这个问题的时候,我问了一个在Excel中打开utf-8csv文件的方法,对于用户来说没有任何问题,以一种流畅和透明的方式。但是,我使用了一个错误的公式,要求自动执行。这是非常混乱的,它与VBA宏自动化冲突。我最欣赏的问题有两个答案:第一个答案是亚历克斯https://stackoverflow.com/a/6002338/166589,我接受了这个答案;第二个答案是mark https://stackoverflow.com/a/6488070/166589,稍晚出现。从可用性的角度来看,Excel似乎缺乏良好的用户友好的utf-8csv支持,所以我认为这两个答案都是正确的,我首先接受了Alex的答案,因为它确实表明Excel不能透明地做到这一点。这就是我在这里自动混淆的地方。马克的回答为更高级的用户提供了一种更为复杂的方法来达到预期的结果。两个答案都很好,但亚历克斯的答案更适合我不清楚的问题。
更新2
五个月后,在最后一次编辑之后,我注意到亚历克斯的回答出于某种原因消失了。我真的希望这不是一个技术问题,我希望现在不再讨论哪个答案更重要。所以我接受马克的回答作为最好的答案。
- 可以使用制表符分隔的文件吗?如果是这样,你可能会有更多的运气。
- Office2010+:最佳作品:以bom和\t作为分隔符的utf-16le。将使用英语和非英语Excel设置。可以按Ctrl-S而不选择文件格式等,将保留unicode字符。
- @邓肯坦率地说,我很困惑,很难"判断"。两年多前我接受了亚历克斯的回答(5月14日Q和A都接受了),然后马克提出了一个棘手的解决方法(实际上我没有检查它),令人惊讶的是,在我的问题上获得了更多的分数,令人惊讶的是,这个方法也变得流行起来。我们很久以前就拒绝了Excel在我的项目中的支持,我不想剥夺亚历克斯的声誉分数,因为Excel似乎,而且可能仍然(如果我错了,请纠正我)错误地处理csv。很难说,对不起。
- 亚历克斯的回答被版主删除了。没有给出任何解释,但如果你有足够的声誉,你仍然可以看到它。
- Excel2010对我来说和utf8-bom很好用,所以不理解它对你不起作用。我用";"作为分隔符。双击此类型的csv文件将正确打开。
- @Osexpert和你投了反对票,仅仅是因为你的Excel2010经验与我6年前的经验不同?很好。我声称在那一刻,它并没有以一种直接的方式为Excel工作。
- 既然时间机器还不存在,那就只好不同意了。
- @暴露所有回答问题的人都有相同的问题,并提出了解决办法。还是不同意?
- 除了我的评论之外,还有一些评论说它与utf8 bom一起工作,即使是从Excel2007。我自己测试了Excel2007,它工作正常。所以,"我还尝试指定utf-8bomefbbbf,但Excel忽略了这一点。"不是这样的。
- @OSexpert必须使用数据导入或其他任何方法,但绝对不是我在原始问题中所问的常规打开函数,这样它可能对您有用。再说一次,如果你对原始问题的主张是真的,我绝不会发表这样的问题,或者在6年内,其他人至少会通知我一次,很可能是在第一天。有些人说这行得通,有些人说不行。我说不行。请仔细阅读这个问题,并考虑到你可能遗漏的其他因素。谢谢。
- 是的,常规的"通过(双击)打开"使用utf8 BOM。使用Excel2007和2010测试。请别管我。
- 我访问了这个页面constitution.kremlin.ru,它是一个utf-8页面,标签""。我将页面保存为.txt文件,然后用Excel2010打开它。文本导入向导被自动调用,它显示文件来源为"65001:Unicode(UTF-8)"。我只需单击"完成",Excel就会以俄语显示我看不懂的页面。当人们打开一个utf-8文件时,是否会自动调用文本导入向导?
- @我真的不记得了,甚至不记得我测试这个问题的确切版本。也许从那以后你有一些Excel更新?
- 我使用Excel 2011 Mac版本。它不能用BOM处理UTF-8。
Alex是正确的,但是由于您必须导出到csv,因此在打开csv文件时,您可以向用户提供以下建议:
将导出的文件保存为csv
打开Excel
使用数据导入数据——>导入外部数据——>导入数据
选择"csv"文件类型并浏览到您的文件
在导入向导中,将文件u origin更改为"65001 utf"(或选择正确的语言字符标识符)
将分隔符改为逗号
选择导入到何处并完成
这样特殊字符就可以正确显示。
- 谢谢你的回答,马克。这也让我觉得没人比它更聪明了。我想您同意,在大多数情况下,BOM不会影响CSV导入,或者导入模块甚至可以识别这些标记。但不幸的是,没人在乎。
- 谢谢!这就是要走的路=)
- 然后您可以将导入的csv文件保存为一个xlsx,Excel似乎维护了对一些更不寻常字符的支持。顺便说一句,我用的是Excel2007。
- 对于我来说,不适用于多行字段,必须先使用notepad++和"encode->encode in utf-8",然后保存并运行。
- 这是如何在Excel中打开一个utf8 csv。但我认为这个问题认为让excel自动打开utf8文件,而不必被告知?
- @马克,我们怎样才能让它正常"双击"工作呢?您不能期望用户执行任何导入操作
- 虽然答案确实有帮助,但2015年仍然是这样。不喜欢手动这样做。应该有一种自动化的方法。
- 哦,谢谢!这有很大帮助
- 这很管用…在我尝试重新保存csv文件之前,现在所有的特殊字符都被弄乱了。我知道这不是问题的一部分,但是否有人成功地保存了这些文件????似乎还有另一个简单的操作,万能的Excel甚至不能做到一半正确:""(
- 我将使用Microsoft Access创建文本导入规范,您可以在其中设置字符集、分隔符、排除列等。这将保存到每次读取csv文件时应用的规范中。然后引用链接的访问表而不是csv。
- 它不起作用。Excel将其作为文本文件打开。它没有认出双引号。
UTF-8字节顺序标记将提示Excel2007+使用UTF-8。(见本帖)。
如果有人有与我以前相同的问题,.NET的utf8编码类不会在GetBytes()调用中输出字节顺序标记。您需要使用流(或使用变通方法)来获取要输出的BOM。
- 谢谢你的帖子链接(我不知道UTF-16的情况)。
- 插入一个UTF-8BOM似乎是可行的方法。之后它是透明的。
- 非常感谢。这比猜测Excel编码的喜好要好得多。
- 我使用notepad++很容易地将.csv从UTF-8转换为UTF-8 with BOM。
- 是-最佳解决方案。关于在HTTP响应中设置头的许多令人困惑的文章。这就解决了问题。在记事本中打开文件并使用utf-8选项将其右下保存时,也可以看到这一点。同时添加字节顺序标记。
- post引用的解决方案:private byte[]addencodingpreamble(byte[]bytearray,encoding encoding)返回encoding.getpreamble().concat(bytearray).toarray();
- 你没有读过这个问题!Lyubomyr-Shaydariv写道:"我还试图指定utf-8bomefbbbf,但Excel忽略了这一点。"
- @Elmue:我想也许(像我一样)他以为他用字节顺序标记保存了它,但不是因为某些库没有按他认为的方式工作。我发现增加这个答案是值得的,而且很明显,其他一些人也发现它很有用。无论如何,这似乎比不使用csv,或者指导用户如何以某种奇怪的方式打开文件更好。
- 不,这对他不起作用的原因不是他无法将一个简单的3字节保存到一个文件中。它不起作用的原因是至少Excel2007完全忽略了BOM。
- @Elmue:我相信Excel2007 SP3解决了这个问题。
- 您如何知道您的用户已经安装了这个SP?我更喜欢编写在所有计算机上都能工作的代码。你还讨厌这些愚蠢的网页,在底部写着:"这个网页是为火狐优化的"。如果程序员不能编写在所有浏览器上运行的代码,那就太可惜了。如果一个程序员告诉他的用户,他们必须下载并安装一个巨大的更新来使用他们的软件,这是一个耻辱。如果你的用户没有管理权限呢?我又吃了一次:你的答案不是解决问题的办法!
- @埃尔梅:我承认这是一个不完美的解决方案。如果有任何方法可以自动使这项工作的旧版本的Excel,我宁愿他们。但是,意识到这个问题没有解决办法,到目前为止,至少有69个人发现这个答案是有帮助的,我将把它留在这里。感谢您的观察。
- 我使用普通的旧记事本很容易地用BOM将.csv从utf-8转换为utf-8。打开并保存。
- Mac版的Excel似乎仍然忽略了BOM。(Mac 2011的Excel)
- .NET确实会输出一个BOM,如果您正确地使用流,请参见:stackoverflow.com/questions/5266069/…
- @马泽:谢谢你指出这一点。我发布的链接上还有另一个使用流的答案。我想教训是,GetBytes()从来没有打算单独用于生成整个文件的内容:我们应该使用流,让它们调用GetPreamble()和GetBytes()等。
- @剥线战士非常真实,一个bom只属于流的开始。我喜欢另一个答案(除了它基本上只是另一种写作方式:string.ToBytes(encoding)而不是encoding.ToBytes(string)),就是你可以通过new UTF8Encoding(true)或new UTF8Encoding(false)来控制BOM的输出。
忽略了bom的bug似乎已在Excel2013中修复。我对西里尔字母也有同样的问题,但是添加bom字符\uFEFF确实有帮助。
- 由于我在我的CSV文件(在Java中生成)的开头添加了UFFEF,所以Excel能够正确地打开它们!谢谢
- 这也解决了我的问题,在PHP中,它看起来是这样的:$utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText;
- @厄普多拉非常感谢你的评论,为我节省了几个小时。
- 它在Windows Microsoft Excel 2010中对我有效
- 根据定义,UTF-8既不使用也不应使用BOM字符。Excel读取BOM的方式使UTF-8比Unicode更具优势,后者与ASCII向后兼容。添加BOM将使Excel工作,但会破坏其他合适的utf-8/ascii文件读取。
- @Nelson不需要BOM,但确实如此。微软价值观向后兼容性和Windows程序总是假设一个文件将与一个MBCS字符集编码。改变这个假设会破坏太多的遗留系统。如果您可以指定utf-8作为MBCS编码,那就太好了,但是它们从来没有使它一致工作过。
- @但这根本不是UTF-8规范。根据定义,UTF-8应该在二进制级别与标准ASCII兼容,这意味着没有超过127的字符。下面的所有内容都被认为是直截了当的"标准",没有特殊的字符。如果没有BOM,微软应该做的是默认的UTF-8,而不是默认的MS-Craptastic编码。
- @Nelson不,微软"应该"做的是确保过去的事情继续工作。他们就是这么做的。我知道规格说明说这是不必要的,在一个完美的世界里,这是不必要的。但这不是我们生活的世界。
- @Markransom Microsoft在保持工作状态方面做得非常糟糕。看看这个关于处理bom:wiki.scn.sap.com/wiki/display/abap/…中excel不一致的完整报告。
- @Nelson维基百科似乎认为UTF-8确实有一个bom The UTF-8 representation of the BOM is the byte sequence 0xEF,0xBB,0xBF.,无论如何,csv是一种不精确的格式。此外,您提供的链接显示了对非美国文化的有限知识-;是几种欧洲语言的列表分隔符,因为,是十进制分隔符,不能用作列表分隔符。如果你想要逼真,你应该使用XLSX格式——它只是一个压缩的XML,有一个定义很好的模式。
- 这应该是新的公认答案。像做梦一样工作!
- fe ff使mac os excel 2016成为日语象形文字的整个文件。
- 对我来说也一样。物料清单字符必须在文件的开头。
令人难以置信的是,有这么多答案,但没有一个能回答这个问题:
0
标记为200+以上投票的已接受答案对我来说是无用的,因为我不想给我的用户一个如何配置Excel的手册。除此之外:本手册适用于一个Excel版本,但其他Excel版本有不同的菜单和配置对话框。每个Excel版本都需要一本手册。
所以问题是如何让Excel通过简单的双击来显示utf8数据?
好吧,至少在Excel2007中,如果您使用csv文件,这是不可能的,因为utf8 BOM被忽略,您将只看到垃圾。这已经是Lyubomyr Shaydariv问题的一部分:
"I also tried specifying UTF-8 BOM EF BB BF, but Excel ignores that."
我也有同样的经历:将俄语或希腊语数据写入带有BOM的utf8 csv文件会在Excel中产生垃圾:
utf8 csv文件的内容:
1 2 3
| Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ |
Excel2007中的结果:
一个解决方案是根本不使用csv。这种格式是由微软如此愚蠢地实现的,以至于如果使用逗号或分号作为分隔符,它取决于控制面板中的区域设置。因此,同一个csv文件可以在一台计算机上正确打开,但在另一台计算机上不能正确打开。"csv"表示"逗号分隔值",但例如,在德国窗口上,默认情况下分号必须用作分隔符,而逗号不起作用。(此处应命名为ssv=分号分隔值)csv文件不能在不同语言版本的Windows之间交换。这是UTF-8问题的另一个问题。
Excel已经存在几十年了。令人遗憾的是,微软这些年来一直未能实现csv导入这样的基本功能。
但是,如果将相同的值放入HTML文件中,并将该文件保存为带有文件扩展名XLS的BOM的UTF8文件,则会得到正确的结果。
utf8 XLS文件的内容:
1 2 3 4 5
| <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> |
Excel2007中的结果:
您甚至可以在HTML中使用Excel将正确显示的颜色。
2
Excel2007中的结果:
在这种情况下,只有表本身具有黑色边框和线条。如果希望所有单元格都显示网格线,也可以使用HTML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <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")。
Excel2007中的结果:
- 令人难以置信的是,人们仍然回答它。:)但是,我认为csv已经死了:csv是一种非常简单的纯流格式,当我在那个项目上时,我们也大量地将它用于组件交互。我永远不会使用HTML格式,因为它太具有代表性,我不能让那个项目的用户将数据导出到HTML,仅仅是为了使它更易于Excel。Excel对UTF-8csv很感兴趣,我不知道5年后发生了什么变化。但是逗号、分号和制表符分隔的文件真是太疯狂了。
- 人们仍然回答你的问题并不令人难以置信,因为谷歌把他们带到了这里:所有人都有同样的问题:我怎么才能让愚蠢的Excel做我想做的?在谷歌中输入3个词:"excel csv utf8",你的问题是全球第一个结果。你写了一本畅销书!
- 顺便问一句:你为什么把一个答案标为接受的答案,而不回答你想知道的问题?你写道:"当我问这个问题的时候,我问了一种在Excel中打开utf-8csv文件的方法,而不会给用户带来任何问题。"
- 只是在谷歌上搜索"excel csv utf8",我不知道问题在上面。:)关于接受答案:我将答案标记为最佳答案,因为它确实回答了如何在Excel中完成。也许我说"没问题"的时候太严厉了。我认为作为一名程序员,导入向导对我来说是很好的,但遗憾的是Excel需要(或仍然需要)进行导入,而不仅仅是打开。
- 因为你花了点时间指出这里的其他答案都不能使Excel正确打开一个csv文件,所以值得一提的是,这个答案也不能做到这一点。最初接受的答案(由版主删除)建议直接将数据导出到Excel文件,或者导出HTML文件并允许用户在Excel中打开该文件。这两种解决方案中的任何一种都没有用XLS文件扩展名保存HTML文件那么简单,但是没有人提出真正回答这个问题的答案。
- @战士:"……但是没有人提出真正回答这个问题的答案。"这是不正确的。我已经回答了这个问题:至少在Excel2007中是不可能的。这是肯定的答案。如果Excel忽略了utf8 BOM并将数据解释为ANSI,则无法通过简单双击文件(问题是:"用户无任何问题")将希腊语或俄语文本导入到Excel中。我所建议的是一个工作解决方案,它与所有Excel版本一起通过双击运行,并且不需要Excel菜单中的其他步骤。
- 该死的,当我在界面上看到的唯一一个按钮是csv时,就像我有一个选择要导出为csv以外的东西…我同意这是垃圾,但我们必须处理它。
- 是否仍要保留原始Excel单元格行而不是显示空白页?
- 我用一个额外的例子更新了我的答案以显示所有网格线。
- 这不仅不能回答这个问题,而且完全错误地说csv是"遗产"和"死亡"。仅仅因为你看不到它的用途,并不意味着它已经死了。而且,你显然不了解它的历史或者它在今天有多广泛的应用。这比XML好(由于包大小较小),这里的问题是微软如何不遵循UTF8格式的标准。正确的答案是使用开放式Office,而不是Microsoft,因为Microsoft一开始就不擅长编码。
- 你部分是对的。我更新了我的答案。这不是csv本身的错。这是微软的错。但问题是关于微软Excel的,所以如果你推荐使用开放式办公室,你肯定不会回答最初的问题(开放式办公室还有其他更糟糕的错误)。您肯定不会给电子邮件的收件人写信:"请安装OpenOffice以正确查看所附的csv文件"。必须有更好的解决方案。我的答案比让人们安装OpenOffice来打开一个csv文件要好得多。
我们使用了这种解决方法:
将csv转换为utf-16 le
在文件开头插入物料清单
使用制表符作为字段分隔符
- 谢谢!我在这个线程中尝试了所有其他的答案,但是转换成UTF-8根本没有用。当我用BOM尝试UTF-16时,它立刻就工作了。
- 此解决方案在Excel for Mac OS中工作
- 这在Office2007中不起作用。
- 对于Excel for Mac 2011,我成功地使用了utf-16小endian csv文件
- 谢谢,这个解决方案非常适合给我的用户一个unicode csv,他们可以在excel中打开。
对于php生成的csv文件也有同样的问题。当分隔符在内容的开头通过"sep=,
"定义时(当然是在BOM之后),Excel忽略了BOM。
因此,在内容的开头添加一个bom("\xEF\xBB\xBF")并通过fputcsv($fh, $data_array,";");将分号设置为分隔符就可以了。
老问题,但见鬼,最简单的解决办法是:
在记事本中打开csv
另存为->选择正确的编码
打开新文件
- 您使用哪个Excel版本?
- Excel 2010。////
- 才华横溢,工作简单,解决问题(至少对我来说)
- 不,因为问题是让Excel将.csv文件作为csv文件打开。我的意思是,我有一个生成csv文件的过程。用户只需要打开这些文件。在这里,他/她需要做的不止这些。
- @如果定期生成文件,这不是最佳解决方案。但如果是一次性的,这个答案是完美的。因为记事本会把BOM放在utf-8或utf-16文件的开头。
- 很有魅力。(:
我过去也遇到过同样的问题(如何生成Excel可以读取的文件,以及其他工具也可以读取的文件)。我使用的是tsv而不是csv,但编码也出现了同样的问题。
我找不到任何方法让Excel自动识别UTF-8,我也不愿意/不愿意让这些文件的使用者知道如何打开它们。所以我将它们编码为utf-16le(带有一个bom),而不是utf-8。两倍的大小,但Excel可以识别编码。它们的压缩性很好,所以尺寸很少(但遗憾的是,它从不)重要。
- 这是一个古老的问题,但我很高兴人们仍然回答它。谢谢您。:)
- @Lyubomyrshaydariv:因为我回答了这个问题,一位同事告诉我,最新的Excel可以识别utf-8csv文件,前提是它们有一个初始的BOM。因此,几年后,当世界上的每个人(或者无论如何,我们将文件交付给的每个人)都使用Excel或更高版本时,我可能可以更改我的编码:—)
- 奇怪,对我来说这不管用。将字符转换为中文符号…(应该是希伯来语)
- 当我保存到"utf-16 be with bom"时,Excel中有中文字符。当我尝试"UTF-16LE和BOM"时,它起作用了!我用崇高的文本来测试。
正如我在http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html上发布的:
告诉负责生成csv的软件开发人员更正它。作为快速解决方案,您可以使用GSED在字符串的开头插入UTF-8 BOM:
1
| gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv |
此命令插入UTF-4 BOM(如果不存在)。因此,它是一个等幂命令。现在您应该可以双击该文件并在Excel中打开它。
- 谢谢你把它修好了。我刚刚在记事本++中将csv';'转换为utf-bom,并知道Excels会正确地打开它。
- 正是需要的!下面是一个指向如何在php stackoverflow.com/questions/25686191/&hellip;中实现此功能的指针。
- 这是正确的解决方案。
- 这是Excel的解决方案,无法识别csv文件中的utf字符。所以这个修正来解决excel的问题。
您可以通过记事本+将.csv文件转换为带有BOM的UTF-8:
在记事本+中打开文件。
进入菜单Encoding→Convert to UTF-8。
进入菜单File→Save。
关闭记事本++。
在Excel中打开文件。
在Microsoft Excel 2013(15.0.5093.1000)中工作,MSO(15.0.5101.1000)64位,来自Microsoft Office Professional Plus 2013,位于Windows 8.1上,非Unicode程序的区域设置为"德语(德国)"。
- 照你说的做,根本不起作用。转换/编码、设置字符集,在我的例子中没有任何工作。将文件导入到谷歌工作表中,作为csv下载,可以完美地工作。欢迎你从2045年开始
这是一个古老的问题,但在顶部的搜索中会出现。我发现在csv文件的开头添加bom字符有帮助。
我在这里简要介绍过:https://sites.google.com/site/ritechtps/home/the-multi-line-fields-csv-file-and-excel-import---ha
- 谢谢你的回复。嗯,正如我在问题中提到的,EF BB BF似乎不起作用。你试过其他的材料清单吗?
用于打开utf-8文本和csv文件的简单vba宏
1 2 3 4 5 6 7 8 9
| 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。逗号:对于分布在列中的.csv文件为真
将其保存在personal.xlsb中,以便随时可用。个性化Excel工具栏添加宏调用按钮并从中打开文件。您可以为宏添加更多的格式设置,如列自动调整、对齐等。
- 谢谢。不幸的是,这是对真正的高级Excel用户的建议,我提出这个问题的目的是让Excel自动完成它。
- 我试图使用这个代码片段,但它对我不起作用。我使用Excel 2013。
只是为了帮助有兴趣在Excel上打开文件以实现我这样的线程。
我使用了下面的向导,它对我很好,导入了一个UTF-8文件。不是透明的,但如果您已经拥有该文件,则非常有用。
打开Microsoft Excel 2007。
单击数据菜单栏选项。
单击"从文本"图标。
导航到要导入的文件的位置。单击文件名,然后单击导入按钮。文本导入向导-步骤1或3窗口现在将出现在屏幕上。
选择最能描述数据分隔或固定宽度的文件类型。
从"文件来源"旁边的下拉列表中选择65001:Unicode(UTF-8)。
单击"下一步"按钮以显示文本导入向导-步骤2或3窗口。
在要导入到Microsoft Excel 2007的文件中使用的分隔符旁边放置一个复选标记。"数据预览"窗口将显示基于所选分隔符的数据显示方式。
单击"下一步"按钮显示文本导入向导-第3步,共3步。
为要导入的每列数据选择适当的数据格式。如果需要,还可以选择不导入一列或多列数据。
单击"完成"按钮,完成将数据导入Microsoft Excel 2007。
来源:https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0
这是我的工作解决方案:
2
关键是原点:=65001
是的,这是可能的。正如前面多个用户提到的,当文件以UTF-8编码时,Excel读取正确的字节顺序标记似乎有问题。对于UTF-16,它似乎没有问题,所以它是UTF-8特有的。我使用的解决方案是添加两次BOM。为此,我执行以下SED命令两次:
1
| sed -I '1s/^/\xef\xbb\xbf/' *.csv |
,其中通配符可以替换为任何文件名。但是,这会导致.csv文件开头的sep=.csv文件将在Excel中正常打开,但在第一个单元格中有一行"sep="。"sep="也可以在source.csv本身中删除,但在用vba打开文件时,应指定分隔符:
1
| Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True) |
格式6是.csv格式。如果文件中有日期,请将local设置为true。如果local未设置为true,日期将被美国化,在某些情况下会损坏.csv格式。
一个真正令人惊异的答案列表,但由于一个非常好的答案仍然缺失,我将在这里提到:用谷歌工作表打开csv文件,并将其保存回本地计算机作为Excel文件。
与微软不同的是,谷歌已经设法支持utf-8csv文件,所以它只在那里打开文件。导出到Excel格式也可以。因此,尽管这可能不是所有人的首选解决方案,但它是相当安全的,点击次数也没有听起来那么高,尤其是当你已经登录谷歌时。
这并不能准确地解决问题,但由于我偶然发现了这一点,并且上述解决方案对我不起作用或有我无法满足的需求,下面是另一种在您有权访问VIM时添加物料清单的方法:
1
| vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv |
嗨,我正在使用RubyonRails生成csv。在我们的应用程序中,我们计划使用多语言(i18n),在查看WindowsExcel的csv文件中的i18n内容时遇到了一个问题。
对Linux(Ubuntu)和Mac没问题。
我们发现需要再次导入Windows Excel数据以查看实际数据。导入时,我们将获得更多选择字符集的选项。
但这并不是每个用户都能接受的,所以我们要寻找的解决方案就是通过双击打开。
然后,借助Aghuddleston Gist,我们确定了在WindowsExcel中以打开模式和BOM显示数据的方法。在引用处添加。
示例I18N内容
在Mac和Linux中
瑞典语:F?RNAMN英语:名字
在Windows中
瑞典语:F?RNAMN英语:名字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| 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 |
这里需要注意的重要事项是打开模式和物料清单
打开_mode="w+:utf-16le:utf-8"
bom="xefxbbxbf"
在写csv之前插入bom
写BOM
F.WRITE(csv_文件)
Windows与MAC
双击可直接打开文件。
Linux(Ubuntu)
打开文件时,请询问分隔符选项->选择"选项卡"
是的,这是可能的。在编写创建csv的流时,首先要做的是:
1
| myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length) |
- 你没有读过这个问题!Lyubomyr-Shaydariv写道:"我还试图指定utf-8bomefbbbf,但Excel忽略了这一点。"
- 这是工作代码。如果您使用此线索从.NET应用程序中写出UTF-8文件,Excel将识别该文件为UTF8。
- 可能在你的Excel中,它可以工作。但至少在Excel2007中,BOM被完全忽略。因此,如果您打算编写一个适用于所有Excel版本的代码,那么您的代码就没有用处。
我尝试了我在这条线上所能找到的一切,类似的,没有什么能完全发挥作用。然而,导入到Google工作表并简单地作为csv进行下载就像一个魅力。如果你遇到我的挫折,试试看。
如果你想让它完全自动,点击一下,或者从网页自动加载到Excel中,但是不能生成合适的Excel文件,那么我建议你把Sylk格式作为一种替代方案。好吧,它不像csv那么简单,但是它是基于文本的,并且非常容易实现,它支持utf-8,没有问题。
我编写了一个PHP类,它接收数据并输出一个Sylk文件,只需单击该文件即可直接在Excel中打开该文件(或者,如果将该文件写入具有正确mime类型的网页,它将自动启动Excel)。您甚至可以添加格式(如粗体、以特定方式设置数字格式等)并更改列大小,或自动调整列大小以显示列中的文本,所有代码中的所有内容都可能不超过100行。
通过创建一个简单的电子表格并保存为Sylk,然后用文本编辑器读取,对Sylk进行反向工程是非常容易的。第一个块是您将要识别的头和标准数字格式(您只需在创建的每个文件中返回),然后数据只是一个x/y坐标和一个值。
这是一个古老的问题,但我刚遇到过类似的问题,解决方案可能会帮助其他人:
同样的问题是,将csv文本数据写入文件,然后在Excel中打开生成的.csv,会将所有文本转换为一列。在阅读了上述答案之后,我尝试了以下方法,似乎可以解决问题。
创建streamwriter时应用utf-8编码。就是这样。
例子:
1 2 3 4
| using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
/* ... do stuff .... */
output.Close();
} |
- @Elmue想详细说明一下吗?当然,使用正确的编码来输出csv可以确保以后的工作流程中不存在与Excel的兼容性问题吗?
- 代码是错误的,因为如果有using()语句,则不需要output.close()。除此之外,excel csv的输入非常原始。我根本不会用它。如果要在Excel中导入,请改用HTML表,然后在Excel中打开它。
- 感谢您澄清@elmue-不幸的是,我遇到了许多场景(包括跨网络驱动器的文件),其中明确要求关闭以及处理。我想我没有找到一个原因,为什么我在Dispose堆栈中看到一个对Close()的调用,但是我们找到了。您在关于csv导入是原始的声明中也不正确,因为它不需要您建议的低效HTML方法。事实上,创建额外的程序步骤来获取纯文本数据,转换为HTML,然后拉入Excel,这似乎有违直觉。
- 继续的。。。但是,不同的场景有不同的需求,我的示例正确地显示了如何根据请求的操作指定编码。
- 请再次阅读原始问题:"我还尝试指定utf-8 bom ef bb bf,但Excel忽略了这一点。"我测试了相同的结果:Excel不识别utf8 bom。试试看!写一个csv文件,并将希腊语或俄语字符放入其中。然后在Excel中打开它,您将得到Garbarge。所以你的答案不能解决任何问题。
- csv是原始的,因为它取决于控制面板中的设置,如果逗号或分号用作分隔符,这是最愚蠢的设计。在某些计算机上正确检测到逗号文件,但在其他计算机上未正确检测到逗号文件。如果数据本身包含逗号,则必须引用它们。而utf8不起作用。所有这些问题都不会出现在将HTML表加载到Excel中。
- 创建HTML表的编程步骤是荒谬的。将以下内容保存到扩展名为XLS的文件中,并将其另存为带BOM的UTF8,然后在Excel中打开:
colum1
|
| column2
|
|
| a a-bedиабилет |
tλη_κ |
- 我已经阅读了操作-我提供了一种通过Excel创建CSV的方法,它可以解决从中开始的问题,并且打开强制执行操作所要求的特定编码。在Excel2013和.NET 4中似乎工作得很好,所以我猜在我们的实验中,Office类型的库有版本差异吗?HTML方法效率很低,而且我仍然很惊讶您试图赞美它的优点——您所描述的纯文本异常是由编码造成的。尝试使用以纯文本形式导入,并另存为强制编码的新文件。它起作用了。
- 正如我已经说过的,您的方法在Excel2007中不起作用,而且您永远不知道您的用户使用哪种Excel版本,所以它不是通用的解决方案。
- 在2007年和2013年似乎工作得很好,所以不确定你哪里出错了。
- utf8 BOM绝对不能与Excel2007一起使用。它被忽略了。
- 下载并安装libreoffice calc
- 在libreoffice calc中打开您选择的csv文件
- 感谢上帝,一个导入文本向导出现了…
- …选择分隔符和字符编码选项
- 在Calc中选择结果数据并复制粘贴到Excel
我正在从一个简单的C应用程序生成csv文件,但遇到了同样的问题。我的解决方案是确保文件是用UTF8编码编写的,比如:
2我最初有以下代码,在记事本++中,重音符号看起来很好,但在Excel中却被破坏了:
1 2 3 4
| using (StreamWriter writer = new StreamWriter(path))
{
SaveCSV(writer);
} |
您的里程可能有所不同-我使用的是Office365的.NET 4和Excel。
首先将Excel电子表格保存为Unicode文本。使用Internet Explorer打开TXT文件并单击"另存为"TXT编码-选择适当的编码,即对于Win Cyrillic 1251