¿Cómo puedo generar un CSV UTF-8 en PHP que Excel pueda leer correctamente?

Resuelto Ben Saufley asked hace 54 años • 26 respuestas

Tengo algo muy simple que simplemente genera algunas cosas en formato CSV, pero tiene que ser UTF-8. Abro este archivo en TextEdit o TextMate o Dreamweaver y muestra caracteres UTF-8 correctamente, pero si lo abro en Excel, en su lugar hace esta tontería. Esto es lo que tengo al principio de mi documento:

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

Todo esto parece tener el efecto deseado, excepto que Excel (Mac, 2008) no quiere importarlo correctamente. No hay opciones en Excel para "abrir como UTF-8" ni nada así, así que... me estoy molestando un poco.

Parece que no puedo encontrar ninguna solución clara a esto en ninguna parte, a pesar de que mucha gente tiene el mismo problema. Lo que más veo es incluir la lista de materiales, pero no sé exactamente cómo hacerlo. Como puede ver arriba, solo estoy echoingresando estos datos, no estoy escribiendo ningún archivo. Puedo hacerlo si es necesario, pero no lo hago porque no parece necesario en este momento. ¿Alguna ayuda?

Actualización: Intenté hacer eco de la lista de materiales echo pack("CCC", 0xef, 0xbb, 0xbf);que acabo de extraer de un sitio que intentaba detectar la lista de materiales. Pero Excel simplemente agrega esos tres caracteres a la primera celda cuando importa, y aún así confunde los caracteres especiales.

Ben Saufley avatar Jan 01 '70 08:01 Ben Saufley
Aceptado

Tengo el mismo (o similar) problema.

En mi caso, si agrego una lista de materiales a la salida, funciona:

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

Creo que este es un truco bastante feo, pero funcionó para mí, al menos para Excel 2007 Windows. No estoy seguro de que funcione en Mac.

Daniel Magliola avatar Dec 14 '2010 14:12 Daniel Magliola

Para citar a un ingeniero de soporte de Microsoft ,

Excel para Mac actualmente no es compatible con UTF-8

Actualización, 2017 : esto se aplica a todas las versiones de Microsoft Excel para Mac anteriores a Office 2016 . Las versiones más recientes (de Office 365) ahora admiten UTF-8.

Para generar contenido UTF-8 que Excel, tanto en Windows como en OS X, podrá leer correctamente, deberá hacer dos cosas:

  1. Asegúrese de convertir su texto CSV UTF-8 a UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    
  2. Asegúrese de agregar la marca de orden de bytes UTF-16LE al inicio del archivo.

    chr(255) . chr(254)
    

El siguiente problema que aparece sólo con Excel en OS X (pero no en Windows) será que al ver un archivo CSV con valores separados por comas, Excel representará filas solo con una fila y todo el texto junto con las comas en la primera fila.

La forma de evitar esto es utilizar tabulaciones como valor separado.

Utilicé esta función de los comentarios de PHP (usando pestañas "\t" en lugar de comas) y funcionó perfectamente en OS X y Windows Excel.

Tenga en cuenta que para solucionar un problema con una columna vacía como final de una fila, tuve que cambiar la línea de código que dice:

    $field_cnt = count($fields);

a

    $field_cnt = count($fields)-1;

Como dicen algunos de los otros comentarios en esta página, otras aplicaciones de hojas de cálculo como OpenOffice Calc, Numbers de Apple y Hoja de cálculo de Google Doc no tienen problemas con archivos UTF-8 con comas.

Consulte la tabla en esta pregunta para saber qué funciona y qué no funciona para archivos CSV Unicode en Excel.


Como nota al margen, podría agregar que si está utilizando Composer , debería considerar agregarlo League\Csva sus requisitos. League\Csvtiene una API realmente buena para crear archivos CSV .

Para usarlo League\Csvcon este método de creación de archivos CSV, consulte este ejemplo

Tim Groeneveld avatar May 27 '2013 04:05 Tim Groeneveld

En mi caso, lo siguiente funciona muy bien para hacer que un archivo CSV con caracteres UTF-8 se muestre correctamente en Excel.

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

El 0xEF 0xBB 0xBFencabezado de la lista de materiales le permitirá a Excel conocer la codificación correcta.

Codemole avatar Dec 26 '2017 18:12 Codemole