Можно ли заставить 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 ]

4 голосов
/ 12 июня 2013

Это старый вопрос, но он появляется в поиске сверху.После многих усилий я обнаружил, что добавление символов спецификации в начале файла CSV помогает.

Я кратко изложил это здесь: https://sites.google.com/site/ritechtips/home/the-multi-line-fields-csv-file-and-excel-import---ha

3 голосов
/ 13 октября 2015

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

3 голосов
/ 19 марта 2012

Простой макрос 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

Origin: = 65001 - это UTF-8.Запятая: верно для файлов .csv, распределенных в столбцах

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

2 голосов
/ 01 марта 2014

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

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)
2 голосов
/ 18 октября 2013

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

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

Ключ происхождения: = 65001

2 голосов
/ 01 декабря 2016

Да, это возможно.Как отмечалось ранее несколькими пользователями, кажется, что проблема с 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.

2 голосов
/ 01 ноября 2017

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

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv
2 голосов
/ 15 августа 2018

привет, я использую ruby ​​на рельсах для генерации CSV. В нашем приложении мы планируем использовать мультиязычность (I18n) и столкнулись с проблемой при просмотре содержимого I18n в CSV-файле Windows Excel.

Хорошо с Linux (Ubuntu) и Mac.

Мы определили, что Windows Excel необходимо снова импортировать данные для просмотра фактических данных. При импорте мы получим больше вариантов выбора набора символов.

Но этому нельзя научить каждого пользователя, поэтому решение, которое мы ищем, - это открыть его двойным щелчком мыши.

Затем мы определили способ отображения данных в открытом режиме и в Windows Excel с помощью Aghuddleston gist . Добавлено по ссылке.

Пример содержания I18n

В Mac и Linux

шведский: Förnamn Английский: Имя

В Windows

шведский: Fö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

Важные вещи, на которые следует обратить внимание, это открытый режим и бомба

open_mode = "w +: UTF-16LE: UTF-8"

bom = "\ xEF \ xBB \ xBF"

Перед написанием CSV вставьте спецификацию

f.write bom

f.write (csv_file)

Windows и Mac

Файл можно открыть напрямую двойным щелчком мыши.

Linux (Ubuntu)

При открытии файла спросите опции разделителя -> выберите «TAB» enter image description here

2 голосов
/ 08 апреля 2017

Действительно удивительный список ответов, но, так как один довольно хороший ответ все еще отсутствует, я упомяну его здесь: откройте файл csv с помощью google sheet и сохраните его на локальном компьютере какФайл Excel.

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

0 голосов
/ 20 декабря 2018

Я перепробовал все, что смог найти в этой теме, но ничего не получалось. Тем не менее, импортирование в листы Google и просто загрузка в формате csv работали как шарм. Попробуйте, если вы придете к моему разочарованию.

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