Чи можна змусити Excel розпізнавати файли CSV UTF-8 автоматично?


455

Я розробляю частину програми, яка відповідає за експорт деяких даних у файли CSV. Додаток завжди використовує UTF-8 через його багатомовність на всіх рівнях. Але відкриття таких файлів CSV (що містять, наприклад, діакритику, кириличні букви, грецькі літери) в Excel не дає очікуваних результатів, показуючи щось подібне Г„/Г¤, Г–/Г¶. І я не знаю, як змусити Excel зрозуміти, що відкритий файл CSV закодований в UTF-8. Я також спробував вказати UTF-8 BOM 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 з BOM та \tяк роздільник. Працює в англійській та не англійській настройках Excel. Можна натиснути, Ctrl-Sне вибираючи формат файлу тощо. Збереже символи Unicode.
Себастьян

@Duncan відверто кажучи, я розгублений і важко "судити". Я прийняв відповідь Алекса більше 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 Byte-order підкаже Excel 2007+ у тому, що ви використовуєте UTF-8. (Дивіться цю публікацію SO ).

Якщо у когось виникають ті ж самі проблеми, що і у мене, клас кодування .NET UTF8 не виводить маркер порядку байт під час GetBytes()виклику. Вам потрібно скористатися потоками (або вирішити спосіб вирішення ), щоб отримати BOM для виведення.


18
Встановлення BOM UTF-8, здається, це шлях. Після цього він прозорий.
vy32

12
Я використовую Notepad ++, щоб легко перетворити .csv з UTF-8вUTF-8 with BOM
Sébastien

3
Так - найкраще рішення. Багато заплутаних публікацій навколо налаштування заголовків у відповідях http. Це вирішує проблему. Те саме можна побачити під час відкриття файлу в блокноті та збереження назад вниз за допомогою параметра UTF-8. Також додає маркер порядку байт.
користувач369142

1
@Elmue: Я подумав, що, можливо, як і я, він думає, що він зберігає його маркером порядку байтів, але це не тому, що деякі бібліотеки не працюють так, як він думав, що це робиться. Я вважав за доцільне додати цю відповідь, і, очевидно, ряд інших людей теж вважають її корисною. У будь-якому випадку, це здається кращою відповіддю, ніж казати не використовувати CSV або вказувати користувачам, як відкрити файл якимись химерними способами.
StriplingWarrior

1
Версія для Mac в Excel, здається, все ще ігнорує BOM. (Excel для Mac 2011.)
Томас Ендрюс

74

Помилка з ігнорованою BOM, здається, виправлена ​​у Excel 2013. У мене була така ж проблема з кирилицями, але додавання символу BOM \uFEFFдопомогло.


8
Оскільки я додав \ uFEFF на початку свого CSV-файлу (згенерованого на Java), Excel зможе правильно їх відкрити! Thx
Галдо

16
це теж вирішило мою проблему, у php це виглядає так $utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText:;
Абдулла

@updola дуже дякую за цей коментар, врятував мені години
nathan hayfield

UTF-8, за визначенням, не використовує і не повинен використовувати символи BOM. Те, як Excel читає BOM, перекручує перевагу UTF-8 над Unicode, що є зворотною сумісністю з ASCII. Додавання BOM змусить Excel працювати, але порушить інші відповідні зчитування файлів UTF-8 / ASCII.
Нельсон

1
\ FE \ FF робить для Mac OS Excel 2016 весь файл японськими ієрогліфами.
Накілон

56

Неймовірно, що відповідей так багато, але жоден не відповідає на питання:

"Коли я задавав це питання, я попросив спосіб відкриття файлу CSV UTF-8 в Excel без проблем для користувача, ..."

Відповідь, позначена як прийнята відповідь на 200+ голосів, для мене марна, оскільки я не хочу давати своїм користувачам посібник, як налаштувати Excel. Крім цього: цей посібник застосовуватиметься до однієї версії Excel, але інші версії Excel мають різні меню та діалогові вікна конфігурації. Вам знадобиться посібник для кожної версії Excel.

Отже, питання полягає в тому, як змусити Excel показати дані UTF8 простим подвійним клацанням?

Принаймні, в Excel 2007 це неможливо, якщо ви використовуєте файли CSV, оскільки BOM 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. Цей формат реалізований настільки нерозумно, що він залежить від параметрів регіону на панелі керування, якщо кома чи в якості роздільника використовується крапка з комою . Таким чином, той самий файл CSV може вірно відкриватися на одному комп’ютері, але на певному комп'ютері - ні. «CSV» означає « Comma Рассталась значення» , але, наприклад , на німецькому Windows , за замовчуванням точки з коми повинна бути використана в якості роздільника , а кома не працює. (Тут слід назвати SSV = розділені значеннями з комою з комою) Файли CSV не можна міняти між різними мовними версіями Windows. Це додаткова проблема проблеми UTF-8.

