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

455

Я разрабатываю часть приложения, которое отвечает за экспорт некоторых данных в файлы 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

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

Любомир Шайдаров
источник
1
Можете ли вы использовать файлы с разделителями табуляции? Если так, возможно, вам повезет больше.
Тим Перри
8
Office 2010+: лучшие работы: UTF-16LE с спецификацией и в \tкачестве разделителя. Будет работать в английском и не английском настройках Excel. Можно нажимать Ctrl-Sбез выбора формата файла и т. Д. Сохранятся символы Unicode.
Себастьян
@ Дункан, честно говоря, я запутался, и мне трудно "судить". Я принял ответ Алекса более 2 лет назад (Q и A оба 14 мая), а затем Марк ответил, предлагая хитрый обходной путь (я на самом деле его не проверял), который неожиданно набрал больше баллов по моему вопросу, что неожиданно стало также популярны. На самом деле мы давно отказались от поддержки Excel в моем проекте, и я не хочу лишать Алекса репутации, потому что Excel выглядел и, вероятно, все еще кажется (пожалуйста, поправьте меня, если я ошибаюсь), неправильно обрабатывал CSV. Сложно сказать, извини.
Любомир Шайдаров
2
Ответ Алекса был удален модератором. Объяснений не было, но если у вас достаточно репутации, вы все равно можете ее увидеть.
Марк Рэнсом
1
Поскольку машины времени еще не существуют, просто не согласны.
osexpert

Ответы:

398

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

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

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

отметка
источник
163

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

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

StriplingWarrior
источник
18
Внедрение спецификации UTF-8, кажется, является лучшим способом. После этого это прозрачно.
vy32
12
Я использую Блокнот ++, чтобы легко конвертировать .csv из UTF-8вUTF-8 with BOM
Себастьян
3
Да - лучшее решение Много запутанных сообщений о настройке заголовков в http-ответах. Это решает проблему. То же самое можно увидеть при открытии файла в блокноте и сохранении прямо вниз, используя опцию UTF-8. Также добавляет маркер порядка следования байтов.
user369142
1
@ Элмуэ: Я подумал, что, возможно, (как и я) он думал, что сохраняет его с маркером порядка следования байтов, но не потому, что какая-то библиотека не работает так, как он думал. Я счел целесообразным добавить этот ответ, и, очевидно, ряд других людей сочли его полезным. В любом случае, это кажется лучшим ответом, чем отказ от использования CSV или указание пользователям, как открыть файл каким-то странным способом.
StriplingWarrior
1
Версия Excel для Mac по-прежнему игнорирует спецификацию. (Excel для Mac 2011.)
Томас Эндрюс
74

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

sshturma
источник
8
Так как я добавил \ uFEFF в начале моего CSV-файла (созданного на Java), Excel может открыть их правильно! Thx
Гальдо
16
это решило и мою проблему, в php это выглядит так $utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText:;
Абдулла
@updola большое спасибо за этот комментарий, сэкономил мне часы
Натан Хейфилд
UTF-8 по определению не использует и не должен использовать символы спецификации. То, как Excel считывает спецификацию, усиливает преимущество UTF-8 по сравнению с Unicode, что обеспечивает обратную совместимость с ASCII. Добавление спецификации приведет к тому, что Excel будет работать, но нарушит чтение других файлов UTF-8 / ASCII.
Нельсон
1
\ FE \ FF делает Mac OS Excel 2016 целым файлом в виде японских иероглифов.
Накилон
56

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

«Когда я задавал этот вопрос, я спросил, как открыть файл 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 с BOM с расширением 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:

введите описание изображения здесь

