Я разрабатываю часть приложения, которое отвечает за экспорт некоторых данных в файлы CSV. Приложение всегда использует UTF-8 из-за его многоязычности на всех уровнях. Но открытие таких файлов CSV (содержащих, например, диакритические знаки, буквы кириллицы, греческие буквы) в Excel не дает ожидаемых результатов, показывающих что-то подобное Г„/Г¤, Г–/Г¶
. И я не знаю, как заставить Excel понять, что открытый CSV-файл закодирован в UTF-8. Я также попытался указать спецификацию UTF-8 EF BB BF
, но Excel игнорирует это.
Есть ли обходной путь?
PS Какие инструменты могут вести себя как Excel?
ОБНОВИТЬ
Я должен сказать, что я перепутал сообщество с формулировкой вопроса. Когда я задавал этот вопрос, я попросил способ открыть файл CSV UTF-8 в Excel без каких-либо проблем для пользователя, бегло и прозрачно. Однако я использовал неправильную формулировку, прося сделать это автоматически . Это очень запутанно, и это противоречит автоматизации макросов VBA. Есть два ответа на этот вопрос, которые я ценю больше всего: самый первый ответ Алекса https://stackoverflow.com/a/6002338/166589 , и я принял этот ответ; а второй от Марка https://stackoverflow.com/a/6488070/166589которые появились чуть позже. С точки зрения удобства использования, у Excel, похоже, не было хорошей и удобной поддержки CSV в UTF-8, поэтому я считаю, что оба ответа верны, и сначала я принял ответ Алекса, потому что он действительно утверждал, что Excel не смог сделать это прозрачно. Это то, что я тут перепутал автоматически . Ответ Марка помогает более продвинутым пользователям достичь ожидаемого результата. Оба ответа великолепны, но ответ Алекса немного лучше подходит для моего неясного вопроса.
ОБНОВЛЕНИЕ 2
Спустя пять месяцев после последнего редактирования я заметил, что ответ Алекса почему-то исчез. Я действительно надеюсь, что это не техническая проблема, и я надеюсь, что больше нет обсуждения того, какой ответ больше. Поэтому я принимаю ответ Марка как лучший.
\t
качестве разделителя. Будет работать в английском и не английском настройках Excel. Можно нажиматьCtrl-S
без выбора формата файла и т. Д. Сохранятся символы Unicode.Ответы:
Алекс прав, но так как вы должны экспортировать в CSV, вы можете дать пользователям этот совет при открытии файлов CSV:
Таким образом, специальные символы должны отображаться правильно.
источник
Маркер порядка следования байтов UTF-8 поможет Excel 2007+ понять, что вы используете UTF-8. (См. Этот пост так ).
В случае, если у кого-то возникли те же проблемы, что и у меня, класс кодирования .NET UTF8 не выводит маркер порядка байтов при
GetBytes()
вызове. Вам нужно использовать потоки (или обходной путь ), чтобы получить спецификацию для вывода.источник
UTF-8
вUTF-8 with BOM
Ошибка с игнорируемой спецификацией, похоже, исправлена в Excel 2013. У меня была та же проблема с кириллическими буквами, но добавление символа спецификации
\uFEFF
помогло.источник
$utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText
:;Невероятно, что есть так много ответов, но никто не отвечает на вопрос:
Ответ, помеченный как принятый ответ с более чем 200 голосами "за", бесполезен для меня, потому что я не хочу давать своим пользователям инструкции по настройке Excel. Кроме того: это руководство будет применяться к одной версии Excel, но другие версии Excel имеют различные меню и диалоговые окна конфигурации. Вам понадобится руководство для каждой версии Excel.
Итак, вопрос в том, как сделать так, чтобы Excel показывал данные UTF8 простым двойным щелчком мыши?
По крайней мере, в Excel 2007 это невозможно, если вы используете файлы CSV, потому что спецификация UTF8 игнорируется, и вы увидите только мусор. Это уже часть вопроса Любомира Шайдарова:
Я делаю то же самое: запись русских или греческих данных в CSV-файл UTF8 с спецификацией приводит к мусору в Excel:
Содержимое файла UTF8 CSV:
Результат в Excel 2007:
Решение состоит в том, чтобы вообще не использовать CSV. Этот формат реализован Microsoft настолько глупо, что зависит от настроек региона в панели управления, если в качестве разделителя используется запятая или точка с запятой . Таким образом, один и тот же файл CSV может правильно открываться на одном компьютере, но на другом компьютере нет. «CSV» означает « запятая» Рассталась значение» , но, например , на немецком Windows , по умолчанию точки с запятой должна быть использована в качестве разделителя , а запятая не работает. (Здесь оно должно называться SSV = Значения, разделенные точкой с запятой). Файлы CSV нельзя обменивать между версиями Windows на разных языках. Это дополнительная проблема к проблеме UTF-8.
Excel существует с десятилетий. Жаль, что Microsoft не смогла реализовать такую основную вещь, как импорт CSV за все эти годы.
Однако, если вы поместите те же значения в файл HTML и сохраните этот файл как файл UTF8 с BOM с расширением XLS, вы получите правильный результат.
Содержимое файла ULS XTF8:
Результат в Excel 2007:
Вы даже можете использовать цвета в HTML, которые Excel будет отображать правильно.
Результат в Excel 2007:
В этом случае только сама таблица имеет черную рамку и линии. Если вы хотите, чтобы ВСЕ ячейки отображали линии сетки, это также возможно в HTML:
Этот код даже позволяет указать имя листа (здесь «MySuperSheet»)
Результат в Excel 2007:
источник
Мы использовали этот обходной путь:
источник
Были те же проблемы с PHP-генерируемыми CSV-файлами. Excel игнорировал спецификацию, когда разделитель был определен
"sep=,\n"
в начале содержимого (но, конечно, после спецификации).Так что добавление BOM (
"\xEF\xBB\xBF"
) в начале содержимого и установка точки с запятой в качестве разделителя черезfputcsv($fh, $data_array, ";");
делает свое дело.источник
У меня была такая же проблема в прошлом (как создавать файлы, которые Excel может читать, и другие инструменты также могут читать). Я использовал TSV, а не CSV, но возникла та же проблема с кодировками.
Мне не удалось найти способ заставить Excel автоматически распознавать UTF-8, и я не хотел / не мог навязывать потребителям файлов сложные инструкции по их открытию. Поэтому я закодировал их как UTF-16le (с спецификацией) вместо UTF-8. В два раза больше, но Excel может распознать кодировку. И они хорошо сжимаются, поэтому размер редко (но, к сожалению, никогда) имеет значение.
источник
Старый вопрос, но, черт возьми, самое простое решение:
источник
Как я уже писал на http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html :
Скажите разработчику программного обеспечения, ответственному за создание CSV, чтобы исправить это. В качестве быстрого обходного пути вы можете использовать gsed для вставки спецификации UTF-8 в начало строки:
Эта команда вставляет спецификацию UTF-4, если она отсутствует. Поэтому это идемпотентная команда. Теперь вы сможете дважды щелкнуть файл и открыть его в Excel.
источник
Вы можете конвертировать .csv файл в UTF-8 с помощью спецификации через Notepad ++:
Encoding
→Convert to UTF-8
.File
→Save
.Работал в Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64-разрядный из Microsoft Office Professional Plus 2013 для Windows 8.1 с языком для программ, не поддерживающих Юникод, установленным на «Немецкий (Германия)».
источник
Простой макрос VBA для открытия текстовых и CSV-файлов UTF-8
Происхождение: = 65001 - это UTF-8. Запятая: верно для файлов .csv, распределенных в столбцах
Сохраните его в Personal.xlsb, чтобы он всегда был доступен. Персонализируйте панель инструментов Excel, добавив кнопку вызова макроса и открыв оттуда файлы. Вы можете добавить больше форматирования к макросу, например, автоподбор колонок, выравнивание и т. Д.
источник
Просто для помощи пользователям, заинтересованным в открытии файла в Excel, которые добились этой темы, как я.
Я использовал мастер ниже, и он работал нормально для меня, импортируя файл UTF-8. Не прозрачный, но полезный, если у вас уже есть файл.
Источник: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0
источник
Да, это возможно Как отмечалось ранее несколькими пользователями, кажется, что проблема с Excel в чтении правильной метки порядка байтов, когда файл закодирован в UTF-8. С UTF-16, похоже, нет проблем, поэтому он является эндемичным для UTF-8. Решением, которое я использую для этого, является добавление спецификации, ДВАЖДЫ. Для этого я дважды выполняю следующую команду sed:
где подстановочный знак можно заменить любым именем файла. Однако это приводит к мутации sep = в начале файла .csv. Файл .csv будет затем нормально открыт в Excel, но с дополнительной строкой с «sep =» в первой ячейке. "Sep =" также можно удалить в самом исходном файле .csv, но при открытии файла с помощью VBA необходимо указать разделитель:
Формат 6 - это формат .csv. Установите для Local значение true, если в файле есть даты. Если для Local не установлено значение true, даты будут американизированы, что в некоторых случаях приведет к повреждению формата .csv.
источник
Это мое рабочее решение:
Ключ Происхождение: = 65001
источник
Да, это возможно. При написании потока, создающего CSV, первое, что нужно сделать, это:
источник
Действительно удивительный список ответов, но, так как один довольно хороший ответ все еще отсутствует, я упомяну его здесь: откройте файл csv с помощью листов Google и сохраните его на своем локальном компьютере в виде файла excel.
В отличие от Microsoft, Google удалось поддерживать CSV-файлы UTF-8, поэтому он просто открывает файл там. И экспорт в формат Excel также просто работает. Поэтому, хотя это решение может быть не самым предпочтительным для всех, оно довольно надежно, и количество кликов не так велико, как может показаться, особенно если вы уже вошли в Google.
источник
Это не совсем правильный вопрос, но так как я наткнулся на это, и вышеуказанные решения не сработали для меня или у меня были требования, которые я не мог выполнить, вот еще один способ добавить спецификацию, когда у вас есть доступ к vim:
источник
привет я использую ruby на рельсах для csv поколения. В нашем приложении мы планируем использовать мультиязычность (I18n) и столкнулись с проблемой при просмотре содержимого I18n в CSV-файле Windows Excel.
Было хорошо с Linux (Ubuntu) и Mac.
Мы определили, что Windows Excel необходимо снова импортировать данные для просмотра реальных данных. При импорте мы получим больше вариантов выбора набора символов.
Но это не может быть обучено для каждого пользователя, поэтому решение, которое мы ищем, должно быть открыто только двойным щелчком мыши.
Затем мы определили способ показать данные по открытому режиму и бом в окнах первенствовать с помощью aghuddleston сути . Добавлено по ссылке.
Пример содержания I18n
В Mac и Linux
Шведский: Förnamn Английский: Имя
В винде
Шведский: Fürnamn Английский: Имя
Важные вещи, на которые следует обратить внимание, это открытый режим и бомба
open_mode = "w +: UTF-16LE: UTF-8"
bom = "\ xEF \ xBB \ xBF"
Перед написанием CSV вставьте спецификацию
напиши бом
f.write (csv_file)
Windows и Mac
Файл можно открыть напрямую двойным щелчком мыши.
Linux (Ubuntu)
При открытии файла запросите параметры разделителя -> выберите «TAB»![введите описание изображения здесь](https://i.stack.imgur.com/KC1Zz.png)
источник
Я столкнулся с той же проблемой несколько дней назад и не смог найти никакого решения, потому что не могу использовать
import from csv
функцию, потому что она делает все стилизованным как строка.Моим решением было сначала открыть файл с помощью notpad ++ и
change the encode to ASCII
. Потом просто открыл файл в excel и все заработало как положено.источник
В php вы просто добавляете $ bom к вашей $ csv_string:
Протестировано с MS Excel 2016, php 7.2.4
источник
Это старый вопрос, но я только что столкнулся с аналогичной проблемой, и решение может помочь другим:
Была такая же проблема, когда записывать текстовые данные в формате CSV в файл, а затем открывать получившийся файл .csv в Excel, чтобы сдвинуть весь текст в один столбец. Прочитав приведенные выше ответы, я попробовал следующее, что, похоже, решило проблему.
Примените кодировку UTF-8 при создании StreamWriter. Вот и все.
Пример:
источник
Close()
вDispose
стеке, но мы идем. Вы также ошибаетесь в своем утверждении о том, что импорт CSV является примитивным, поскольку он не требует предложенного вами неэффективного подхода HTML. На самом деле создание дополнительных программных шагов для получения текстовых данных, преобразования в HTML, а затем извлечения в Excel кажется нелогичнымЕсли вы хотите сделать его полностью автоматическим, одним щелчком мыши или загрузить автоматически в Excel, скажем, с веб-страницы, но не можете сгенерировать правильные файлы Excel, я бы посоветовал рассмотреть формат SYLK в качестве альтернативы. ОК, он не так прост, как CSV, но он основан на тексте и очень прост в реализации, и поддерживает UTF-8 без проблем.
Я написал PHP-класс, который получает данные и выводит файл SYLK, который откроется прямо в Excel, просто щелкнув файл (или автоматически запустит Excel, если вы запишите файл на веб-страницу с правильным типом MIME. Вы даже можете добавьте форматирование (например, полужирный шрифт, отформатируйте числа определенными способами и т. д.) и измените размеры столбцов или столбцы автоматического размера для текста в столбцах, и в целом код, вероятно, не превышает 100 строк.
Обратный инжиниринг SYLK чрезвычайно легко создать, создав простую электронную таблицу и сохранив ее как SYLK, а затем прочитав ее в текстовом редакторе. Первый блок - это заголовки и стандартные числовые форматы, которые вы узнаете (которые вы просто отрыгиваете в каждом создаваемом файле), затем данные - это просто координата X / Y и значение.
источник
источник
Я генерирую CSV-файлы из простого приложения на C #, и у меня возникла та же проблема. Мое решение состояло в том, чтобы обеспечить запись файла в кодировке UTF8, например, так:
Первоначально у меня был следующий код, с которым акценты отлично выглядели в Notepad ++, но в Excel были искажены:
Ваш пробег может отличаться - я использую .NET 4 и Excel из Office 365.
источник
Рабочий раствор для офиса 365
UTF-16
(нет LE, BE)\t
Код в PHP
источник
Сначала сохраните электронную таблицу Excel как текст Unicode. Откройте файл TXT с помощью Internet Explorer и нажмите «Сохранить как» TXT Encoding - выберите подходящую кодировку, т.е. для Win Cyrillic 1251
источник
Я перепробовал все, что мог найти в этой теме и тому подобное, ничего не получалось полностью. Тем не менее, импортирование в листы Google и просто загрузка в формате csv работали как шарм. Попробуйте, если вы придете к моему разочарованию.
источник