Можно ли заставить Excel автоматически распознавать файлы CSV UTF-8? - PullRequest
390 голосов
/ 14 мая 2011

Я разрабатываю часть приложения, которое отвечает за экспорт некоторых данных в файлы CSV. Приложение всегда использует UTF-8 из-за его многоязычности на всех уровнях. Но открытие таких файлов CSV (содержащих, например, диакритические знаки, кириллические буквы, греческие буквы) в Excel не приводит к ожидаемым результатам, показывающим что-то вроде Г„/Г¤, Г–/Г¶. И я не знаю, как заставить Excel понять, что открытый CSV-файл закодирован в UTF-8. Я также пытался указать UTF-8 BOM EF BB BF, но Excel игнорирует это.

Есть ли обходной путь?

P.S. Какие инструменты могут вести себя так же, как Excel?


UPDATE

Я должен сказать, что я перепутал сообщество с формулировкой вопроса. Когда я задавал этот вопрос, я попросил способ открыть файл CSV UTF-8 в Excel без каких-либо проблем для пользователя, бегло и прозрачно. Однако я использовал неправильную формулировку, прося сделать это автоматически . Это очень запутанно, и это противоречит автоматизации макросов VBA. Есть два ответа на эти вопросы, которые я ценю больше всего: самый первый ответ от Алекса https://stackoverflow.com/a/6002338/166589,, и я принял этот ответ; и второй от Марка https://stackoverflow.com/a/6488070/166589, который появился чуть позже. С точки зрения удобства использования, у Excel, похоже, не было хорошей и удобной поддержки CSV в UTF-8, поэтому я считаю оба правильными, и сначала я принял ответ Алекса, потому что он действительно утверждал, что Excel не смог сделать это прозрачно. Это то, что я перепутал с автоматически здесь. Ответ Марка помогает более продвинутым пользователям достичь ожидаемого результата. Оба ответа великолепны, но один из ответов Алекса немного лучше подходит к моему непонятно заданному вопросу.


ОБНОВЛЕНИЕ 2

Спустя пять месяцев после последнего редактирования я заметил, что ответ Алекса почему-то исчез. Я действительно надеюсь, что это не техническая проблема, и я надеюсь, что больше нет обсуждения того, какой ответ больше. Поэтому я принимаю ответ Марка как лучший.

Ответы [ 25 ]

364 голосов
/ 27 июня 2011

Алекс правильный, но, поскольку вы должны экспортировать в CSV, вы можете дать пользователям этот совет при открытии файлов CSV:

  1. Сохранить экспортированный файл как CSV
  2. Откройте Excel
  3. Импортируйте данные, используя Данные -> Импортировать внешние данные -> Импортировать данные
  4. Выберите тип файла "csv" и перейдите к файлу
  5. В мастере импорта измените File_Origin на «65001 UTF» (или выберите правильный языковой символьный идентификатор)
  6. Измените разделитель на запятую
  7. Выберите место для импорта и завершите

Таким образом, специальные символы должны отображаться правильно.

137 голосов
/ 09 июля 2012

Маркер порядка байтов UTF-8 будет подсказывать Excel 2007+, что вы используете UTF-8.(См. этот пост SO ).

Если у кого-то возникли те же проблемы, что и у меня, класс кодирования .NET UTF8 не выводит маркер порядка байтов при вызове GetBytes().Вам нужно использовать потоки (или обходной путь ), чтобы получить спецификацию для вывода.

68 голосов
/ 26 апреля 2013

Ошибка с игнорируемой спецификацией, похоже, исправлена ​​в Excel 2013. У меня была та же проблема с кириллическими буквами, но добавление символа спецификации \uFEFF помогло.

41 голосов
/ 25 ноября 2016

Невероятно, что существует так много ответов, но никто не отвечает на вопрос:

"Когда я задавал этот вопрос, я спросил, как открыть UTF-8 CSV-файл в Excel без проблем для пользователя, ... "

Ответ, помеченный как принятый ответ с более чем 200 голосами "за", бесполезен для меня, потому что я не хочу давать своим пользователям инструкции по настройке Excel. Кроме того: это руководство будет применяться к одной версии Excel, но другие версии Excel имеют разные меню и диалоговые окна конфигурации. Вам потребуется руководство для каждой версии Excel.

Итак, вопрос в том, как сделать так, чтобы Excel отображал данные UTF8 простым двойным щелчком мыши?

Ну, по крайней мере, в Excel 2007 это невозможно, если вы используете файлы CSV, потому что спецификация UTF8 игнорируется, и вы увидите только мусор. Это уже часть вопроса Любомира Шайдарова:

«Я также пытался указать спецификацию UTF-8 BOM EF BB BF, но Excel игнорирует это».

У меня такой же опыт: запись русских или греческих данных в CSV-файл UTF8 с спецификацией приводит к мусору в 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 и сохраните этот файл как файл UTF8 с спецификацией с расширением XLS , вы получите правильный результат.

Содержимое файла ULS XTF8:

<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:

enter image description here

38 голосов
/ 26 января 2012

Мы использовали этот обходной путь:

  1. Преобразование CSV в UTF-16 LE
  2. Вставка спецификации в начало файла
  3. Использование вкладки в качестве разделителя полей
19 голосов
/ 22 октября 2013

Были те же проблемы с PHP-файлами CSV.Excel игнорировал спецификацию, когда разделитель был определен через "sep=,\n" в начале содержимого (но, конечно, после спецификации).

Поэтому добавление спецификации ("\xEF\xBB\xBF") в начале содержимогоустановка точки с запятой в качестве разделителя с помощью fputcsv($fh, $data_array, ";"); делает свое дело.

12 голосов
/ 29 апреля 2014

Старый вопрос, но, черт возьми, самое простое решение:

  1. Открыть CSV в блокноте
  2. Сохранить как -> выбрать правильную кодировку
  3. Открыть новый файл
11 голосов
/ 09 июля 2013

В прошлом у меня была такая же проблема (как создавать файлы, которые Excel может читать, и другие инструменты также могут читать).Я использовал TSV, а не CSV, но возникла та же проблема с кодировками.

Мне не удалось найти способ заставить Excel автоматически распознавать UTF-8, и я не хотел / не мог навязатьУ потребителей файлов сложные инструкции, как их открывать.Поэтому я закодировал их как UTF-16le (с спецификацией) вместо UTF-8.В два раза больше, но Excel может распознать кодировку.И они хорошо сжимаются, поэтому размер редко (но, к сожалению, никогда) имеет значение.

8 голосов
/ 08 декабря 2017

Как я писал на http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html:

Скажите разработчику программного обеспечения, отвечающему за создание CSV, исправить это.В качестве быстрого обходного пути вы можете использовать gsed для вставки спецификации UTF-8 в начало строки:

gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv

Эта команда вставляет спецификацию UTF-4, если она отсутствуетПоэтому это идемпотентная команда.Теперь вы сможете дважды щелкнуть файл и открыть его в Excel.

5 голосов
/ 20 сентября 2018

Вы можете преобразовать файл .csv в UTF-8 с помощью спецификации через Блокнот ++:

  1. Открыть файл в Блокнот ++ .
  2. Перейти в меню EncodingConvert to UTF-8.
  3. Перейти в меню FileSave.
  4. Закрыть Блокнот ++.
  5. Открыть файл в Excel.

Работал в Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64-разрядная версия Microsoft Office Professional Plus 2013 в Windows 8.1 с языком, не поддерживающим Юникод, для программ, установленным на «German (Germany)».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...