【问题标题】:Is it possible to force Excel recognize UTF-8 CSV files automatically?是否可以强制 Excel 自动识别 UTF-8 CSV 文件?
【发布时间】:2011-08-25 12:38:33
【问题描述】:

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

有什么解决办法吗?

附:哪些工具的行为可能与 Excel 类似?


更新

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


更新 2

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

【问题讨论】:

  • 可以使用制表符分隔的文件吗?如果是这样,你可能会有更多的运气。
  • Office 2010+:最佳作品:UTF-16LE,带有 BOM 和 \t 作为分隔符。将在英语和非英语 Excel 设置中工作。可以在不选择文件格式等的情况下按Ctrl-S。将保留Unicode字符。
  • @Duncan 坦率地说,我很困惑,很难“判断”。我在 2 年多前接受了 alex 的回答(5 月 14 日的 Q 和 A),然后 Mark 回答提出了一个棘手的解决方法(我实际上没有检查它),令人惊讶地在我的问题上得分更高,令人惊讶地变成了也很受欢迎。实际上,很久以前我们在我的项目中拒绝了 Excel 支持,我不想拿走 alex 的声誉评分,因为 Excel 似乎并且可能仍然似乎(如果我错了,请纠正我)错误处理 CSV。很难说,对不起。
  • Alex 的回答已被版主删除。没有给出任何解释,但如果你有足够的声望你仍然可以看到它。
  • 既然时间机器还不存在,那就只能不同意了。

标签: excel csv utf-8


【解决方案1】:

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

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

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

【讨论】:

  • 这是一种解决方法,不能回答问题。问题是我们如何创建 csv 文件并让 Excel 自动选择正确的编码。
【解决方案2】:

UTF-8 字节顺序标记将提示 Excel 2007+ 您正在使用 UTF-8 的事实。 (见this SO post)。

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

【讨论】:

  • 插入 UTF-8 BOM 似乎是要走的路。之后它是透明的。
  • 我使用 Notepad++ 轻松地将 .csv 从 UTF-8 转换为 UTF-8 with BOM
  • 是的 - 最佳解决方案。很多关于在 http 响应中设置标头的令人困惑的帖子。这解决了问题。在记事本中打开文件并使用 UTF-8 选项直接保存时也可以看到同样的情况。还添加了字节顺序标记。
  • @Elmue:我想也许(像我一样)他认为他正在用字节顺序标记保存它,但这并不是因为某些库无法正常工作他认为确实如此。我发现添加这个答案是值得的,显然其他一些人也发现它也很有用。无论如何,这似乎比说不使用 CSV 或指导用户如何以某种奇怪的方式打开文件更好。
  • Mac 版的 Excel 似乎仍然忽略 BOM。 (Excel for Mac 2011。)
【解决方案3】:

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

【讨论】:

  • 由于我在 CSV 文件(用 Java 生成)的开头添加了 \uFEFF,Excel 能够正确打开它们!谢谢
  • 这也解决了我的问题,在 php 中它看起来像这样:$utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText;
  • @updola 非常感谢您的评论,为我节省了几个小时
  • UTF-8,根据定义,不使用也不应该使用 BOM 字符。 Excel 读取 BOM 的方式破坏了 UTF-8 相对于 Unicode 的优势,后者向后兼容 ASCII。添加 BOM 将使 Excel 工作,但会破坏其他正确的 UTF-8/ASCII 文件读取。
  • \FE\FF 使 Mac OS Excel 2016 成为日文象形文字的整个文件。
【解决方案4】:

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

“当我问这个问题时,我要求一种打开 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。这种格式被微软实现得太愚蠢了,如果使用 逗号分号 作为分隔符,它取决于 控制面板 中的区域设置。因此,相同的 CSV 文件可能会在一台计算机上正确打开,但在另一台计算机上则不能。 “CSV”表示“逗号分隔值”,但例如在德语 Windows 上,默认分号必须用作分隔符,而逗号不起作用。 (这里应该命名为 SSV = 分号分隔值) CSV 文件不能在不同语言版本的 Windows 之间互换。这是 UTF-8 问题的另一个问题。

Excel 已经存在了几十年。可惜微软这么多年都没能实现 CSV 导入这样基本的东西。


但是,如果您将相同的值放入 HTML 文件并将该文件另存为 UTF8 文件,带有 BOM 文件扩展名为 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 中的结果:

您甚至可以在 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 中的结果:

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

【讨论】:

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

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

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