Excel існує з десятиліть. Прикро, що корпорація Майкрософт не змогла реалізувати таку основну річ, як імпорт CSV за всі ці роки.


Однак якщо ви введете ті самі значення у файл HTML і збережете цей файл як файл UTF8 з BOM з розширенням файлу XLS ви отримаєте правильний результат.

Вміст файлу XLS UTF8:

<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:

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


1
І також неймовірно, що люди все ще відповідають на це. :) Однак я заперечую, що CSV мертвий: CSV - це смертельно простий звичайний формат потокового потоку, і, коли я був у тому проекті, ми використовували його дуже сильно і для взаємодії компонентів. Я ніколи б не використовував формат HTML через його занадто репрезентативний характер, і я ніколи не міг би зробити так, щоб користувачі цього проекту експортували дані в HTML, просто щоб зробити його зручним для Excel. Excel смоктав на UTF-8 CSV, і я не маю поняття, що змінилося за 5 років відтоді. Але, мабуть, ці файли з комою, напівкрапкою та вкладками - це справжнє божевілля.
Любомир Шайдарів

5
Не неймовірно, що люди все ще відповідають на ваше запитання, тому що Google приносить їх сюди: Усі з тим самим запитанням: Як змусити дурного Excel робити те, що я хочу? Введіть у Google 3 слова: "excel csv utf8", і ваше питання - ПЕРШИЙ результат у всьому світі. Ви написали бестселер!
Elmue

8
Оскільки ви знайшли час вказати на те, як жоден з інших відповідей тут не призводить до того, що Excel правильно відкриває файл CSV, варто згадати, що і ця відповідь не робить цього. Оригінально прийнята відповідь (яку видалив модератор) рекомендувала експортувати дані безпосередньо у файл Excel або експортувати HTML-файл та дозволяти користувачам відкривати файл у Excel. Будь-яке з цих рішень є менш хакітним, ніж збереження HTML-файлу з розширенням файлу XLS, але жодної відповіді не запропоновано, що б насправді не відповідало на питання.
StriplingWarrior

3
@Warrior: ".. але не запропоновано жодної відповіді, яка б насправді відповідала на питання." Це неправильно. Я відповів на це питання: Принаймні, з Excel 2007 це НЕ МОЖЛИВО. Це певна відповідь. Якщо Excel ігнорує BOM UTF8 і інтерпретує дані як ANSI, неможливо імпортувати, наприклад, грецький чи російський текст у Excel через CSV простим подвійним клацанням по файлу (що було питання: "без проблем для користувача" ). Я пропоную це робоче рішення, яке функціонує у ВСІХ версіях Excel подвійним клацанням і не потребує додаткових кроків у меню Excel.
Елмуе

2
Це не лише не відповідає на питання, але абсолютно неправильно констатувати, що CSV є "спадщиною" та "мертвим". Тільки тому, що ви не бачите користі для цього, не означає, що він мертвий. Крім того, ви чітко не розумієте, що це історія чи наскільки вона широко використовується сьогодні. Це краще, ніж XML (через менший розмір пакетів), і проблема полягає в тому, як Microsoft просто не дотримується стандарту для формату UTF8. Правильною відповіддю було б використовувати відкритий офіс, а не Microsoft, оскільки Microsoft ніколи не була хороша в кодуванні.
Джеремі

49

Ми використали цей спосіб вирішення:

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

1
Дякую! Я спробував усі інші відповіді в цій темі, але перейти на UTF-8 просто не вийшло. Коли я спробував UTF-16 з BOM, він працював миттєво.
Хаскі

Для Excel для Mac 2011 я мав успіх у файлах csv маленьких
ендіанських

Дякую, це рішення є чудовим тим, що надає моїм користувачам uncode csv, який вони можуть відкрити в Excel.
користувач1073075

21

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

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


13

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

Мені не вдалося знайти жодного способу змусити Excel розпізнавати UTF-8 автоматично, і я не бажав / не міг надати споживачам файлів складні інструкції, як їх відкрити. Тому я кодував їх як UTF-16le (з BOM) замість UTF-8. Удвічі більший розмір, але Excel може розпізнати кодування. І вони добре стискаються, тому розмір рідко (але, на жаль, ніколи) не має значення.


Це старе питання, але я щасливий, що люди все ще відповідають на нього. Дякую. :)
Любомир Шайдарів

1
@LyubomyrShaydariv: оскільки я відповів на це запитання, колега сказав мені, що останній Excel ідентифікує файли CSV UTF-8 за умови, що вони мають початковий BOM. Тож через кілька років, коли всі в світі (або, як би там не було, всі, кому ми доставляємо файли), перебуваємо на цій версії Excel або краще, я можу змінити своє кодування :-)
Стів Джессоп

