Tengo esta cosa muy simple que solo muestra algunas cosas en formato CSV, pero tiene que ser UTF-8. Abro este archivo en TextEdit o TextMate o Dreamweaver y muestra los caracteres UTF-8 correctamente, pero si lo abro en Excel está haciendo este tipo de cosas tontas. 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 que pueda "abrir como UTF-8" ni nada, así que ... me estoy molestando un poco.
Parece que no puedo encontrar ninguna solución clara para esto en ningún lado, a pesar de que muchas personas tienen el mismo problema. Lo que más veo es incluir la lista de materiales, pero no puedo entender exactamente cómo hacerlo. Como puede ver arriba, solo estoy echo
ingresando estos datos, no estoy escribiendo ningún archivo. Puedo hacerlo si lo necesito, simplemente no lo soy porque no parece que sea 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 solo agrega esos tres caracteres a la primera celda cuando importa, y aún desordena los caracteres especiales.
fuente
Respuestas:
Para citar a un ingeniero de soporte de Microsoft ,
Actualización, 2017 : esto es cierto para 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, pueda leer con éxito, deberá hacer dos cosas:
Asegúrese de convertir su texto CST UTF-8 a UTF-16LE
Asegúrese de agregar la marca de orden de bytes UTF-16LE al inicio del archivo
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 mostrará las filas solo con una fila y todo el texto junto con las comas en la primera fila.
La forma de evitar esto es usar pestañas 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:
a
Como dicen algunos de los otros comentarios en esta página, otras aplicaciones de hojas de cálculo como OpenOffice Calc, los propios números de Apple y la hoja de cálculo de Google Doc no tienen problemas con los archivos UTF-8 con comas.
Consulte la tabla de esta pregunta para saber qué funciona y qué no funciona para los archivos CSV de Unicode en Excel
Como nota al margen, podría agregar que si está utilizando Composer , debería echar un vistazo a las necesidades
League\Csv
.League\Csv
tiene una API realmente buena para construir archivos CSV .Para usar
League\Csv
con este método de creación de archivos CSV, consulte este ejemplofuente
sep=;
osep=,
al archivo CSV le dice a Excel cómo se separa el CSV y las columnas se crearán correctamente nuevamente."sep=,\n"
, luego en otra línea agregué los datos. Las cosas estaban bien si lo hacía todo en una línea ($csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
). Todo se ve muy bien ahora en Mac. No tengo Windows para probar.Tengo el mismo problema (o similar).
En mi caso, si agrego una lista de materiales a la salida, funciona:
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.
fuente
Así es como lo hice (para solicitar al navegador que descargue el archivo csv):
Lo único que solucionó el problema de codificación UTF8 en la vista previa de CSV cuando presionó la barra espaciadora en Mac ... pero no en Excel Mac 2008 ... no sé por qué
fuente
$outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
))
.Acabo de abordar el mismo problema y se me ocurrieron dos soluciones.
Use la clase PHPExcel como lo sugiere bpeterson76 .
Aquí hay un método PHP que tomará algunos datos de TSV y generará un archivo de Excel en el navegador, tenga en cuenta que usa Excel5 Writer, lo que significa que el archivo debería ser compatible con versiones anteriores de Excel, pero ya no tengo acceso a ninguno, entonces no puedo probarlos.
Debido a los problemas de eficiencia con PHPExcel, también tuve que descubrir cómo generar un archivo CSV o TSV compatible con UTF-8 y Excel.
Aquí está el código PHP que utilicé, tenga en cuenta que estoy usando datos tsv (pestañas como delimitadores en lugar de comas):
fuente
Estaba teniendo el mismo problema y se resolvió de la siguiente manera:
fuente
Excel no es compatible con UTF-8. Tiene que codificar su texto UTF-8 en UCS-2LE.
fuente
En mi caso, a continuación funciona muy bien para hacer que el archivo CSV con caracteres UTF-8 se muestre correctamente en Excel.
El
0xEF 0xBB 0xBF
encabezado BOM le permitirá a Excel conocer la codificación correcta.fuente
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
<- esto es exactamente lo que necesitaba. Funciona a las mil maravillas.Para seguir con esto:
Parece que el problema es simplemente con Excel en la Mac. No es como estoy generando los archivos, porque incluso generar CSV desde Excel está rompiendo. Guardo como CSV y reimporto, y todos los personajes están en mal estado.
Entonces ... no parece haber una respuesta correcta a esto. Gracias por todas las sugerencias.
Diría que de todo lo que he leído, la sugerencia de @Daniel Magliola sobre la lista de materiales probablemente sería la mejor respuesta para alguna otra computadora. Pero todavía no resuelve mi problema.
fuente
Esto funciona bien en Excel tanto para Windows como para Mac OS.
Solucione problemas en Excel que no muestran caracteres que contienen diacríticos, letras cirílicas, letras griegas y símbolos de moneda.
fuente
El archivo CSV debe incluir una marca de orden de bytes.
O como se sugiere y la solución alternativa, simplemente repítalo con el cuerpo HTTP
fuente
Dado que la codificación UTF8 no funciona bien con Excel. Puede convertir los datos a otro tipo de codificación utilizando
iconv()
.p.ej
fuente
Añadir:
O:
Antes de escribir cualquier contenido en el archivo CSV.
Ejemplo:
fuente
La conversión de texto codificado ya utf-8 mediante el uso
mb_convert_encoding
no es necesaria. Simplemente agregue tres caracteres delante del contenido original:Para mí, esto resolvió el problema de los caracteres especiales en los archivos csv.
fuente
fputs
.Mientras investigaba y descubrí que UTF-8 no funciona bien en MAC y Windows, intenté con Windows-1252, es compatible con ambos, pero debe seleccionar el tipo de codificación en ubuntu. Aqui esta mi codigo
$valueToWrite = mb_convert_encoding($value, 'Windows-1252');
fuente
fuente
¿Qué tal solo generar para Excel en sí? Esta es una clase excelente que le permite generar archivos XLS del lado del servidor. Lo uso con frecuencia para clientes que no pueden "descifrar" los csv y hasta ahora nunca han tenido una queja. También permite un formato adicional (sombreado, alturas de fila, cálculos, etc.) que csv nunca hará.
fuente
puedes convertir tu cadena CSV con iconv . por ejemplo:
fuente
Tienes que usar la codificación "Windows-1252".
Quizás tengas que convertir tus cadenas:
fuente
Puede agregar los 3 bytes al archivo antes de exportar, funciona para mí. Antes de hacer ese sistema solo funcionaba en Windows y HP -UX pero fallaba en Linux.
Tener una lista de materiales UTF-8 (3 bytes, hexadecimal EF BB BF) al comienzo del archivo. De lo contrario, Excel interpretará los datos de acuerdo con la codificación predeterminada de su localidad (por ejemplo, cp1252) en lugar de utf-8
Generando archivo CSV para Excel, cómo tener una nueva línea dentro de un valor
fuente
Estoy en Mac, en mi caso solo tuve que especificar el separador
"sep=;\n"
y codificar el archivo en UTF-16LE de esta manera:fuente
Para mí, ninguna de las soluciones anteriores funcionó. A continuación se muestra lo que hice para resolver el problema: modifique el valor con esta función en el código PHP:
Esta salida se valora correctamente en una hoja de Excel.
fuente
Tuve el mismo problema cuando tuve una rutina Excel VBA que importaba datos. Como CSV es un formato de texto plano, estaba trabajando en esto abriendo programáticamente los datos en un editor de archivos simple como wordpad, y volviéndolos a guardar como texto unicode, o copiándolos en el portapapeles desde allí y pegándolos en Excel. Si Excel no analiza automáticamente el CSV en las celdas, esto se soluciona fácilmente utilizando la función integrada "Texto a columnas".
fuente
¿Sigue ocurriendo el problema cuando lo guarda como un archivo .txt y lo abren en Excel con una coma como delimitador?
El problema puede no ser la codificación en absoluto, puede ser que el archivo no sea un CSV perfecto según los estándares de Excel.
fuente
Esta publicación es bastante antigua, pero después de horas de intentarlo quiero compartir mi solución ... tal vez ayude a alguien a lidiar con Excel y Mac y CSV y tropieza con esta amenaza. Estoy generando un csv dinámicamente como salida de una base de datos con usuarios de Excel en mente. (UTF-8 con BOM)
Probé muchos iconv´s pero no pude lograr que las diéresis alemanas funcionaran en Mac Excel 2004. Una solución: PHPExcel. Es genial, pero para mi proyecto es demasiado. Lo que funciona para mí es crear el archivo csv y convertir este archivo csv a xls con este PHPsnippet: csv2xls . El resultado xls funciona con las diéresis alemanas excel (ä, ö, Ü, ...).
fuente
Acabo de probar estos encabezados y obtuve Excel 2013 en una PC con Windows 7 para importar el archivo CSV con caracteres especiales correctamente. El Byte Order Mark (BOM) fue la clave final que lo hizo funcionar.
fuente
De lo contrario, puede:
fuente
Solución FÁCIL para Mac Excel 2008: luché con esto muchas veces, pero aquí estaba mi solución fácil: abra el archivo .csv en Textwrangler que debería abrir sus caracteres UTF-8 correctamente. Ahora, en la barra de estado inferior, cambie el formato de archivo de "Unicode (UTF-8)" a "Western (ISO Latin 1)" y guarde el archivo. Ahora vaya a su Mac Excel 2008 y seleccione Archivo> Importar> Seleccionar csv> Buscar su archivo> en Origen del archivo, seleccione "Windows (ANSI)" y listo, los caracteres UTF-8 se muestran correctamente. Por lo menos lo hace por mí...
fuente
Yo uso esto y funciona
fuente
# Salga un CSV UTF-8 en PHP que Excel leerá correctamente.
fuente
fuente