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

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

我正在开发一个应用程序的一部分,负责将一些数据导出到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

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


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

  • 将导出的文件保存为csv
  • 打开Excel
  • 使用数据导入数据——>导入外部数据——>导入数据
  • 选择"csv"文件类型并浏览到您的文件
  • 在导入向导中,将文件u origin更改为"65001 utf"(或选择正确的语言字符标识符)
  • 将分隔符改为逗号
  • 选择导入到何处并完成
  • 这样特殊字符就可以正确显示。


    UTF-8字节顺序标记将提示Excel2007+使用UTF-8。(见本帖)。

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


    忽略了bom的bug似乎已在Excel2013中修复。我对西里尔字母也有同样的问题,但是添加bom字符\uFEFF确实有帮助。


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

    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 UTF8 Excel

    一个解决方案是根本不使用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中的结果:

    UTF8 HTML Excel

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

    2

    Excel2007中的结果:

    UTF8 HTML Excel

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

    enter image description here


    我们使用了这种解决方法:

  • 将csv转换为utf-16 le
  • 在文件开头插入物料清单
  • 使用制表符作为字段分隔符

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

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


    老问题,但见鬼,最简单的解决办法是:

  • 在记事本中打开csv
  • 另存为->选择正确的编码
  • 打开新文件

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

    我找不到任何方法让Excel自动识别UTF-8,我也不愿意/不愿意让这些文件的使用者知道如何打开它们。所以我将它们编码为utf-16le(带有一个bom),而不是utf-8。两倍的大小,但Excel可以识别编码。它们的压缩性很好,所以尺寸很少(但遗憾的是,它从不)重要。


    正如我在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文件转换为带有BOM的UTF-8:

  • 在记事本+中打开文件。
  • 进入菜单EncodingConvert to UTF-8
  • 进入菜单FileSave
  • 关闭记事本++。
  • 在Excel中打开文件。
  • 在Microsoft Excel 2013(15.0.5093.1000)中工作,MSO(15.0.5101.1000)64位,来自Microsoft Office Professional Plus 2013,位于Windows 8.1上,非Unicode程序的区域设置为"德语(德国)"。


    这是一个古老的问题,但在顶部的搜索中会出现。我发现在csv文件的开头添加bom字符有帮助。

    我在这里简要介绍过:https://sites.google.com/site/ritechtps/home/the-multi-line-fields-csv-file-and-excel-import---ha


    用于打开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上打开文件以实现我这样的线程。

    我使用了下面的向导,它对我很好,导入了一个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)

    打开文件时,请询问分隔符选项->选择"选项卡"enter image description here


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

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


    我尝试了我在这条线上所能找到的一切,类似的,没有什么能完全发挥作用。然而,导入到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();
    }

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


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