Дивно, для мене це не працює. Перетворює символів на китайські символи ... (вони повинні бути івритом)
Веверке,

У мене в Excel були китайські символи, коли я економив у "UTF-16 BE with BOM". Коли я спробував "UTF-16 LE з BOM", це спрацювало! Я використовував Sublime Text для тестування.
Генно

12

Старе питання, але чорт, найпростіше рішення:

  1. Відкрийте CSV у Блокноті
  2. Зберегти як -> вибрати правильне кодування
  3. Відкрийте новий файл

1
Яку версію Excel ви використовуєте?
Любомир Шайдарів

1
Блискучий, просто працює і вирішує проблему (принаймні для мене)
Auberon Vacher

1
Ні, тому що проблема полягає в тому, щоб Excel відкрив файл .csv як файл CSV. Я маю на увазі, у мене є процес, коли я генерую CSV-файли. Потім користувачеві потрібно буде лише відкрити файли. Тут від нього вимагається зробити більше.
Веверке

2
@Veverke, якщо ви генеруєте файли регулярно, це не найкраще рішення. Але якщо це одноразово, ця відповідь ідеальна. Це працює, тому що Блокнот поставить BOM на початку файлу UTF-8 або UTF-16.
Марк Рансом

Працює як шарм. ((:
користувач2925795

10

Як я публікував на http://thinkinginsoftware.blogspot.com/2017/12/correct-generate-csv-that-excel-can.html :

Повідомте розробника програмного забезпечення, відповідального за створення CSV, щоб його виправити. Як швидке вирішення, ви можете використовувати gsed, щоб вставити UTF-8 BOM на початку рядка:

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

Ця команда вставляє UTF-4 BOM, якщо немає. Тому це ідентична команда. Тепер ви повинні мати можливість двічі клацнути файл та відкрити його в Excel.


Завдяки цьому виправили це. Я щойно перетворив csv ';' розділено на UTF-BOM у Notepad ++ і знає, що excels відкриває його правильно.
RandomGuy

Саме те, що було потрібно! Ось вказівник на те, як реалізувати це в PHP stackoverflow.com/questions/25686191/…
EFC

Це рішення для excel, який не міг розпізнати utf chareacters у файлах csv. Таким чином, ця корекція для виправлення проблеми excel.
коп

Це працювало для грецької версії Excel 2007 із сепараторами з комами. Дякую.
NameOfTheRose

Змінено кодування на 'UTF-16le' у fs.createWriteStream (fileName, {encoding: 'UTF-16le'}) та excel правильно відкрив файл CSV
rahul shukla

9

Ви можете конвертувати .csv файл в UTF-8 за допомогою BOM через Notepad ++:

  1. Відкрийте файл у Блокноті ++ .
  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 з локальною програмою для програм Unicode, встановлених на "Німецька (Німеччина)".


1
Те, що ви сказали, зовсім не працювало. Перетворення / кодування, встановлення наборів символів, у моєму випадку нічого не працювало. Імпорт файлу на google аркуші, завантажте як csv, працював бездоганно.
Привітання

1
Мені довелося перетворити це за допомогою Encoding -> Cinvert ti UTF-8-BOM Excel версія 2016
Ігор Вукович

4

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

Збережіть його в Personal.xlsb, щоб він завжди був доступний. Персоналізуйте панель інструментів Excel, додавши кнопку виклику макросу та відкрийте файли звідти. Ви можете додати більше форматування до макросу, наприклад, автоматичне налаштування стовпців, вирівнювання тощо.


2
Дякую. На жаль, це пропозиція для дійсно просунутих користувачів Excel, і те, що я прагну, задаючи це питання, змушує Excel робити це сам автоматично.
Любомир Шайдарів

Я спробував використати цей фрагмент коду, але він не працює для мене. Я використовую Excel 2013.
Sharunas Bielskis

3

Просто для допомоги користувачам, зацікавленим у відкритті файлу в Excel, які досягають такої теми, як я.

Я використовував майстра нижче, і він працював мені добре, імпортуючи файл UTF-8. Непрозорий, але корисний, якщо у вас вже є файл.

  1. Відкрийте Microsoft Excel 2007.
  2. Клацніть на пункт меню "Дані".
  3. Клацніть на піктограмі From Text.
  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. Я використовую для цього рішення - додавання BOM, TWICE. Для цього я двічі виконую таку команду 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.


1
під час виконання команди sed я отримую: "sed: invalid option -" I "", я думаю, що це повинно бути "i"
BiAiB

2

Це моє робоче рішення:

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

Ключ - Походження: = 65001


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 BOM повністю ігнорується. Тож якщо ви маєте намір написати код, який працює на всіх версіях Excel, ваш код не буде корисним.
Елмуе

2

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

На відміну від Microsoft, Google зумів підтримати файли csv UTF-8, тому він просто працює, щоб відкрити там файл. І експорт у формат excel також просто працює. Тож, хоча це може бути не кращим рішенням для всіх, воно досить безпечне, і кількість кліків не настільки велика, як це може звучати, особливо коли ви вже ввійшли в google.


2

Це не точно вирішує питання, але оскільки я натрапив на це, і вищезгадані рішення не працювали для мене або мали вимоги, яких я не міг задовольнити, ось ще один спосіб додати BOM, коли у вас є доступ до vim:

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

2

привіт, я використовую рубін на рейках для генерації csv. У нашій програмі ми плануємо розробити багатомовну мову (I18n), і ми зіткнулися з проблемою під час перегляду вмісту I18n у файлі CSV windows excel.

Було чудово з Linux (Ubuntu) та mac.

Ми визначили, що Windows excel потрібно знову імпортувати, щоб переглянути фактичні дані. Під час імпорту ми отримаємо більше варіантів вибору набору символів.

Але це не може бути освіченим для кожного користувача, тому рішення, яке ми шукаємо, - це відкрити лише подвійним клацанням миші.

Тоді ми визначили спосіб показу даних у відкритому режимі та 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 вставити BOM

f.писати бом

f.write (csv_file)

Windows та Mac

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

Linux (ubuntu)

Під час відкриття файлу запитайте параметри роздільника -> виберіть "TAB" введіть тут опис зображення


1

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

Моє рішення спочатку було відкрити файл за допомогою notpad ++ та change the encode to ASCII. Потім просто відкрив файл у excel і він працював як очікувалося.


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


0

Це старе питання, але я щойно стикався з подібною проблемою, і рішення може допомогти іншим:

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

Застосовуйте кодування UTF-8 під час створення StreamWriter. Це воно.

Приклад:

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

@elmue хочете трохи розробити? Невже виведення CSV з використанням правильного кодування для початку гарантує, що проблем із сумісністю з Excel пізніше в робочому процесі немає
Рекс

Код невірний, оскільки вам не потрібен output.Close (), якщо у вас є оператор using (). Крім цього, Excel CSV введення дуже примітивний. Я б його взагалі не використовував. Якщо ви хочете імпортувати в Excel, використовуйте замість цього таблицю HTML і відкрийте її в Excel.
Елму

Дякую за уточнення @Elmue - на жаль, я зіткнувся з низкою сценаріїв (включаючи файли на мережевих накопичувачах), де закриття потрібно явно , а також видалення. Не знайшов причину, чому, як я думаю, пам’ятаю, що бачив дзвінок Close()у Disposeстеку, але ми їдемо. Ви також неправильно ставитесь до того, що імпорт CSV є примітивним, оскільки він не потребує запропонованого вами неефективного підходу HTML. Насправді створення додаткових програмних кроків для прийняття текстових даних, перетворення в HTML, а потім перетягнення в Excel здається протилежним інтуїтивно зрозумілим
Rex

продовження ... Однак у різних сценаріях є різні вимоги, і мій приклад правильно показує, як вказати кодування так, як вимагає ОП
Rex

Будь ласка, прочитайте ще раз початкове запитання: "Я також спробував вказати UTF-8 BOM EF BB BF, але Excel це ігнорує." Я тестував те саме і дійшов до того ж результату: Excel НЕ розпізнає UTf8 BOM. Спробуй це! Напишіть файл CSV та додайте до нього грецькі чи російські графіки. Потім відкрийте це в Excel, і ви отримаєте гарбуз. Тож ваша відповідь нічого не вирішує.
Елмуе

0

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

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

Повернути інженеру SYLK просто неможливо, створивши просту електронну таблицю та зберігаючи її як SYLK, а потім читаючи її з текстовим редактором. Перший блок - це заголовки та стандартні формати чисел, які ви розпізнаєте (які ви просто повторюєте у кожному створеному вами файлі), тоді дані є просто координатою X / Y та значенням.


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);
}

Спочатку у мене був такий код, з яким акценти виглядають чудово в «Блокноті ++», але вони потрапляли в Excel:

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

Ваш пробіг може відрізнятися - я використовую .NET 4 та Excel від Office 365.


0

Робоче рішення для офісу 365

  • зберегти в UTF-16 (без ЛЕ, 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);

-1

Спочатку збережіть таблицю Excel як текст Unicode. Відкрийте файл TXT за допомогою Internet Explorer і натисніть «Зберегти як» TXT Encoding - виберіть відповідне кодування, тобто для Win Cyrillic 1251


-1

Я спробував усе, що міг знайти на цій темі, і подібне, нічого не працювало повноцінно. Однак імпорт до Google google аркушів та просто завантаження у форматі csv працювали як шарм. Спробуйте це, якщо ви прийшли до мого розчарування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.