Microsoft Excel управляет диакритикой в ​​CSV файлах?

Я программно экспортирую данные (используя PHP 5.2) в тестовый файл .csv.
Пример данных: Numéro 1 (обратите внимание на акцент e). Данные utf-8 (без предварительной спецификации).

Когда я открываю этот файл в MS Excel, отображается как Numéro 1.

Я могу открыть это в текстовом редакторе (UltraEdit), который отображает его правильно. UE сообщает, что символ decimal 233.

Как я могу экспортировать текст в файл .csv, поэтому , который MS Excel будет правильно отображать, желательно, не заставляя использовать мастер импорта, настройки мастера по умолчанию?

Ответ 1

Правильно отформатированный файл UTF8 может иметь 1 Если эта спецификация не существует, потребителю/читателю остается указать тип кодировки текста. Читатели, не совместимые с UTF8, будут считывать байты как некоторую другую кодировку, такую ​​как Windows-1252, и отображать символы  в начале файла.

Известна ошибка, при которой Excel при открытии файлов CSV UTF8 через ассоциацию файлов предполагает, что они находятся в однобайтовой кодировке, игнорируя наличие спецификации UTF8. Это может быть не фиксировано с помощью любой кодовой страницы или языковой настройки по умолчанию. Спецификация не будет отображаться в Excel - это просто не сработает. (Отчет меньшинства утверждает, что спецификация иногда запускает мастер "Импорт текста".) Эта ошибка, похоже, существует в Excel 2003 и ранее. Большинство отчетов (среди ответов здесь) говорят, что это исправлено в Excel 2007 и новее.

Обратите внимание, что вы можете всегда * правильно открывать файлы CSV UTF8 в Excel с помощью мастера "Импорт текста", который позволяет вам указать кодировку файла, который вы открываете. Конечно, это гораздо менее удобно.

Читатели этого ответа, скорее всего, находятся в ситуации, когда они особо не поддерживают Excel < 2007, но отправляют необработанный текст UTF8 в Excel, что неверно интерпретирует его и разбрасывает текст текстом Ã и другими аналогичными символами Windows-1252. Добавление спецификации UTF8, вероятно, является вашим лучшим и быстрым решением.

Если вы застряли с пользователями из старых Excel, а Excel является единственным потребителем ваших CSV, вы можете обойти это, экспортировав UTF16 вместо UTF8. Excel 2000 и 2003 будут дважды щелкнуть - откройте их правильно. (Некоторые другие текстовые редакторы могут иметь проблемы с UTF16, поэтому вам, возможно, придется тщательно взвешивать свои варианты.)


* За исключением случаев, когда вы не можете (по крайней мере) Excel 2011 для Mac Import Wizard на самом деле не всегда работает со всеми кодировками, независимо от того, что вы ему рассказываете. </анекдотическая очевидность > :)Суб >

Ответ 2

Предварительная подготовка спецификации (\ uFEFF) работала для меня (Excel 2007), в которой Excel распознал файл как UTF-8. В противном случае сохраните его и используйте мастер импорта, но он менее идеален.

Ответ 3

Ниже приведен код PHP, который я использую в своем проекте при отправке Microsoft Excel пользователю:

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

ОБНОВЛЕНО: Улучшение имени файла и исправление ошибок с ошибкой BUG. Благодаря TRiG и @ivanhoe011

Ответ 4

выберите во время импорта UTF-8. если вы используете Office 2007, это вы выбрали: сразу после открытия файла.

http://s4.tinypic.com/mv1bhi.jpg

Ответ 5

Ответ для всех комбинаций версий Excel (2003 + 2007) и типов файлов

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

Например, добавление символа спецификации вводит проблемы с автоматическим распознаванием разделителей столбцов, но не с каждой версией Excel.

Есть 3 переменные, которые определяют, работает ли она в большинстве версий Excel:

  • Кодировка
  • Наличие символа спецификации
  • Отделитель ячейки

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

Ты мне не веришь? Я тоже не хотел бы, но читал здесь и плакал: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator

Ответ 6

Спецификация Echo UTF-8 перед выдачей CSV-данных. Это устраняет все проблемы с символами в Windows, но не работает для Mac.

echo "\xEF\xBB\xBF";

Он работает для меня, потому что мне нужно сгенерировать файл, который будет использоваться только на ПК с ОС Windows.

Ответ 7

