Estoy exportando datos mediante programación (usando PHP 5.2) a un archivo de prueba .csv.
Datos de ejemplo: Numéro 1
(tenga en cuenta la e acentuada). Los datos son utf-8
(sin lista de materiales antepuesta).
Cuando abro este archivo en MS Excel se muestra como Numéro 1
.
Puedo abrir esto en un editor de texto (UltraEdit) que lo muestra correctamente. UE informa que el personaje es decimal 233
.
¿Cómo puedo exportar datos de texto en un archivo .csv para que MS Excel los represente correctamente , preferiblemente sin forzar el uso del asistente de importación o la configuración de asistente no predeterminada?
excel
encoding
csv
diacritics
Freddo411
fuente
fuente
Respuestas:
Un archivo UTF8 formateado correctamente puede tener una marca de orden de bytes como sus primeros tres octetos. Estos son los valores hexadecimales 0xEF, 0xBB, 0xBF. Estos octetos sirven para marcar el archivo como UTF8 (ya que no son relevantes como información de "orden de bytes"). 1 Si esta lista de materiales no existe, el consumidor / lector debe deducir el tipo de codificación del texto. Los lectores que no sean compatibles con UTF8 leerán los bytes como alguna otra codificación, como Windows-1252, y mostrarán los caracteres

al comienzo del archivo.Existe un error conocido en el que Excel, al abrir archivos CSV UTF8 a través de la asociación de archivos, supone que están en una codificación de un solo byte, sin tener en cuenta la presencia de la lista de materiales UTF8. Esto no se puede solucionar mediante ninguna página de códigos predeterminada del sistema o configuración de idioma. La lista de materiales no tendrá ni idea en Excel, simplemente no funcionará. (Un informe minoritario afirma que la lista de materiales a veces activa el asistente "Importar texto"). Este error parece existir en Excel 2003 y versiones anteriores. La mayoría de los informes (en medio de las respuestas aquí) dicen que esto se solucionó en Excel 2007 y versiones posteriores.
Tenga en cuenta que siempre * puede abrir correctamente archivos CSV UTF8 en Excel utilizando el asistente "Importar texto", que le permite especificar la codificación del archivo que está abriendo. Por supuesto, esto es mucho menos conveniente.
Es muy probable que los lectores de esta respuesta se encuentren en una situación en la que no son particularmente compatibles con Excel <2007, pero envían texto UTF8 sin formato a Excel, que lo malinterpreta y rocía su texto con
Ã
otros caracteres similares de Windows-1252. Agregar la UTF8 BOM es probablemente su mejor y más rápida solución.Si está atrapado con usuarios en Excels anteriores y Excel es el único consumidor de sus CSV, puede solucionar este problema exportando UTF16 en lugar de UTF8. Excel 2000 y 2003 harán doble clic para abrirlos correctamente. (Algunos otros editores de texto pueden tener problemas con UTF16, por lo que es posible que tenga que sopesar sus opciones con cuidado).
* Excepto cuando no puede, (al menos) el Asistente de importación de Excel 2011 para Mac no siempre funciona con todas las codificaciones, independientemente de lo que le diga. </anecdotal-evidence> :)
fuente

