Как я могу вывести UTF-8 CSV на PHP, который Excel будет читать правильно?


191

У меня есть очень простая вещь, которая просто выводит некоторые вещи в формате CSV, но это должен быть UTF-8. Я открываю этот файл в TextEdit или TextMate или Dreamweaver, и он правильно отображает символы UTF-8, но если я открываю его в Excel, он делает это глупо - вместо этого. Вот что у меня есть во главе моего документа:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Кажется, что все это имеет желаемый эффект, за исключением того, что Excel (Mac, 2008) не хочет импортировать его должным образом. В Excel нет вариантов "открыть как UTF-8" или что-то в этом роде, так что ... я немного раздражен.

Кажется, я нигде не могу найти чёткого решения, несмотря на то, что у многих людей такая же проблема. Больше всего я вижу включение спецификации, но я не могу точно понять, как это сделать. Как вы можете видеть выше, я просто использую echoэти данные, я не пишу никаких файлов. Я могу сделать это, если мне нужно, просто нет, потому что на данный момент в этом нет необходимости. Любая помощь?

Обновление: я попытался повторить спецификацию, echo pack("CCC", 0xef, 0xbb, 0xbf);которую я только что извлек с сайта, который пытался обнаружить спецификацию. Но Excel просто добавляет эти три символа в самую первую ячейку при импорте и все еще портит специальные символы.


2
Excel не предоставляет возможность настроить набор символов входящего файла? Вы на 100% уверены в этом? У меня нет под рукой копии, поэтому я не могу попробовать, но я предполагаю, что где-то должен быть выпадающий список.
Пекка

Это Excel на Mac - он кажется более ограниченным, чем Excel на ПК. В диалоговом окне «Открыть» нет раскрывающихся списков, кроме того, какие типы файлов можно открывать. Я смотрел везде. Если это там, это неясно. Я бы сказал, 98% уверен.
Бен Сауфли

Офис Microsoft или openoffice?
Ajreal

Microsoft лучше в этом отношении, я не нашел (как я нашел) способ заставить OpenOffice обнаруживать кодировку, даже не спецификацию. Слей это.
Ciantic

Спецификация также не влияет на Microsoft Excel 2008 для Mac.
Бен Сауфли

Ответы:


134

По словам инженера службы поддержки Microsoft ,

Excel для Mac в настоящее время не поддерживает UTF-8

Обновление, 2017 : Это относится ко всем версиям Microsoft Excel для Mac до Office 2016 . Более новые версии (из Office 365) теперь поддерживают UTF-8.

Чтобы вывести содержимое UTF-8, которое Excel сможет успешно читать как в Windows, так и в OS X, вам нужно сделать две вещи:

  1. Убедитесь, что вы конвертировали текст UTF-8 CSV в UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. Убедитесь, что вы добавили метку порядка байтов UTF-16LE в начало файла

    chr(255) . chr(254)

Следующая проблема, которая появляется только в Excel в OS X (но не в Windows), заключается в том, что при просмотре CSV-файла со значениями, разделенными запятыми, Excel будет отображать строки только с одной строкой и весь текст вместе с запятыми в первой строке.

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

Я использовал эту функцию из комментариев PHP (используя вкладки "\ t" вместо запятых), и она отлично работала на OS X и Windows Excel.

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

    $field_cnt = count($fields);

в

    $field_cnt = count($fields)-1;

Как отмечают некоторые другие комментарии на этой странице, другие приложения для работы с электронными таблицами, такие как OpenOffice Calc, собственные номера Apple и электронная таблица Google Doc, не имеют проблем с файлами UTF-8 с запятыми.

Смотрите таблицу в этом вопросе о том, что работает и не работает для файлов Unicode CSV в Excel


В качестве дополнительного примечания я мог бы добавить, что если вы используете Composer , вы должны взглянуть на добавление League\Csvк своим требованиям. League\Csvимеет действительно хороший API для создания CSV-файлов .

Чтобы использовать League\Csvэтот метод создания файлов CSV, посмотрите этот пример