【讨论】:

  • 谢谢!我在这个线程中尝试了所有其他答案,但转换为 UTF-8 根本不起作用。当我尝试使用 BOM 的 UTF-16 时,它立即生效。
  • 对于 Excel for Mac 2011,我成功使用 UTF-16 little endian csv 文件
  • 谢谢,这个解决方案非常适合为我的用户提供可以在 Excel 中打开的 unicode csv。
  • 您能否更准确地解释如何转换为 UTF-16 LE 以及使用哪个 BOM?
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

    老问题,但见鬼,最简单的解决方案是:

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

    【讨论】:

    • 您使用哪个 Excel 版本?
    • 太棒了,简单地工作并解决了问题(至少对我来说)
    • 不,因为问题是让 Excel 将 .csv 文件作为 csv 文件打开。我的意思是,我有一个生成 csv 文件的过程。然后用户只需要打开文件。在这里,他/她需要做的还不止这些。
    • @Veverke 如果您定期生成文件,这不是最佳解决方案。但如果是一次性的,这个答案是完美的。它之所以有效,是因为记事本会将 BOM 放在 UTF-8 或 UTF-16 文件的开头。
    • 像魅力一样工作。 ((:
    【解决方案8】:

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

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

    【讨论】:

    • 这是一个老问题,但我很高兴人们仍然回答它。谢谢你。 :)
    • @LyubomyrShaydariv:自从我回答了这个问题后,一位同事告诉我,最新的 Excel 确实可以识别 UTF-8 CSV 文件,前提是它们具有初始 BOM。所以几年后,当世界上的每个人(或者无论如何,我们向其提供文件的每个人)都使用该版本的 Excel 或更高版本时,我也许可以更改我的编码:-)
    • 奇怪,对我来说它不起作用。将字符变成中文符号...(它们应该是希伯来语)
    • 当我保存在“UTF-16 BE with BOM”中时,我在 Excel 中有汉字。当我尝试“带有 BOM 的 UTF-16 LE”时,它起作用了!我使用 Sublime Text 进行测试。
    【解决方案9】:

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

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

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

    【讨论】:

    • 照你说的做了,根本没用。转换/编码,设置字符集,在我的情况下没有任何效果。将文件导入谷歌表格,以 csv 格式下载,完美运行。 欢迎您从 2045 年开始
    • 我必须用编码转换它-> Cinvert ti UTF-8-BOM Excel 2016 版
    【解决方案10】:

    正如我在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 中打开它了。

    【讨论】:

    • 感谢修复它。我刚刚转换了 csv ';'在 Notepad++ 中分离为 UTF-BOM 并且知道 excels 可以正确打开它。
    • 正是需要的!这是一个指向如何在 PHP stackoverflow.com/questions/25686191/… 中实现它的指针
    • 这是 excel 无法识别 csv 文件中的 utf 字符的解决方法。所以这个修正来解决excel问题。
    • 这适用于 Excel 2007 希腊语版本,带有逗号分隔符。谢谢。
    • 在 fs.createWriteStream(fileName,{encoding: 'UTF-16le'}) 中将编码更改为 'UTF-16le' 并且 excel 正确打开了 CSV 文件
    【解决方案11】:

    用于打开 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 文件

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

    【讨论】:

    • 谢谢。不幸的是,这是对真正高级 Excel 用户的建议,而我提出这个问题的目的是让 Excel 自动完成。
    • 我尝试使用此代码 sn-p 但它对我不起作用。我使用 Excel 2013。
    【解决方案12】:

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

    【讨论】:

      【解决方案13】:

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

      $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 测试

      【讨论】:

        【解决方案14】:

        这是我的工作解决方案:

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

        密钥是 Origin:=65001

        【讨论】:

          【解决方案15】:

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

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

          【讨论】:

          • 您没有阅读问题! Lyubomyr Shaydariv 写道:“我也尝试指定 UTF-8 BOM EF BB BF,但 Excel 忽略了这一点。”
          • 这是工作代码。如果您使用此线索从 .Net 应用程序中写出 UTF-8 文件,Excel 会将文件识别为 UTF8。
          • 可能在您的 Excel 中有效。但至少在 Excel 2007 中完全忽略了 BOM。因此,如果您打算编写适用于所有 Excel 版本的代码,那么您的代码就没有用了。
          【解决方案16】:

          是的,这是可能的。正如多个用户之前所指出的,当文件以 UTF-8 编码时,excel 读取正确的字节顺序标记似乎存在问题。使用 UTF-16 似乎没有问题,因此它是 UTF-8 特有的。我为此使用的解决方案是添加 BOM,TWICE。为此,我执行以下 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 格式。

          【讨论】:

          • 运行sed命令时,我得到:“sed: invalid option -- 'I'”,我认为应该是'i'
          【解决方案17】:

          一个真正令人惊叹的答案列表,但由于仍然缺少一个非常好的答案,我将在此提及:使用google sheets 打开 csv 文件并将其作为 excel 文件保存回您的本地计算机。

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

          【讨论】:

            【解决方案18】:

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

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

            【讨论】:

              【解决方案19】:

              您好,我正在使用 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.write bom

              f.write(csv_file)

              Windows 和 Mac

              文件可以直接双击打开。

              Linux (ubuntu)

              打开文件时询问分隔符选项 -> 选择“TAB”

              【讨论】:

                【解决方案20】:

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

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

                【讨论】:

                  【解决方案21】:

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

                  【讨论】:

                    【解决方案22】:

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

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

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

                    例子:

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

                    【讨论】:

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

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

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

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

                    【讨论】:

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

                      【讨论】:

                        【解决方案25】:

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

                        【讨论】:

                          【解决方案26】:

                          我尝试了在此线程和类似线程上可以找到的所有方法,但都没有完全奏效。然而,导入谷歌表格并简单地下载为 csv 就像一个魅力。如果您遇到我的挫败感,请尝试一下。

                          【讨论】:

                            【解决方案27】:

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

                            【讨论】:

                              猜你喜欢
                              • 2020-06-01
                              • 2016-04-11
                              • 1970-01-01
                              • 2013-12-13
                              • 2011-01-23
                              • 2013-03-20
                              • 2017-07-09
                              相关资源
                              最近更新 更多