Saltar al contenido

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

Al fin después de mucho batallar pudimos hallar la solución de esta incógnita que ciertos lectores de esta web han tenido. Si deseas compartir algo no dejes de compartir tu conocimiento.

Solución:

Tengo el mismo (o similar) problema.

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

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "xEFxBBxBF"; // 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.

Para citar a un ingeniero de soporte de Microsoft,

Excel para Mac actualmente no es compatible con UTF-8

Actualización, 2017: Esto es true de todas las versiones de Microsoft Excel para Mac anteriores oficina 2016. Las versiones más nuevas (de Office 365) ahora son compatibles con UTF-8.

Para generar contenido UTF-8 que Excel tanto en Windows como en OS X podrá leer con éxito, 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 solo con Excel en OS X (pero no Windows) será cuando vea 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 usar tabulaciones como su valor separado.

Usé esta función de los comentarios de PHP (usando las 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 la hoja de cálculo de Google Doc no tienen problemas con los archivos UTF-8 con comas.

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


Como nota al margen, podría agregar que si está utilizando Composer, debería echar un vistazo a agregar LeagueCsv a su requiere. LeagueCsv tiene una API realmente agradable para crear archivos CSV.

Usar LeagueCsv con este método de creación de archivos CSV, consulte este ejemplo

Así es como lo hice (para solicitar al navegador que descargue el archivo 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 "xEFxBBxBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

Lo único que solucionó el problema de codificación UTF8 en la vista previa de CSV cuando presiona la barra espaciadora en Mac… pero no en Excel Mac 2008… no sé por qué

valoraciones y comentarios

Si tienes algún incógnita o disposición de innovar nuestro escrito te recomendamos realizar una glosa y con placer lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *