php header excel и utf-8 - PullRequest
       4

php header excel и utf-8

20 голосов
/ 20 марта 2011
ob_start();

echo 'Désçàui';

header("Content-Type:   application/vnd.ms-excel; charset=utf-8");
header("Content-type:   application/x-msexcel; charset=utf-8");
header("Content-Disposition: attachment; filename=Test.xls"); 
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); 

ob_end_flush();

То, что я получаю в файле Excel, это Désçà ui

Тем не менее, я получаю Désçàui, когда я пытаюсь

ob_start();
echo 'Désçàui';
header("Content-Type:   text/html; charset=utf-8");
ob_end_flush();

Есть ли какие-нибудь эксперты?

PS. Файл сохраняется в формате DW с заголовком / кодировкой Unicode (Utf-8).

Ответы [ 8 ]

20 голосов
/ 18 апреля 2012

Я не знаю, как вы генерируете файл Excel.Но, если вы делаете это из вывода HTML, вы можете просто добавить следующее в начале:

<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />

С уважением

20 голосов
/ 12 мая 2011

Источник http://www.mwasif.com/2007/5/download-data-csv-using-php/

Решение сработало для меня

Даниель Захур сказал,

7 октября 2009 г., 19:23

Если ваше содержимое имеет формат UTF-8, то нет необходимости преобразовывать кодировку. Просто запустите ваш файл / поток вывода с UTF-8 BOM после заголовков.

echo pack("CCC",0xef,0xbb,0xbf);

И заголовок должен содержать кодировку UTF-8

header( "Content-type: application/vnd.ms-excel; charset=UTF-8" );

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

18 голосов
/ 20 марта 2011

Я не уверен, но может случиться так, что excel не справится с utf8 (может зависеть от версии). Но он может обрабатывать utf16, поэтому попробуйте преобразовать кодировку. Это работает для меня (в Excel2002):

echo mb_convert_encoding('Désçàui','utf-16','utf-8');
9 голосов
/ 28 марта 2014

Эта строка кода UTF-8 заставила мои символы UTF-8 работать нормально:

 header("Content-type: application/vnd.ms-excel");
 header("Content-Disposition: attachment; filename='".$file_name."'");
 header("Pragma: no-cache");
 header("Expires: 0");
 echo "\xEF\xBB\xBF"; //UTF-8 BOM
 echo $out;
3 голосов
/ 20 марта 2011

Заголовки content-type актуальны только для браузера.Они не влияют на загружаемые файлы.Как только файл сохранен, приложение самостоятельно решает, как оно будет обрабатывать данные в файле.

Приведенный пример не является допустимым файлом Excel.Когда встречается то, что он считает поврежденным файлом, Excel, вероятно, переключается на какую-то обработку по умолчанию, которая предполагает windows-1252 или какой-либо другой однобайтовый набор символов.

Вы должны предоставить Excel правильный файл для открытия.В качестве альтернативы можно использовать старый трюк «Вывод HTML, но сохранить как XLS» и указать кодировку UTF-8 в этом файле HTML.

2 голосов
/ 22 апреля 2013

Преобразование utf8 в html-сущности работало для меня очень хорошо:

$str = 'utf-string ...';
if (mb_detect_encoding($str ) == 'UTF-8') {
   $str = mb_convert_encoding($str , "HTML-ENTITIES", "UTF-8");
}

header('Content-type: application/x-msdownload; charset=utf-16');
header('Content-Disposition: attachment; filename=companies.xls');
header('Pragma: no-cache');
header('Expires: 0');

echo $str ; 
1 голос
/ 13 сентября 2014

попробуйте

<?php
header("Content-Type: application/vnd.ms-excel");
header('Content-Disposition: attachment; filename="sample.xls"');
echo "
    <html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">
    <html>
        <head><meta http-equiv=\"Content-type\" content=\"text/html;charset=utf-8\" /></head>
        <body>
";

echo "
    <table>
      <tr>
        <th rowspan=\"2\" nowrap=\"nowrap\">เลขที่บัญชี</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">ชื่อ-สกุล ลูกค้า</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">OS/Balance</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">วันที่</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">เวลา</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">Action Code</th>
        <th rowspan=\"2\" nowrap=\"nowrap\">Amount</th>
        <th colspan=\"5\" nowrap=\"nowrap\">ผลการติดตาม</th>
      </tr>
      <tr>
        <th nowrap=\"nowrap\">ที่อยู่บ้าน</th>
        <th nowrap=\"nowrap\">เบอร์โทรบ้าน</th>
        <th nowrap=\"nowrap\">เบอร์โทรมือถือ</th>
        <th nowrap=\"nowrap\">ที่อยู่ที่ทำงาน</th>
        <th nowrap=\"nowrap\">เบอร์โทรที่ทำงาน</th>
      </tr>
      <tr>
        <td>acc</td>
        <td>name</td>
        <td>balance</td>
        <td>date</td>
        <td>time</td>
        <td>code</td>
        <td>amount</td>
        <td>h-addr</td>
        <td>h-tel</td>
        <td>cell</td>
        <td>w-addr</td>
        <td>w-tel</td>
      </tr>
    </table>
";

echo "</body></html>";

?>
0 голосов
/ 13 декабря 2017

Попробуйте это:

header('Content-Transfer-Encoding: binary');
header("Content-Type: application/octet-stream"); 
header("Content-Transfer-Encoding: binary"); 
header('Expires: '.gmdate('D, d M Y H:i:s').' GMT'); 
header('Content-Disposition: attachment; filename = "Export '.date("Y-m-d").'.xls"'); 
header('Pragma: no-cache'); 

//these characters will make correct encoding to excel 
echo chr(255).chr(254).iconv("UTF-8", "UTF-16LE//IGNORE", $out); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...