1
Называй меня глупым, но я не могу заставить это работать. Я преобразовал свои данные с помощью функции mb_convert_encoding и вывел спецификацию, предшествующую содержимому файла, но при открытии файла в Excel я получаю только одну строку китайских символов. Сейчас я все еще использую запятые, а не вкладки, но, вероятно, это не должно вызывать то, что я вижу.
Джон Рикс,

@JohnRix это странно. Этот код буквально решил все проблемы, которые у меня когда-либо были с экспортом CSV-файлов, за исключением импортеров, которые принимают только запятые. Не могли бы вы выслать мне вставку кода, который вы используете, вместе с массивом, который вы превращаете в CSV, и копию экспортированного файла?
Тим Греневельд

2
Это решение также решило проблему UTF8 для меня на Mac и Windows. Я также обнаружил, что добавление строки с sep=;или sep=,в файл CSV говорит Excel, как отделить CSV и столбцы будут созданы снова правильно.
Люк Волланц

5
Я обнаружил, что все получилось искаженным, если я начал строку как просто спецификацию, затем в другой строке добавил "sep=,\n", а затем в другой строке добавил данные. Все было хорошо, если бы я делал все это в одну строку ( $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');). Теперь все выглядит отлично на Mac. У меня нет Windows для тестирования.
Тремби

2
Единственное, что полностью сработало для меня. Несогласованность Microsoft не перестает меня удивлять. При сохранении обычного CSV-файла в качестве разделителя используется «,», но если есть спецификация, то по какой-то причине он сохраняет «\ t». C в .csv означает "COMMA", черт возьми. Это действительно не сложно сделать.
Фил

288

У меня такая же (или похожая) проблема.

В моем случае, если я добавлю спецификацию к выводу, она будет работать:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

Я считаю, что это довольно уродливый хак, но он работал для меня, по крайней мере, для Excel 2007 Windows. Не уверен, что это будет работать на Mac.


10
Уродливо, но очень полезно. Спасибо.
Абелито

7
Я почти уверен, что это не очень хорошо работает на OS X, к сожалению. Я думаю, что это может фактически отображать спецификацию при импорте (предупреждение: смутные воспоминания.)
davidtbernal

2
Это верно. По крайней мере, я попытался добавить предисловие к спецификации, как в примере выше, но на самом деле он просто показывал некоторые забавные символы в начале и продолжал неправильно отображать специальные символы (протестировано в Excel 2011). Мне показалось, что это лучше всего работает во всех настройках: stackoverflow.com/a/1648671/1005334 (с использованием PHP).
Казимир

4
Я продолжаю получать предупреждения по этому вопросу, потому что, очевидно, многие другие люди натыкаются на него. Хотелось бы пометить это как правильное, потому что за него проголосовали. К сожалению, я наконец-то дал этому решению шанс (давно забросил этот проект), и он не работает для меня в Excel 2008 для Mac. Рад, что это работает для вас. Я проголосовал за решение. Но это не решает проблему Excel для Mac 2008. Если кому-то повезет на Mac, обязательно дайте мне (и, видимо, всем ) знать.
Бен Сауфли

Прекрасно работает вывод файла CSV в MS Excel Starter 2010. Большое спасибо!
Джейми Декстер

32

Вот как я это сделал (чтобы побудить браузер загрузить файл csv):

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

Единственное, что исправило проблему с кодировкой UTF8 в предварительном просмотре CSV, когда вы нажимаете пробел на Mac ... но не в Excel Mac 2008 ... не знаю почему


1
Строка кода UTF-8 кода спасает мой день с экспортом в xls
Mladen Janjetovic

7
Я искал способ вывода непосредственно в браузер как utf8, когда я наткнулся на этот пост, вот мое решение с кредитами на этот пост для спецификации и заголовка двоичного переноса. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
фырье

Опечатка - убери двойник )).
Sitilge

22

