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


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

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

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


обновление

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


обновление 2

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

24 324

24 ответа:

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

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

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

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

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

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

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

" когда я задавал этот вопрос, я попросил способ открыть UTF-8 Файл CSV в Excel без каких-либо проблем для пользователя..."

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

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

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

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

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

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

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

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

CSV UTF8 Excel

решение заключается в том, чтобы вообще не использовать CSV. Этот формат реализован настолько тупо Microsoft, что он зависит от настроек региона в контроль панель если запятая или точка с запятой используется в качестве разделителя. Таким образом, один и тот же файл CSV может правильно открываться на одном компьютере, но на другом компьютере нет. "CSV " означает"запятая разделенные значения " но, например, на немецком Windows по умолчанию точка с запятой должна использоваться в качестве разделителя, а запятая не работает. (Здесь он должен быть назван SSV = разделенные точкой с запятой значения) 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:

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

в этом случае только сама таблица имеет черную границу и линии. Если вы хотите, чтобы все ячейки отображали линии сетки, это также возможно в 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:

enter image description here

мы использовали этот метод:

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

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

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

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

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

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

  1. открыть CSV в блокноте
  2. сохранить Как -> выбрать кодировку
  3. откройте новый файл

Как я написал на http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html:

сообщите разработчику программного обеспечения, ответственному за создание CSV, чтобы исправить его. В качестве быстрого обходного пути вы можете использовать gsed для вставки спецификации UTF-8 в начале строки:

gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv

эта команда вставляет спецификацию UTF-4, если она отсутствует. Поэтому это идемпотентная команда. Теперь вы должны иметь возможность дважды щелкнуть файл и открыть его в Превосходить.

Это старый вопрос, но в поиске в топ. Я обнаружил после многих усилий, что добавление символов спецификации в начале 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

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

сохранить его в личном.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 sheets и сохраните его обратно на локальный компьютер в виде файла excel.

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

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

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= at начало .CSV-файл. Этот.csv-файл Затем откроется нормально в excel, но с дополнительной строкой с "sep=" в первой ячейке. "Sep=" также может быть удален в источнике .сам csv, но при открытии файла с VBA необходимо указать разделитель:

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

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

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

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv

Это 2018 год, и я пришел из будущего.

чтобы открыть файл только двойным щелчком мыши, который показывает правильные символы, откройте файл в notepad++ и выберите Encoding->UTF-8-BOM и нажмите save.

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

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

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

пример:

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

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

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

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

  1. скачать и установить LibreOffice Calc
  2. откройте csv-файл по вашему выбору в LibreOffice Calc
  3. слава небесам, что появляется мастер импорта текста...
  4. ...выберите разделитель и параметры кодировки символов
  5. выберите полученные данные в Calc и скопируйте вставить в Excel

Я создаю csv-файлы из простого приложения C# и имел ту же проблему. Мое решение состояло в том, чтобы обеспечить запись файла с кодировкой UTF8, например:

// Use UTF8 encoding so that Excel is ok with accents and such.
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
    SaveCSV(writer);
}

у меня изначально был следующий код, с которым акценты отлично смотрятся в Notepad++, но были искажены в Excel:

using (StreamWriter writer = new StreamWriter(path))
{
    SaveCSV(writer);
}

ваш пробег может отличаться - я использую .NET 4 и Excel из Office 365.

Привет я использую ruby on rails для генерации csv. В нашем приложении мы планируем перейти на многоязычный (I18n), и мы столкнулись с проблемой при просмотре содержимого I18n в CSV-файле windows excel.

было хорошо с Linux (Ubuntu) и mac.

мы определили, что windows excel необходимо импортировать данные снова для просмотра фактических данных. При импорте мы получим больше возможностей для выбора набора символов.

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

затем мы определили способ отображения данных в открытом режиме и спецификации в windows excel с помощью aghuddleston суть. Добавлено по ссылке.

пример i18n content

в Mac и Linux

Шведский : Förnamn Английский : First name

В Windows

шведский язык : Förnamn Английский Язык: First имя

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 = "w+: UTF-16LE: UTF-8"

bom = "\xEF\xBB\xBF"

перед написанием CSV вставить BOM

f. напишите bom

Ф.писать(csv_file)

Windows и Mac

файл может быть открыт непосредственно двойным щелчком мыши.

Linux (ubuntu)

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

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