Я разрабатываю часть приложения, которое отвечает за экспорт некоторых данных в файлы 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, казалось, не имеет хорошей дружественной поддержки UTF-8 CSV, поэтому я считаю обои ответы правильными, и я принял ответ Алекса первым, потому что он действительно заявил, что Excel не в состоянии сделать это прозрачно. Это то, что я путаю с автоматически. Ответ Mark'а предлагает более сложный способ достижения ожидаемого результата для более опытных пользователей. Оба ответа хороши, но ответ Алекса немного лучше подходит к моему нечетко сформулированному вопросу.
UPDATE 2
Спустя пять месяцев после последнего редактирования, я'заметил, что ответ Alex'а по какой-то причине исчез. Я очень надеюсь, что это была не техническая проблема, и надеюсь, что больше не будет дискуссий о том, какой ответ лучше. Поэтому я принимаю ответ Марка как лучший.
Алекс прав, но поскольку вам нужно экспортировать в csv, вы можете дать пользователям этот совет при открытии файлов csv:
Таким образом, специальные символы будут отображаться правильно.
В кодировке UTF-8 последовательности байтов маркер будет ключ для Excel 2007+ в том, что вы'ре, используя UTF-8. (См. этот так Пост).
В случае, если кто-то испытывает те же самые вопросы, я был, .Чистый'класс кодировку с utf8, совсем не выходной маркер порядка следования байтов в метод getbytes()` вызов. Вы должны использовать потоки](https://stackoverflow.com/a/30839531/120955) (или использовать обходной путь), чтобы получить спецификацию для производства.
Это невероятно, что есть так много ответов, но ни одна не отвечает на вопрос:
"Когда я задавал этот вопрос, я попросил открыть в кодировке UTF-8 файл CSV в Excel без каких-либо проблем для пользователя,...и"
Ответ помечен как принятый ответ С 200+ голосов бесполезно для меня, потому что я Дон'т хотите, чтобы дать моим пользователям инструкцию как настроить Excel. Кроме того, в данном руководстве будет применяться к одной Excel версии но других версиях Excel имеет различные меню и диалоговые окна конфигурации. Вам понадобится руководство для каждой версии Excel.
Так вот вопрос, как в Excel отобразить данные в utf8 с простым двойным щелчком мыши?
Ну, по крайней мере, в Excel 2007 это невозможно, если вы используете CSV-файлов, потому что в utf8 спецификации игнорируется, и вы увидите только мусор. Это уже является частью вопроса о Любомир Shaydariv:
"Я также попытался с указанием UTF-8 спецификации ФВ ВВ БФ, но Excel игнорирует это.&и"
Я делаю такой же опыт: написание русских или греческих данных в CSV файл utf8 с результатами спецификации в мусор в Excel:
Содержание файла utf8 КШМ:
Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ
Результат в Excel 2007:
Решение не использовать CSV в все. Этот формат реализуется так тупо корпорацией Microsoft, что это зависит от настроек области в Панель управления если запятая или точка с запятой используется в качестве разделителя. Так же CSV-файл может правильно открыть на одном компьютере, но на другом компьютере не. "в формате CSV" и означает "запятая запятыми", а например на немецкие окна по умолчанию точка с запятой должна использоваться в качестве разделителя запятую, а не работать. (Здесь должен быть назван ССВ = значения, разделенные запятой) CSV-файлы не могут быть взаимозаменяемыми между различными языковыми версиями Windows. Это дополнительная проблема в UTF-8 проблемы.
В Excel существует на протяжении десятилетий. Жаль, что Microsoft не смогла реализовать такую элементарную вещь, как импортировать 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:
Мы использовали это обходное решение:
Имел те же проблемы с PHP-сгенерированный CSV-файлов.
В Excel игнорирует спецификации, когда сепаратор был определен через в "сентября=,\Н"
в в начале контента (но, конечно, после спецификации).
Так что добавление спецификации (в"\также xef\xBB по\ИЦ"
в) в начале контента и устанавливать точку с запятой в качестве разделителя через fputcsv($FН, $массив_данных, и"; и");` делает трюк.
У меня была такая же проблема в прошлом (как в файлы, которые Excel может читать, и другие инструменты могут также прочитать). Я использовал ТСВ, а не 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 в начале строки:
gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv
Эта команда вставляет в УТФ-4 комплекта, если нет. Поэтому команда идемпотентом. Теперь вы должны быть в состоянии дважды щелкните файл и открыть его в Excel.
Вы можете конвертировать .файл CSV в кодировке UTF-8 с BOM через Блокнот++:
кодирование
→преобразовать в UTF-8
.Работал в Microsoft Excel числа 2013 (15.0.5093.1000) МСО (15.0.5101.1000) 64-разрядной Майкрософт Офис профессиональный плюс 2013 на Windows 8.1 с локаль для не-Unicode программ я поставил, чтобы "немецкий (Германия)&;.
Просто для удобства пользователей, заинтересованных в открытии файла в Excel, что достигнуть этой теме, Как мне.
Я использовал мастер ниже, и он работал штрафа для меня, импортировав файл в UTF-8. Не прозрачный, но полезно, если у вас уже есть файл.
Источник: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0
Простой макрос 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. Запятая:правда для .CSV-файлы распространяются в столбцы
Сохраните его в личной.xlsb в он всегда доступен. Панель персонализации в Excel добавить кнопку вызова макроса и открывать файлы оттуда. Вы можете добавить больше форматирование макроса, как автоподбор ширины столбцов , выравнивание и т. д.
Да, это возможно. Как уже отмечалось несколькими пользователями, там, кажется, проблема с Excel читать правильную метку порядка следования байтов, когда файл кодируется в UTF-8. С UTF-16 это не представляется проблемой, так это эндемик в UTF-8. Решение я использую для этого при добавлении спецификации, в два раза. Для этого я выполните следующую команду sed дважды:
sed -I '1s/^/\xef\xbb\xbf/' *.csv
, где шаблон может быть заменен любым именем файла. Однако, это приводит к мутации сентября= в начале .файл CSV. Интернет .файл CSV будет потом нормально открыть в Excel, но с дополнительным рядом с "="был сентября; в первой ячейке. В "="был сентября; также могут быть удалены в источнике .сам CSV, но при открытии файла с помощью VBA разделитель должны быть указаны:
Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)
Формат 6-это .формат CSV. Установить локально значение true, в случае, если даты в файле. Если местные не установлен в значение true, даты будут Американизироваться, который в некоторых случаях будет повредить .формат CSV.
Поистине удивительный список ответов, но с одним очень хорошим все равно не хватает, Я'МР упомянуть его здесь: откройте CSV-файл с Google Таблицы и сохранить его на локальном компьютере в виде файла Excel.
В отличие от Microsoft, Google удалось поддерживать UTF-8 CSV-файлы, так что он просто работает, чтобы открыть там файл. И экспорт в формат Excel также просто работает. Так что даже хотя это может не быть оптимальным решением для всех, это довольно не безопасный и количество кликов не так высока, как это может показаться, особенно, когда вы're уже вошли в Google в любом случае.
привет Я'м с использованием Ruby на Rails для генерации CSV-файла. В нашем приложении мы планируем выйти на нескольких языках(i18n) и мы столкнулись с проблемой при просмотре содержимого i18n в CSV-файл из окна программы Excel.
Было хорошо с Linux (в Ubuntu) и Mac.
Мы определили, что окна в Excel надо снова импортировать данные для просмотра фактических данных. В то время как импорт мы получим больше вариантов, чтобы выбрать набор символов.
Но это не может быть образованным для каждого пользователя, поэтому решение, которое мы ищем-открыть просто двойным щелчком мыши.
Затем мы определили способ показать данные на открытом режиме и спецификации в Windows Excel с помощью aghuddleston суть. Добавил в ссылки.
Пример как i18n содержание
В Mac и Linux
Шведский : Фörnamn Английский : первое имя
В Windows
Шведский : Фö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 = "и ж+:в UTF-16LE:в UTF-8"и
спецификация = " и\также xef\xBB по\ИЦ"и
Прежде чем писать в CSV вставить спецификацию
Ф.писать спецификации
Ф.писать(csv_file)
Windows и Mac
Файл может быть открыт двойным щелчком.
Линукс (Ubuntu)
При открытии файла задать в параметры-разделитель> выберите вкладку “”
Это точно не решение вопроса, но так как я наткнулся на это и это't работа для меня или были требования, я не мог'т отвечать, вот еще один способ добавить спецификации, когда у вас есть доступ к Vim:
vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv
Я столкнулся с той же проблемой несколько дней назад, и не мог найти любое решение, потому что я не могу использовать импорт из CSV
, потому что он делает все, чтобы быть в стиле, как струна.
Мое решение было сначала откройте файл с помощью notpad++ и менять кодировки в ASCII`. Потом просто открыл файл в Excel и он работал, как ожидалось.
Если вы хотите сделать это полностью автоматически, одним щелчком мыши или автоматически загрузить в Excel с веб-страницы, но может'т создать необходимые файлы Excel, то я хотел бы предложить глядя на формате sylk в качестве альтернативы. Хорошо, что это не так просто, как CSV, но это очень легко реализовать и он поддерживает UTF-8 без каких-либо проблем.
Я написал PHP-класс, который получает данные и выводит файл sylk, который будет открыть непосредственно в Excel, просто нажав на файл (или автоматически запустить программу Excel, если вы запишите файл на веб-страницу с правильным MIME-типом. Вы даже можете добавить форматирование (например, полужирный, форматирование чисел, в частности, пути и т. д.) и изменение размеров столбца или столбцов автоматический размер текста в колонках и вообще, вероятно, не более 100 строк.
Он умер легко перепроектировать формат sylk путем создания простых таблиц и сохранение в формат sylk, а затем читать его с помощью текстового редактора. Первый блок заголовки и стандартных числовых форматов, распознает (которые просто пересказывают в каждый файл создать), то данные просто Х/Y координаты и значение.