Можно ли принудительно Excel распознавать файлы CSV UTF-8 автоматически?
Я разрабатываю часть приложения, которое отвечает за экспорт некоторых данных в CSV-файлы. Приложение всегда использует UTF-8 из-за его многоязычности на всех уровнях. Но открытие таких файлов CSV (содержащих, например, диакритические буквы, кириллические буквы, греческие буквы) в Excel не дает ожидаемых результатов, показывающих что-то вроде Г„/Г¤, Г–/Г¶
. И я не знаю, как заставить Excel понять, что открытый CSV-файл закодирован в UTF-8. Я также попытался указать UTF-8 BOM EF BB BF
, но Excel игнорирует это.
Есть ли обходной путь?
PS Какие инструменты могут потенциально вести себя как Excel?
- Как предотвратить excel от изменения кодировки файла CSV после сохранения?
- Читайте в .xlsx с модулем csv в python
- Экспорт (HTML) в Excel не отображает umlaut правильно
- Как кодировать строки со смешанными наборами символов для Excel в Python
- Как исправить кодировку при создании файла excel из данных «utf-8» с помощью python
ОБНОВИТЬ
Я должен сказать, что я смутил сообщество с формулировкой вопроса. Когда я задавал этот вопрос, я попросил открыть в 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 UTF8 дает ошибку 1004
- Выход из Excel в текстовый файл с использованием VBA, формат UTF-8 Unix
- экспорт китайского символа в файл excel
- Cake PHP Xls Helper utf 8 для сервера sql
- Как разбирать символы UTF-8 в файлах Excel с помощью POI
- Чтение UTF-8 в Java из Excel txt export
- excel utf-8 csv export и разделитель
- Создание файла CSV для Excel с особым символом
Алекс прав, но поскольку вы должны экспортировать в csv, вы можете дать пользователям этот совет при открытии файлов csv:
- Сохраните экспортированный файл как csv
- Открыть Excel
- Импорт данных с использованием данных -> Импорт внешних данных -> Импорт данных
- Выберите тип файла «csv» и перейдите к файлу
- В мастере импорта измените File_Origin на «65001 UTF» (или выберите правильный идентификатор символа языка)
- Изменение разделителя на запятую
- Выберите, куда импортировать и завершить
Таким образом, специальные символы должны отображаться правильно.
Маркер байтов UTF-8 подскажет Excel 2007+ в том, что вы используете UTF-8. (См. Это сообщение SO ).
В случае, если кто-то имеет те же проблемы, что и я, класс кодирования UTF8 .NET не выводит маркер байтового порядка, даже когда его конструктор явно указан. Вы должны использовать это обходное решение, если хотите действительно сохранить его с помощью маркера байтового порядка.
Ошибка с игнорируемой спецификацией, по-видимому, исправлена для Excel 2013. У меня была \uFEFF
же проблема с кириллическими буквами, но добавление символа спецификации \uFEFF
действительно помогло.
Мы использовали это обходное решение:
- Преобразование CSV в UTF-16
- Вставить спецификацию в начале файла
- Использовать вкладку в качестве разделителя полей
Имели те же проблемы с 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. Этот устаревший формат полностью исключается из-за того, что он зависит от настроек региона на панели управления, если запятая или точка с запятой используется как разделитель, что является самым глупым неправильным дизайном в 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:
Вы даже можете использовать цвета в 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:
У меня была такая же проблема в прошлом (как создавать файлы, которые Excel может читать, а другие инструменты также могут читать). Я использовал TSV, а не CSV, но возникла та же проблема с кодировками.
Мне не удалось найти способ заставить Excel автоматически распознавать UTF-8, и я не хотел / не мог наложить потребителям файлов сложные инструкции, как их открыть. Поэтому я кодировал их как UTF-16le (с спецификацией) вместо UTF-8. Дважды размер, но Excel может распознать кодировку. И они хорошо сжимаются, поэтому размер редко (но, к сожалению, не всегда) имеет значение.
Старый вопрос, но черт, самое простое решение:
- Открыть CSV в Блокноте
- Сохранить как -> выбрать правильную кодировку
- Открыть новый файл
Это старый вопрос, но он поднимается вверх. Я нашел после многих усилий, что добавление символов 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. Не прозрачно, но полезно, если у вас уже есть файл.
- Откройте 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
Поистине удивительный список ответов, но, поскольку один довольно хороший, все еще отсутствует, я расскажу об этом здесь: откройте файл 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
- Скачать и установить LibreOffice Calc
- Откройте файл csv по вашему выбору в LibreOffice Calc
- Благодарим небеса, что появился мастер импорта текста …
- … выберите параметры разделителя и символа
- Выберите результирующие данные в Calc и скопируйте копию в Excel
Сначала сохраните таблицу Excel как текст в Юникоде. Откройте TXT-файл с помощью Internet Explorer и нажмите «Сохранить как» TXT Encoding – выберите подходящую кодировку, то есть для Win Cyrillic 1251