en la primera celda; o algo completamente diferente.
). Solo ayuda a adivinar algoritmos y para formatos de archivo que específicamente le permiten (p. Ej. XML). La desventaja de incluir una lista de materiales falsa en los archivos UTF-8 es que rompes su compatibilidad ASCII (un punto de venta importante para UTF-8) Muchas herramientas de texto ignorantes de codificación se romperán frente a una lista de materiales falsa líder inesperada.Antes de una BOM (\ uFEFF) funcionó para mí (Excel 2007), en ese Excel reconoció el archivo como UTF-8. De lo contrario, guardarlo y usar el asistente de importación funciona, pero es menos ideal.
fuente
\ufeff
es una lista de materiales UTF-16 (BE) no una lista de materiales UTF-8A continuación se muestra el código PHP que uso en mi proyecto cuando envío Microsoft Excel al usuario:
ACTUALIZADO: la mejora del nombre de archivo y el ERROR corrigen el cálculo correcto de la longitud Gracias a TRiG y @ ivanhoe011
fuente
'Content-Disposition: attachment; filename="'.$filename.'.csv"'
porque Firefox quiere las comillas dobles, o de lo contrario cortará su nombre de archivo después de un espacio.text/csv
) pero llamándolo Excel (application/vnd.ms-excel
)?header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));
?La respuesta para todas las combinaciones de versiones de Excel (2003 + 2007) y tipos de archivo
La mayoría de las otras respuestas aquí se refieren solo a su versión de Excel y no necesariamente lo ayudarán, porque su respuesta podría no ser cierta para su versión de Excel.
Por ejemplo, agregar el carácter BOM presenta problemas con el reconocimiento automático del separador de columnas, pero no con todas las versiones de Excel.
Hay 3 variables que determinan si funciona en la mayoría de las versiones de Excel:
Alguien estoico en SAP probó todas las combinaciones e informó el resultado. ¿Resultado final? Use UTF16le con BOM y caracteres de tabulación como separador para que funcione en la mayoría de las versiones de Excel.
¿No me crees? Yo tampoco, pero lea aquí y llore: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator
fuente
sep=,
o lo que quieras usar? Si ya está agregando la lista de materiales, supongo que no es reacio a agregar cosas al archivo.seleccione UTF-8 enconding al importar. si usa Office 2007, aquí es donde lo eligió: justo después de abrir el archivo.
fuente
Echo UTF-8 BOM antes de enviar datos CSV. Esto soluciona todos los problemas de caracteres en Windows, pero no funciona para Mac.
Funciona para mí porque necesito generar un archivo que se usará solo en PC con Windows.
fuente
UTF-8 no funciona para mí en Office 2007 sin ningún paquete de servicio, con o sin BOM (U + ffef o 0xEF, 0xBB, 0xBF, ni funciona) la instalación de sp3 hace que UTF-8 funcione cuando 0xEF, 0xBB, 0xBF BOM es antepuesto
UTF-16 funciona al codificar en Python usando "utf-16-le" con una lista de materiales 0xff 0xef BOM antepuesta, y usando tab como separador. Tuve que escribir manualmente la lista de materiales, y luego usar "utf-16-le" en lugar de "utf-16", de lo contrario cada codificación () antepuso la lista de materiales a cada fila escrita que aparecía como basura en la primera columna de la segunda linea y despues.
No puedo decir si UTF-16 funcionaría sin ningún SP instalado, ya que no puedo volver ahora. suspiro
Esto está en Windows, no sé sobre Office para MAC.
para ambos casos de trabajo, la importación funciona cuando se inicia una descarga directamente desde el navegador y el asistente de importación de texto no interviene, funciona como es de esperar.
fuente
Como dijo Fregal, \ uFEFF es el camino a seguir.
fuente
También noté que la pregunta fue "respondida" hace algún tiempo, pero no entiendo las historias que dicen que no puede abrir un archivo csv codificado con utf8 con éxito en Excel sin usar el asistente de texto.
Mi experiencia reproducible: escriba
Old MacDonald had a farm,ÈÌÉÍØ
en el Bloc de notas, presione Entrar y luego Guardar como (con la opción UTF-8).Usando Python para mostrar lo que hay realmente allí:
Bueno. El bloc de notas ha puesto una lista de materiales en la parte delantera.
Ahora vaya al Explorador de Windows, haga doble clic en el nombre del archivo, o haga clic con el botón derecho y use "Abrir con ...", y emerge Excel (2003) con la visualización como se esperaba.
fuente
open('oldmac.csv', 'rb').read()
para verificar tu entrada?Puede guardar un archivo html con la extensión 'xls' y los acentos funcionarán (al menos desde 2007).
Ejemplo: guarde esto (usando Guardar como utf8 en el Bloc de notas) como test.xls:
fuente
border="1"
a la tabla, que hace llegar las líneas, pero sólo alrededor de las 4 células :)Esto es solo una cuestión de codificaciones de caracteres. Parece que está exportando sus datos como UTF-8: é en UTF-8 es la secuencia de dos bytes 0xC3 0xA9, que cuando se interpreta en Windows-1252 es é. Cuando importe sus datos a Excel, asegúrese de decirle que la codificación de caracteres que está usando es UTF-8.
fuente
El formato CSV se implementa como ASCII, no unicode, en Excel, lo que destruye los signos diacríticos. Experimentamos el mismo problema que es cómo rastreé que el estándar CSV oficial se definiera como basado en ASCII en Excel.
fuente
Excel 2007 lee correctamente UTF-8 con csv codificado BOM (EF BB BF).
Excel 2003 (y tal vez antes) lee UTF-16LE con BOM (FF FE), pero con TAB en lugar de comas o punto y coma.
fuente
Solo puedo hacer que CSV se analice correctamente en Excel 2007 como little-endian UTF-16 separado por tabulaciones comenzando con la marca de orden de bytes adecuada.
fuente
Escribir una lista de materiales en el archivo CSV de salida realmente funcionó para mí en Django:
Para obtener más información http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html ¡ Gracias chicos!
fuente
printWriter.print('\ufeff')
, consulte también Cómo agregar una lista de materiales UTF-8 en Java .Otra solución que encontré fue simplemente codificar el resultado como Página de códigos de Windows 1252 (Windows-1252 o CP1252). Esto se haría, por ejemplo, configurando
Content-Type
adecuadamente algo asítext/csv; charset=Windows-1252
y configurando la codificación de caracteres del flujo de respuesta de manera similar.fuente
Tenga en cuenta que incluir la lista de materiales UTF-8 no es necesariamente una buena idea: las versiones de Excel para Mac lo ignoran y en realidad mostrarán la lista de materiales como ASCII ... tres caracteres desagradables al comienzo del primer campo en su hoja de cálculo ...
fuente
'\uFEFF' + myCsvString
funciona como se esperaba en Mac Excel 15.19.1 (2016).Verifique la codificación en la que está generando el archivo, para que Excel muestre el archivo correctamente, debe usar la página de códigos predeterminada del sistema.
¿Qué idioma estás usando? si es .Net solo necesita usar Encoding.Default mientras genera el archivo.
fuente
Si tiene código heredado en vb.net como yo, el siguiente código funcionó para mí:
fuente
He encontrado una manera de resolver el problema. Este es un truco desagradable pero funciona: abra el documento con Open Office , luego guárdelo en cualquier formato de Excel; el resultado
.xls
o.xlsx
mostrará los caracteres acentuados.fuente
Con Ruby 1.8.7 codifico cada campo a UTF-16 y descarto BOM (tal vez).
El siguiente código se extrae de active_scaffold_export:
La línea importante es:
fuente
abra el archivo csv con notepad ++ haga clic en Codificar, seleccione convertir a UTF-8 (no convertir a UTF-8 (sin BOM)) Guardar abrir haciendo doble clic con Excel Espero que ayude a Christophe GRISON
fuente