Я просто имел дело с той же проблемой и придумал два решения.

  1. Используйте класс PHPExcel в соответствии с предложением bpeterson76 .

    • С помощью этого класса создается наиболее широко совместимый файл, и мне удалось создать файл из данных в кодировке UTF-8, которые прекрасно открывались в Excel 2008 Mac, Excel 2007 Windows и Google Docs.
    • Самая большая проблема с использованием PHPExcel заключается в том, что он медленный и использует много памяти, что не является проблемой для файлов разумного размера, но если ваш файл Excel / CSV имеет сотни или тысячи строк, эта библиотека становится непригодной для использования .
    • Вот метод PHP, который берет некоторые данные TSV и выводит файл Excel в браузер, обратите внимание, что он использует Writer Excel5, что означает, что файл должен быть совместим с более старыми версиями Excel, но у меня больше нет доступа к ним, поэтому я не могу их проверить.

      function excel_export($tsv_data, $filename) {
          $export_data = preg_split("/\n/", $tsv_data);
          foreach($export_data as &$row) {
              $row = preg_split("/\t/", $row);
          }
      
          include("includes/PHPExcel.php");
          include('includes/PHPExcel/Writer/Excel5.php');
      
          $objPHPExcel = new PHPExcel();          
      
          $objPHPExcel->setActiveSheetIndex(0);
          $sheet = $objPHPExcel->getActiveSheet();
          $row = '1';
          $col = "A";
          foreach($export_data as $row_cells) {
              if(!is_array($row_cells)) { continue; }
                  foreach($row_cells as $cell) {
                      $sheet->setCellValue($col.$row, $cell);
                      $col++;
                  }
              $row += 1;
              $col = "A";
          }
      
          $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
          header('Content-Type: application/vnd.ms-excel');
          header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
          header('Cache-Control: max-age=0');
          $objWriter->save('php://output');   
          exit;   
      }
  2. Из-за проблем с эффективностью PHPExcel мне также пришлось выяснить, как создать файл CSV или TSV, совместимый с UTF-8 и Excel.

    • Лучшее, что я мог придумать, - это файл, совместимый с Excel 2008 Mac и ПК Excel 2007, но не Google Docs, что достаточно для моего приложения.
    • Я нашел решение здесь , в частности, этот ответ , но вы также должны прочитать принятый ответ, поскольку он объясняет проблему.
    • Вот код PHP, который я использовал, обратите внимание, что я использую данные TSV (табуляции в качестве разделителей вместо запятых):

      header ( 'HTTP/1.1 200 OK' );
      header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Content-Type: application/vnd.ms-excel') ;
      header ( 'Content-Disposition: attachment;filename=export.csv' );
      print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
      exit;

я сталкиваюсь с той же проблемой в Windows-7 Excel 2007 и попробовал все предложения, но не смог :(
PHP Ferrari

Решение UTF-16LE - это то, что сработало. Обратите внимание, что вы должны правильно отформатировать tsv, и это должен быть tsc, поэтому табуляция разделена, а не запятая. Смотрите также сообщение Марка здесь: stackoverflow.com/a/1648671/1697370
Эллерт ван Коперен

17

У меня была та же проблема, и она была решена, как показано ниже:

    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=utf-8' );
    header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    $df = fopen( 'php://output', 'w' );

    //This line is important:
    fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

    foreach ( $rows as $row ) {
        fputcsv( $df, $row );
    }
    fclose($df);
    exit();

13

Excel не поддерживает UTF-8. Вы должны закодировать свой текст UTF-8 в UCS-2LE.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

3
Лучше использовать UTF-16LE, как предложено выше, который охватывает все существующие символы.
Эллерт ван Коперен

Я заметил, что это mb_convert_encoding работает нормально и правильно показывает диакритические знаки в моем экспортированном файле XLS. У меня есть настройки по умолчанию mysql и apache + php для работы с utf-8
Junior Mayhé

10

В моем случае следующее очень хорошо работает, чтобы CSV-файл с символами UTF-8 правильно отображался в Excel.

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

0xEF 0xBB 0xBFЗаголовок BOM позволит Excel знать правильную кодировку.


1
большой для тебя, братан <3
Adrien G

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- это именно то, что мне было нужно. Работает как часы.
Алекс

8

Чтобы следить за этим:

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

Так что ... кажется, нет правильного ответа на это. Спасибо за все предложения.

Я бы сказал, что из всего, что я прочитал, предложение @Daniel Magliola о спецификации, вероятно, будет лучшим ответом для какого-либо другого компьютера. Но это все еще не решает мою проблему.


Поскольку поддержка UTF8 несовместима между Mac и Windows, лучше всего использовать другую кодировку. Я обнаружил, что cp1252 в целом хорошо работает с Microsoft. en.wikipedia.org/wiki/Windows-1252
s29

1
Бен, есть правильный ответ на этот вопрос :) Смотри мой!
Тим Гроенвельд

