2011-03-20 55 views
15
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(); 

lo que estoy haciendo en el archivo de Excel es Désçàuicabecera php Excel y UTF-8

Sin embargo, me pongo Désçàui cuando intento

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

Cualquier expertos de ayuda?

PS. El archivo se guarda en DW con Título/Codificación Unicode (Utf-8).

+2

Una entidad sólo puede tener un tipo de contenido. – Gumbo

+1

No creo que tenga sentido proporcionar un atributo * charset * para un tipo MIME que ni siquiera sea de texto. –

+2

¿Desde cuándo un bloque de texto plano se considera un archivo de Excel? –

Respuesta

17

No estoy seguro, pero es posible que Excel no pueda manejar utf8 (puede depender de la versión). Pero puede manejar utf16, así que intente convertir el juego de caracteres. Esto funciona para mí (en excel2002):

echo mb_convert_encoding('Désçàui','utf-16','utf-8'); 
+3

Esto funcionó, gracias doctor. –

2

Los encabezados content-type son relevantes solo para el navegador. No tienen ningún efecto en los archivos descargados. Una vez que se guarda el archivo, depende de la aplicación decidir cómo trata los datos en el archivo.

En primer lugar, el ejemplo que muestra no es un archivo Excel válido. Cuando encuentre lo que debe pensar es un archivo roto, Excel probablemente cambie a un procesamiento predeterminado que asume windows-1252 o algún otro juego de caracteres de un solo byte.

Tendría que darle a Excel un archivo apropiado para abrir. Alternativamente, puede ser posible utilizar el viejo truco "Salir HTML pero guardar como XLS" y especificar una codificación UTF-8 en ese archivo HTML.

+0

Hola, ¿podría decirme cómo se crea el archivo Excel? Gracias Unicornio. –

+2

@Jeremy Roy - Hay varias bibliotecas que le permiten crear archivos Excel reales desde PHP. Personalmente, recomendaría PHPExcel –

+0

@Unicorn ¿Podría vincular un ejemplo con esa solución fea (pero funcional)? Estoy hablando de generar un archivo HTML pero descargarlo como xls. Gracias –

15

Fuente http://www.mwasif.com/2007/5/download-data-csv-using-php/

solución funcionó para mí

danesa Zahur dijo,

7 de octubre de de 2009 a las 19:23

Si sus contenidos están en formato UTF-8, entonces no es necesario convertir la codificación. Simplemente inicie su secuencia de archivo/salida con la BOM UTF-8 después de los encabezados.

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

Y encabezado debe contener la codificación UTF-8

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

Funcionará como encanto porque Excel reconocerá charset archivo con bytes de lista de materiales.

+1

¡No puedo entender cómo FUNCIONA REALMENTE! ¡¡Gracias!! –

+0

Increíble amigo, funciona – b1919676

14

No sé cómo está generando el archivo de Excel.Pero, si lo haces desde una salida HTML, puede simplemente añadir lo siguiente en el inicio:

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

Saludos

2

conversión de UTF-8 a html-entidades trabajaron muy bien para mí:

$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 ; 
6

Este UTF-8 línea de lista de materiales de código hizo que mis UTF-8 caracteres funcionan bien:

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; 
+1

Esta es la única solución que funciona como una brisa con Excel 2016. ¡Gracias Mladen Janjetovic! – theking2

1

probar este

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

Prueba esto:

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