Elmue
источник
1
И также невероятно, что люди все еще отвечают на это. :) Однако я бы сказал, что CSV мертв: CSV - смертельно простой простой потоковый формат, и, когда я работал над этим проектом, мы очень активно использовали его и для взаимодействия компонентов. Я бы никогда не использовал формат HTML из-за его слишком представительного характера, и я никогда не мог заставить пользователей этого проекта экспортировать данные в HTML только для того, чтобы сделать его дружественным к Excel. Excel сосал в UTF-8 CSV, и я понятия не имею, что изменилось 5 лет с тех пор. Но эти файлы, разделенные запятыми, точками с запятой и табуляцией, - настоящее безумие, я думаю.
Любомир Шайдаров
5
Не удивительно, что люди все еще отвечают на ваш вопрос, потому что Google приводит их сюда: все с одним и тем же вопросом: как мне заставить глупого Excel делать то, что я хочу? Введите 3 слова в Google: «Excel CSV UTF8», и ваш вопрос является первым результатом во всем мире. Вы написали бестселлер!
Эльму
8
Поскольку вы потратили время на то, чтобы указать, что ни один из приведенных здесь ответов не приводит к тому, что Excel правильно открывает файл CSV, стоит отметить, что этот ответ также не делает этого. Первоначально принятый ответ (который был удален модератором) рекомендовал экспортировать данные в файл Excel напрямую или экспортировать файл HTML и разрешить пользователям открывать файл в Excel. Любое из этих решений менее хакерское, чем сохранение файла HTML с расширением файла XLS, но не было предложено никакого ответа, который фактически отвечал бы на вопрос.
StriplingWarrior
3
@Warrior: "... но не было предложено никакого ответа, который фактически отвечает на вопрос". Это не правильно. Я ответил на этот вопрос: по крайней мере, в Excel 2007 это НЕ ВОЗМОЖНО. Это определенный ответ. Если Excel игнорирует спецификацию UTF8 и интерпретирует данные как ANSI, невозможно импортировать, например, греческий или русский текст в Excel через CSV, простым двойным щелчком по файлу (в этом был вопрос: «без проблем для пользователя» ). То, что я предлагаю, - это рабочее решение, которое работает со ВСЕМИ версиями Excel с двойным щелчком мыши и не требует дополнительных действий в меню Excel.
Elmue
2
Это не только не отвечает на вопрос, но совершенно неправильно утверждать, что CSV является «наследием» и «мертвым». То, что вы не видите смысла в этом, не означает, что он мертв. Кроме того, вы явно не понимаете его историю или то, как широко он используется сегодня. Это лучше, чем XML (из-за меньшего размера пакета), и проблема в том, как Microsoft просто не следует стандарту для формата UTF8. Правильный ответ - использовать открытый офис, а не Microsoft, поскольку Microsoft никогда прежде не умела кодировать.
Джереми
49

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

  1. Конвертировать CSV в UTF-16 LE
  2. Вставить спецификацию в начале файла
  3. Использовать вкладку как разделитель полей
е-цинковые
источник
1
Спасибо! Я попробовал все остальные ответы в этой теме, но конвертация в UTF-8 просто не сработала. Когда я попробовал UTF-16 с BOM, это сработало мгновенно.
Хаски
Для Excel для Mac 2011 я был успешным с файлами UTF-16 с
прямым порядком
Спасибо, это решение отлично подходит для предоставления моим пользователям Unicode CSV, который они могут открыть в Excel.
user1073075
21

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

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

Иштлильтон
источник
13

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

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

Стив Джессоп
источник
Это старый вопрос, но я рад, что люди все еще отвечают на него. Спасибо. :)
Любомир Шайдаров
1
@LyubomyrShaydariv: с тех пор, как я ответил на этот вопрос, коллега сказал мне, что последний Excel определяет файлы CSV UTF-8, если у них есть исходная спецификация. Таким образом, через несколько лет, когда все в мире (или, в любом случае, все, кому мы доставляем файлы) будут работать в этой версии Excel или лучше, я смогу изменить свою кодировку :-)
Стив Джессоп,
Странно, у меня это не работает. Превращает символы в китайские символы ... (они должны быть на иврите)
Veverke
У меня были китайские иероглифы в Excel, когда я сохранял их в "UTF-16 BE with BOM". Когда я попробовал "UTF-16 LE с BOM", это сработало! Я использовал Sublime Text для тестирования.
Хенно
12

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

  1. Откройте CSV в блокноте
  2. Сохранить как -> выбрать правильную кодировку
  3. Откройте новый файл
