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

Я разрабатываю часть приложения, которое отвечает за экспорт некоторых данных в 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, похоже, не имеет хорошего удобства для пользователя Поддержка CSV UTF-8, поэтому я считаю и ответы верны, и я принял ответ Алекса первых, потому что он действительно заявил, что Excel не смог сделать это прозрачно. Вот с чем я спутал автоматически здесь. Ответ Марка способствует более сложному пути для более продвинутых пользователей для достижения ожидаемого результата. Оба ответа великолепны, но Алекс подходит к моему не совсем конкретному вопросу немного лучше.


обновление 2

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

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

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

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

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

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

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. использовать вкладку в качестве разделителя полей

имели те же проблемы с файлами CSV, сгенерированными PHP. 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 для открытия текстовых и csv-файлов utf-8

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

в отличие от Microsoft, Google удалось поддержать файлы csv UTF-8, поэтому он просто работает, чтобы открыть файл там. И экспорт в формат 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. В нашем приложении мы планируем перейти на multi language (I18n), и мы столкнулись с проблемой при просмотре содержимого I18n в CSV-файле windows excel.

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

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

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

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

пример содержимого 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

важно отметить, что здесь открыт режим и bom

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

Бом = "\также xef\xBB по\ИЦ"

перед написанием CSV insert BOM

f.написать bom

f.написать (csv_file)

Windows и Mac

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

Linux (ubuntu)

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


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