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

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

Есть ли способ обхода?

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


ОБНОВЛЕНИЕ

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


ОБНОВЛЕНИЕ 2

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

Ответ 1

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

  • Сохранить экспортированный файл как csv
  • Открыть Excel
  • Импорт данных с использованием данных → Импорт внешних данных → Импорт данных
  • Выберите тип файла "csv" и перейдите к файлу
  • В мастере импорта измените File_Origin на "65001 UTF" (или выберите правильный идентификатор символа языка).
  • Изменить разделитель на запятую
  • Выберите, куда импортировать и завершать

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ, помеченный как принятый ответ с 200+ повышением голосов, для меня бесполезен, потому что я не хочу давать своим пользователям руководство по настройке 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 с спецификацией с расширением XLS, вы получите правильный результат.

Содержимое файла ULS XTF8:

<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

Ответ 5

Мы использовали этот обходной путь:

  1. Конвертировать CSV в UTF-16 LE
  2. Вставить спецификацию в начале файла
  3. Использовать вкладку как разделитель полей

Ответ 6

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

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

Ответ 7

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

  • Открыть CSV в Блокноте
  • Сохранить как → выберите правильную кодировку
  • Откройте новый файл

Ответ 8

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

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

Ответ 9

Как я написал на 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, если она отсутствует. Поэтому это идемпотентная команда. Теперь вы сможете дважды щелкнуть файл и открыть его в Excel.

Ответ 10

Вы можете конвертировать .csv файл в UTF-8 с помощью спецификации через Notepad++:

  1. Откройте файл в Notepad++.
  2. Зайдите в меню EncodingConvert to UTF-8.
  3. Зайдите в меню FileSave.
  4. Закройте Notepad++.
  5. Откройте файл в Excel.

Работал в Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64-разрядный из Microsoft Office Professional Plus 2013 для Windows 8.1 с языком для программ, не поддерживающих Юникод, установленным на "Немецкий (Германия)".

Ответ 12

Простой макрос 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: True для .csv файлов, распределенных в колонках

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

Ответ 13

Просто для помощи пользователям, заинтересованным в открытии файла в Excel, который достигает этого потока, как я.

Я использовал мастер ниже, и он отлично работал у меня, импортируя файл UTF-8. Не прозрачно, но полезно, если у вас уже есть файл.

  • Откройте Microsoft Excel 2007.
  • Нажмите на панель меню "Данные".
  • Нажмите на значок "От текста".
  • Перейдите к местоположению файла, который вы хотите импортировать. Нажмите на имя файла и нажмите кнопку "Импорт". На экране теперь появится Мастер импорта текста - Шаг 1 или 3.
  • Выберите тип файла, который лучше всего описывает ваши данные - разделительная или фиксированная ширина.
  • Выберите 65001: Юникод (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

Ответ 14

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

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

Ключ Origin: = 65001

Ответ 15

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

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)

Ответ 16

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

Ответ 17

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

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

Ответ 18

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

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

Ответ 19

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

Было хорошо с Linux (Ubuntu) и Mac.

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

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

Затем мы определили способ отображения данных в режиме open и bom в 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

Ответ 20

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

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

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

Пример:

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

Ответ 21

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

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

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

Ответ 22

  • Загрузите и установите LibreOffice Calc
  • Откройте файл csv по вашему выбору в LibreOffice Calc
  • Благодарим небеса, что появился мастер импорта текста...
  • ... выберите параметры разделителя и символа.
  • Выберите результирующие данные в папке Calc и copy в Excel

Ответ 23

Я генерирую файлы csv из простого приложения С# и имею ту же проблему. Мое решение состояло в том, чтобы файл был написан с кодировкой 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.

Ответ 24

Я столкнулся с той же проблемой несколько дней назад и не смог найти никакого решения, потому что я не могу использовать функцию import from csv потому что она делает все стилизованным как строка.

Моим решением было сначала открыть файл с помощью notpad++ и change the encode to ASCII. Затем просто открыл файл в Excel и все заработало как положено.

Ответ 25

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

Ответ 26

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