UTF-8 не работает для меня в офисе 2007 без какого-либо пакета обновления, с или без спецификации (U + ffef или 0xEF, 0xBB, 0xBF, не работает) установка sp3 делает работу UTF-8 при добавлении 0xEF, 0xBB, 0xBF.

UTF-16 работает при кодировании в python с использованием "utf-16-le" с 0xff 0xef BOM добавлен и используется вкладка в качестве разделителя. Мне пришлось вручную выписать спецификацию, а затем использовать "utf-16-le", а не "utf-16", иначе каждый encode() добавляет спецификацию к каждой строке, выписанной появился как мусор в первом столбце второй строки и после.

не может определить, будет ли UTF-16 работать без установки sp, поскольку Я не могу вернуться. Вздох

Это на windows, dunno о офисе для MAC.

для обоих рабочих случаев, импорт работает при запуске загрузки непосредственно из браузер и мастер импорта текста не работают, он работает так, как вы ожидали.

Ответ 8

Как сказал Fregal,\uFEFF - это путь.

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>

Ответ 9

Вы можете сохранить html файл с расширением "xls", и акценты будут работать (как минимум до 2007 года).

Пример: сохраните его (используя Save As utf8 в Блокноте) в качестве test.xls:

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>

Ответ 10

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

Мой воспроизводимый опыт: Введите Old MacDonald had a farm,ÈÌÉÍØ в Блокнот, нажмите "Enter", затем "Сохранить как" (используя опцию UTF-8).

Используя Python, чтобы показать, что на самом деле там:

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

Хорошо. Блокнот поставил переднюю панель спецификации.

Теперь перейдите в Проводник Windows, дважды щелкните по имени файла или щелкните правой кнопкой мыши и используйте "Открыть с...", а вверх появится окно Excel (2003) с отображением, как ожидалось.

Ответ 11

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

Ответ 12

Это просто вопрос кодировки символов. Похоже, что вы экспортируете свои данные как UTF-8: é в UTF-8 является двухбайтовой последовательностью 0xC3 0xA9, которая при интерпретации в Windows-1252 равна Ã ©. Когда вы импортируете свои данные в Excel, обязательно сообщите, что кодировка символов, которую вы используете, - UTF-8.

Ответ 13

Написание спецификации к выходному CSV файлу действительно работало для меня в Django:

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

Для получения дополнительной информации http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Спасибо, ребята!

Ответ 14

Другим решением, которое я нашел, было просто для кодирования результата в виде кода Windows Code 1252 (Windows-1252 или CP1252). Это было бы сделано, например, путем установки Content-Type соответствующим образом на что-то вроде text/csv; charset=Windows-1252 и аналогичным образом настроить кодировку символов потока ответов.

Ответ 15

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

Какой язык вы используете? если это .Net, вам нужно использовать Encoding.Default при создании файла.

Ответ 16

Формат CSV реализуется как ASCII, а не unicode, в Excel, что приводит к диакритике. Мы столкнулись с той же проблемой, с которой я выяснил, что официальный стандарт CSV был определен как ASCII-based в Excel.

Ответ 17

Excel 2007 правильно читает UTF-8 с BOM (EF BB BF), закодированным csv.

Excel 2003 (и, возможно, ранее) читает UTF-16LE с BOM (FF FE), но с TAB вместо запятых или точек с запятой.

Ответ 18

Я могу получить только CSV для правильного анализа в Excel 2007 в виде малоразмерного UTF-16 с разделителями табуляции, начиная с соответствующей отметки порядка байтов.

Ответ 19

С Ruby 1.8.7 я кодирую каждое поле в UTF-16 и удаляю BOM (возможно).

Следующий код извлекается из active_scaffold_export:

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

Важная строка:

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]

Ответ 20

Я нашел способ решить проблему. Это неприятный взлом, но он работает: откройте документ с Open Office, затем сохраните его в любом формате excel; в результате .xls или .xlsx будут отображаться подчеркнутые символы.

Ответ 21

Если у вас есть устаревший код в vb.net, как у меня, следующий код работал у меня:

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()

Ответ 22

открыть файл csv с помощью notepad ++ clic на Encode, выберите преобразование в UTF-8 (не конвертируйте в UTF-8 (без спецификации)) Сохранить открытый двойным кликом с отличным Надеюсь, что помощь Кристоф ГРИЗОН