7

Это отлично работает в Excel как для Windows, так и для Mac OS.

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

function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}

это решение позволило мне сделать экспорт работающим и для Google Sheets (некоторые другие не сработали)
Cafn

6

Файл CSV должен содержать метку порядка байтов.

Или, как предложено, и просто обойти его с помощью HTTP-тела


5

Добавить:

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

Или:

fprintf($file, "\xEF\xBB\xBF");

Перед записью любого контента в файл CSV.

Пример:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);

4

Поскольку кодировка UTF8 не очень хорошо работает с Excel. Вы можете преобразовать данные в другой тип кодирования, используя iconv().

например

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),

Это было единственное решение, которое работало для меня с Excel Mac 2011
Кристер Фернстром,

3

Преобразование уже зашифрованного текста utf-8 с использованием mb_convert_encodingне требуется. Просто добавьте три символа перед исходным контентом:

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

Для меня это решило проблему специальных символов в CSV-файлах.


Невероятно; Я попробовал по крайней мере 10 других решений, и единственное решение для меня, кажется, это, когда объединено с UTF-8 BOM через fputs.
Каарто

2

Когда я исследовал и обнаружил, что UTF-8 не работает хорошо на MAC и Windows, поэтому я попробовал с Windows-1252, он хорошо поддерживает их обоих, но вы должны выбрать тип кодировки в Ubuntu. Вот мой код$valueToWrite = mb_convert_encoding($value, 'Windows-1252');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

2
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($filename, $headings, $data) {

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
    exit;
}

2
Как правило, ответы гораздо полезнее, если они включают в себя объяснение того, для чего предназначен код, и почему это решает проблему, не представляя других.
Тим Дикманн

1

Как насчет вывода на сам Excel? Это отличный класс, который позволяет создавать файлы XLS на стороне сервера. Я часто использую его для клиентов, которые не могут «выяснить» CSV и до сих пор никогда не жаловались. Он также допускает дополнительное форматирование (затенение, высоту строк, вычисления и т. Д.), Которое csv никогда не будет делать.


Имейте в виду, что phpexcel имеет проблемы с большим количеством данных.
Эллерт ван Коперен

1

Вы можете конвертировать вашу строку CSV с помощью iconv . например:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );


1

Вы должны использовать кодировку «Windows-1252».

header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");

Может быть, вы должны преобразовать свои строки:

private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}

1

Вы можете добавить 3 байта в файл перед экспортом, это работает для меня. До этого система работала только в Windows и HP -UX, но не работала в Linux.

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

Иметь UTF-8 BOM (3 байта, шестнадцатеричный EF BB BF) в начале файла. В противном случае Excel будет интерпретировать данные в соответствии с кодировкой по умолчанию для вашей локали (например, cp1252) вместо utf-8.

Генерация CSV-файла для Excel, как создать новую строку внутри значения


1

Я на Mac, в моем случае мне просто нужно было указать разделитель "sep=;\n"и кодировать файл в UTF-16LE следующим образом:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');

1

Для меня ни одно из вышеприведенных решений не сработало. Вот что я сделал, чтобы решить проблему: измените значение с помощью этой функции в коде PHP:

$value = utf8_encode($value);

Эти выходные данные правильно отображаются в листе Excel.


0

У меня была такая же проблема, когда у меня была подпрограмма Excel VBA, которая импортировала данные. Поскольку CSV - это простой текстовый формат, я работал над этим, программно открывая данные в простом файловом редакторе, таком как WordPad, и снова сохраняя их как текст в формате Unicode, или копируя их в буфер обмена и вставляя их в Excel. Если Excel автоматически не анализирует CSV в ячейки, это легко исправить с помощью встроенной функции «Текст в столбцы».


Я попробовал это! Но он уже закодирован как текст Unicode… сохранение его как текста Unicode ничего не меняет. Как бы я сохранил его в виде простого текста без неправильной интерпретации всех специальных символов?
Бен Сауфли

Я думаю, что «сохранив его как текст Unicode», Ален может означать «UTF-16LE». Windows часто (к сожалению) использует «Unicode» для неправильной ссылки на UTF-16LE или UTF-16LE с ведущей спецификацией. Файл Notepad -> Сохранить диалог использует «Юникод» таким образом.
Танатос

0

Проблема все еще возникает, когда вы сохраняете его как файл .txt и открываете его в Excel с запятой в качестве разделителя?

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


Насколько я знаю, форматирование CSV в порядке. Я могу сделать «идеальный» CSV в TextEdit, без проблем, или даже переименовать txt в csv, так что в нем нет ничего секретного - CSV - это просто текстовые файлы. Кроме того, форматирование в Excel идеально, просто ломаются специальные символы. Но на всякий случай я попробовал ваше предложение, и, к сожалению, оно вызывает те же проблемы.
Бен Сауфли

Из отдела «WTF они думали»: знайте, что согласно Microsoft правильный разделитель полей зависит от локали. Файл с разделением запятыми может потребовать, чтобы в некоторых локалях поля были фактически разделены точкой с запятой - и вы ничего не можете сделать, кроме как предложить OpenOffice
djn

это довольно безумно - к сожалению, у меня нет проблем с разделением полей. У меня просто проблемы с этими специальными персонажами.
Бен Сауфли

0

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

Я пробовал много иконок, но не смог заставить работать немецкие умлауты в Mac Excel 2004. Одно из решений: PHPExcel. Это здорово, но для моего проекта это слишком много. Для меня работает создание файла csv и преобразование этого файла csv в xls с помощью этого PHPsnippet: csv2xls . результат xls работает с превосходными немецкими умлаутами (ä, ö, Ü, ...).


0

Я только что попробовал эти заголовки и получил Excel 2013 на ПК с Windows 7, чтобы правильно импортировать файл CSV со специальными символами. Byte Order Mark (BOM) был последним ключом, который заставил его работать.

    заголовок ('Content-Encoding: UTF-8');
    заголовок ('Content-type: text / csv; charset = UTF-8');
    заголовок («Content-disposition: attachment; filename = filename.csv»);
    заголовок («Pragma: public»);
    заголовок («Истекает: 0»);
    echo "\ xEF \ xBB \ xBF"; // UTF-8 BOM


Да, это правильно, он будет работать правильно в Excel для Windows, но, как объяснено в моем ответе, он не будет работать в Excel для OS X.
Тим Гроенвельд

0

В противном случае вы можете:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);

0

ЛЕГКОЕ решение для Mac Excel 2008: я боролся с этим много раз, но вот мое простое решение: откройте файл .csv в Textwrangler, который должен правильно открыть ваши символы UTF-8. Теперь в нижней строке состояния измените формат файла с «Unicode (UTF-8)» на «Western (ISO Latin 1)» и сохраните файл. Теперь перейдите в Mac Excel 2008 и выберите «Файл»> «Импорт»> «Выбрать CSV»> «Найти свой файл»> в поле «Источник файла» выберите «Windows (ANSI)» и вуаля, символы UTF-8 будут отображаться правильно. По крайней мере, это для меня ...


0

Я использую это, и это работает

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;

0

#output UTF-8 CSV в PHP, который Excel будет читать правильно.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';

Достаточно одного ответа на человека. В будущем помните, что вы можете добавить информацию к своему ответу в любое время, вам не нужно создавать 2
RiggsFolly

-1
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));

Этот вопрос не спрашивает, как конвертировать, он спрашивает, как выводить. Соответствующая часть этого вклада, выводимая в UTF-16, уже внесена в Избранный ответ .
Бен Сауфли

@BenSaufley Хорошо, но это решает проблему вопроса с 2 простыми строками кода
b3wii

Вопрос уже решен, и более подробно объяснен.
Бен Сауфли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.