Aki
источник
1
Какую версию Excel вы используете?
Любомир Шайдаров
1
Блестящий, просто работает и решает проблему (по крайней мере, для меня)
Auberon Vacher
1
Нет, потому что проблема в том, чтобы Excel открыл файл .csv как файл csv. Я имею в виду, у меня есть процесс, где я генерирую CSV-файлы. Тогда пользователю потребуется только открыть файлы. Здесь он / она обязан делать больше, чем это.
Веверке
2
@ Veverke, если вы генерируете файлы на регулярной основе, это не лучшее решение. Но если это разовое, этот ответ идеально подходит. Это работает, потому что Блокнот поместит спецификацию в начало файла UTF-8 или UTF-16.
Марк Рэнсом
Работает как шарм. ((:
user2925795
10

Как я уже писал на 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.

Нестор Уркиса
источник
Спасибо, это исправило. Я только что преобразовал CSV ';' разделен на UTF-BOM в Notepad ++ и знает, что открывает правильно.
RandomGuy
Именно то, что было нужно! Вот указатель на то, как реализовать это в PHP stackoverflow.com/questions/25686191/…
EFC
Это обходной путь для Excel, который не может распознать утфические символы в файлах csv. Так что это исправление, чтобы исправить проблему Excel.
19
Это работало для Excel 2007 греческой версии, с разделителями-запятыми. Спасибо.
NameOfTheRose
Изменил кодировку на 'UTF-16le' в fs.createWriteStream (fileName, {encoding: 'UTF-16le'}) и Excel открыла файл CSV правильно
rahul shukla
9

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

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

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

Кристофер Ади Паскуаль
источник
1
Сделал то, что ты сказал, не сработало вообще. Конвертация / кодирование, установка наборов символов, ничего не работает в моем случае. Импортировать файл в гугл листы, скачать как csv, работал без нареканий. Ваше приветствие с 2045 года
pakalbekim
1
Я должен был преобразовать это с Кодировкой -> Cinvert ti UTF-8-BOM Excel версия 2016
Игорь Вукович
4

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

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

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

алк
источник
2
Спасибо. К сожалению, это предложение для действительно продвинутых пользователей Excel, и, задавая этот вопрос, я стремлюсь сделать так, чтобы Excel делал это автоматически.
Любомир Шайдаров
Я пытался использовать этот фрагмент кода, но он не работает для меня. Я использую Excel 2013.
Шарунас Бельскис
3

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

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

TheCharlatan
источник
1
при запуске команды sed я получаю: «sed: неверная опция -« I »», я думаю, это должно быть «i»
BiAiB
2

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

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

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

Nobilis
источник
2

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

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)
резак кровельщика
источник
Вы не читали вопрос! Любомир Шайдаров написал: «Я также пытался указать спецификацию UTF-8 BOM EF BB BF, но Excel игнорирует это».
Эльму
Это рабочий код. Если вы записываете файлы UTF-8 из приложений .Net с этим отрывом, Excel распознает этот файл как UTF8.
Zax
Может быть, в вашем Excel это работает. Но по крайней мере в Excel 2007 спецификация полностью игнорируется. Так что, если вы намереваетесь написать код, который работает на всех версиях Excel, ваш код будет бесполезным.
Elmue
2

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

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

Christoph
источник
2

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

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv
CannedMoose
источник
2

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

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

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

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

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

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

В Mac и Linux

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

В винде

Шведский: 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 (csv_file)

Windows и Mac

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

Linux (Ubuntu)

При открытии файла запросите параметры разделителя -> выберите «TAB» введите описание изображения здесь

praaveen
источник
1

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

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

lpinto.eu
источник
1

В php вы просто добавляете $ bom к вашей $ csv_string:

$bom = sprintf( "%c%c%c", 239, 187, 191); // EF BB BF
file_put_contents( $file_name, $bom . $csv_string );

Протестировано с MS Excel 2016, php 7.2.4

Vess
источник
0

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

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

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

Пример:

using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
   /* ... do stuff .... */
   output.Close();
}
Rex
источник
@elmue хотите уточнить немного? Надежный вывод CSV с использованием правильной кодировки для начала гарантирует, что нет проблем совместимости с Excel позже в рабочем процессе?
Рекс
Код неправильный, потому что вам не нужен output.Close (), если у вас есть оператор using (). Кроме того, Excel CSV-вход очень примитивен. Я бы не использовал его вообще. Если вы хотите импортировать в Excel, используйте вместо этого таблицу HTML и откройте ее в Excel.
Elmue
Спасибо за разъяснение @Elmue - к сожалению, я столкнулся с рядом сценариев (включая файлы на сетевых дисках), где явно требуется закрытие, а также удаление. Не нашел причину, почему, как мне кажется, я помню, как видел вызов Close()в Disposeстеке, но мы идем. Вы также ошибаетесь в своем утверждении о том, что импорт CSV является примитивным, поскольку он не требует предложенного вами неэффективного подхода HTML. На самом деле создание дополнительных программных шагов для получения текстовых данных, преобразования в HTML, а затем извлечения в Excel кажется нелогичным
Рекс
продолжение ... Однако разные сценарии предъявляют разные требования, и мой пример правильно показывает, как указать кодировку в соответствии с запросом OP
Rex
Пожалуйста, прочтите исходный вопрос еще раз: «Я также пытался указать спецификацию UTF-8 BOM EF BB BF, но Excel игнорирует это». Я протестировал то же самое и пришел к тому же результату: Excel НЕ распознает спецификацию UTf8. Попробуй это! Напишите файл CSV и вставьте в него греческие или русские буквы. Затем откройте это в Excel, и вы получите garbarge. Так что твой ответ ничего не решает.
Elmue
0

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

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

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

Cloudranger
источник
0
  1. Загрузите и установите LibreOffice Calc
  2. Откройте файл CSV по вашему выбору в LibreOffice Calc
  3. Слава Богу, что появился мастер импорта текста ...
  4. ... выберите разделитель и параметры кодировки символов
  5. Выберите полученные данные в Calc и скопируйте их в Excel
Дэн
источник
0

Я генерирую 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.

Йоу йоу
источник
0

Рабочий раствор для офиса 365

  • сохранить в UTF-16(нет LE, BE)
  • использовать разделитель \t

Код в PHP

$header = ['číslo', 'vytvořeno', 'ěščřžýáíé'];
$fileName = 'excel365.csv';
$fp = fopen($fileName, 'w');
fputcsv($fp, $header, "\t");
fclose($fp);

$handle = fopen($fileName, "r");
$contents = fread($handle, filesize($fileName));
$contents = iconv('UTF-8', 'UTF-16', $contents);
fclose($handle);

$handle = fopen($fileName, "w");
fwrite($handle, $contents);
fclose($handle);
podolinek
источник
-1

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

Bragabondio
источник
-1

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

pakalbekim
источник