Можно ли принудительно Excel распознавать файлы CSV UTF-8 автоматически?

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

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

PS Какие инструменты могут потенциально вести себя как Excel?


ОБНОВИТЬ

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


ОБНОВЛЕНИЕ 2

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

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

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

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

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

В случае, если кто-то имеет те же проблемы, что и я, класс кодирования UTF8 .NET не выводит маркер байтового порядка, даже когда его конструктор явно указан. Вы должны использовать это обходное решение, если хотите действительно сохранить его с помощью маркера байтового порядка.

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

Мы использовали это обходное решение:

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

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

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

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

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

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

Итак, вопрос заключается в том, как сделать Excel показать данные UTF8 простым двойным щелчком?

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

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

Я делаю такой же опыт: написание русских или греческих данных в CSV-файл UTF8 с помощью спецификации приводит к мусору в Excel:

Содержимое файла CSV UTF8:

 Colum1;Column2 Val1;Val2 Авиабилет;Tλληνικ 

Результат в Excel 2007:

CSV UTF8 Excel

Решение состоит в том, чтобы вообще не использовать CSV. Этот устаревший формат полностью исключается из-за того, что он зависит от настроек региона на панели управления, если запятая или точка с запятой используется как разделитель, что является самым глупым неправильным дизайном в Excel. Таким образом, один и тот же файл CSV может корректно открываться на одном компьютере, но на другом компьютере нет. «CSV» означает « Comma Separated Values», но, например, в немецкой Windows по умолчанию точка с запятой должна использоваться как разделитель, а запятая не работает. Это противоречит названию формата файла.

Excel существует с десятилетия. Жаль, что Microsoft не смогла реализовать такую ​​элементарную вещь, как импорт CSV за все эти годы.

Если вы поместите те же значения в файл HTML и сохраните этот файл в виде файла UTF8 с спецификацией с расширением 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:

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

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

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

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

  1. Открыть CSV в Блокноте
  2. Сохранить как -> выбрать правильную кодировку
  3. Открыть новый файл

Это старый вопрос, но он поднимается вверх. Я нашел после многих усилий, что добавление символов BOM в начале csv-файла помогает.

Я кратко проинформировал его здесь: https://sites.google.com/site/ritechtips/home/the-multi-line-fields-csv-file-and-excel-import—ha

Простой макрос 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. Comma: Истина для CSV-файлов, распространяемых в колонках

Сохраните его в Personal.xlsb, чтобы он всегда был доступен. Персонализируйте панель инструментов excel, добавив кнопку вызова макроса и откройте файлы. Вы можете добавить больше макросов в макрос, например, автозапуск столбцов, выравнивание и т. Д.

Просто для помощи пользователям, заинтересованным в открытии файла в 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

Поистине удивительный список ответов, но, поскольку один довольно хороший, все еще отсутствует, я расскажу об этом здесь: откройте файл csv с листами Google и сохраните его на своем локальном компьютере в качестве файла excel.

В отличие от Microsoft, Google удалось поддерживать файлы csv UTF-8, поэтому он просто работает, чтобы открыть там файл. И экспорт в формат excel также просто работает. Поэтому, хотя это не может быть предпочтительным решением для всех, оно довольно безопасно, и количество кликов не так велико, как может показаться, особенно если вы уже вошли в Google в любом случае.

Это старый вопрос, но я столкнулся с подобной проблемой, и решение может помочь другим:

Имел ту же проблему, когда вы записывали текстовые данные CSV в файл, а затем открывая полученный .csv в Excel, сдвигает весь текст в один столбец. Прочитав приведенные выше ответы, я попробовал следующее, что, похоже, устраняет проблему.

Примените кодировку UTF-8 при создании StreamWriter. Вот и все.

Пример:

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

Это мое рабочее решение:

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

Ключ: Origin: = 65001

Да, это возможно. При написании потока, создающего csv, первое, что нужно сделать, это следующее:

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

Да, это возможно. Как уже отмечалось несколькими пользователями, кажется, что проблема в том, что excel читает правильный знак байтового байта, когда файл закодирован в UTF-8. С UTF-16 у него нет проблем, поэтому он является эндемичным для UTF-8. Решением, которое я использую для этого, является добавление спецификации, ДВАЖДЫ. Для этого я выполняю следующую команду sed дважды:

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

, где подстановочный знак можно заменить любым именем файла. Однако это приводит к мутации sep = в начале файла .csv. Затем файл .csv будет нормально открыт в excel, но с дополнительной строкой с «sep =» в первой ячейке. «Sep =» также можно удалить в самом источнике .csv, но при открытии файла с VBA следует указать разделитель:

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

Формат 6 – это формат .csv. Установите Local в значение true, если в файле есть даты. Если Local не установлен в true, даты будут американизированы, что в некоторых случаях испортит формат .csv.

Если вы хотите сделать его полностью автоматическим, одним щелчком мыши или автоматически загружать в Excel из веб-страницы, но не можете создавать надлежащие файлы Excel, я бы предложил посмотреть в формате SYLK в качестве альтернативы. ОК, это не так просто, как CSV, но оно основано на тексте и очень легко реализуется, и оно поддерживает UTF-8 без проблем.

Я написал класс PHP, который получает данные и выводит файл SYLK, который будет открыт непосредственно в Excel, просто щелкнув файл (или автоматически запустит Excel, если вы напишете файл на веб-странице с правильным типом mime. добавьте форматирование (например, жирный шрифт, номера формата, в частности, пути и т. д.) и измените размеры столбцов или столбцы автоматического размера на текст в столбцах, а всего кода всего, вероятно, не более 100 строк.

Слишком легко переделать SYLK, создав простую электронную таблицу и сохранив ее как SYLK, а затем прочитав ее с помощью текстового редактора. Первый блок – это заголовки и форматы стандартных номеров, которые вы узнаете (которые вы просто срываете в каждом файле, который вы создаете), тогда данные – это просто координата X / Y и значение.

Это неточно решает вопрос, но поскольку я наткнулся на это, и вышеупомянутые решения не сработали для меня или не соответствовали требованиям, которые я не мог встретить, вот еще один способ добавить спецификацию, когда у вас есть доступ к vim:

 vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv 
  1. Скачать и установить LibreOffice Calc
  2. Откройте файл csv по вашему выбору в LibreOffice Calc
  3. Благодарим небеса, что появился мастер импорта текста …
  4. … выберите параметры разделителя и символа
  5. Выберите результирующие данные в Calc и скопируйте копию в Excel

Сначала сохраните таблицу Excel как текст в Юникоде. Откройте TXT-файл с помощью Internet Explorer и нажмите «Сохранить как» TXT Encoding – выберите подходящую кодировку, то есть для Win Cyrillic 1251

  • php экспорт в excel с помощью utf8
  • Формат: неправильная ширина строки при кодировании UTF-8
  • Экспорт строк Excel в текстовые файлы с кодировкой UTF-8
  • Есть ли способ создать строку, которая может быть вставлена ​​в Excel с общим форматированием (например, пули, внутрисетевые разрывы строк)
  • Экспорт Excel в .txt через скрипт
  • Определение кодировки UTF8 при импорте CSV в VB.Net
  • UnicodeDecodeError при попытке изменить точки на запятые в Excel
  • R сменяет кодировку символов символьного вектора
  • Копирование корейских символов из Excel в TextEdit с помощью AppleScript
  • Есть ли какой-либо путь через java-программу, я могу сказать Excel открыть файл csv в utf8?
  • Вызов другого объектаStream.Write текстовый макрос внутри моего макроса не работает
  • Давайте будем гением компьютера.