para - ¿Es posible forzar que Excel reconozca automáticamente los archivos CSV UTF-8?




formato utf-8 (16)

Estoy desarrollando una parte de una aplicación que es responsable de exportar algunos datos a archivos CSV. La aplicación siempre usa UTF-8 debido a su naturaleza multilingüe en todos los niveles. Pero abrir tales archivos CSV (que contienen, por ejemplo, signos diacríticos, letras cirílicas, letras griegas) en Excel no logra los resultados esperados que muestran algo como Г„/Г¤, Г–/Г¶ . Y no sé cómo forzar a Excel a comprender que el archivo CSV abierto está codificado en UTF-8. También intenté especificar UTF-8 BOM EF BB BF , pero Excel lo ignora.

¿Hay algún trabajo alrededor?

PD: ¿Qué herramientas pueden comportarse potencialmente como Excel?

ACTUALIZAR

Debo decir que he confundido a la comunidad con la formulación de la pregunta. Cuando estaba haciendo esta pregunta, pedí una manera de abrir un archivo CSV UTF-8 en Excel sin ningún problema para un usuario, de una manera fluida y transparente. Sin embargo, utilicé una formulación incorrecta que pedía hacerlo automáticamente . Eso es muy confuso y choca con la automatización de macros VBA. Hay dos respuestas para estas preguntas que aprecio más: la primera respuesta de Alex https://stackoverflow.com/a/6002338/166589 , y he aceptado esta respuesta; y el segundo por Mark https://stackoverflow.com/a/6488070/166589 que han aparecido un poco más tarde. Desde el punto de vista de la facilidad de uso, parece que Excel carece de un buen soporte UTF-8 CSV fácil de usar, por lo que considero que ambas respuestas son correctas, y primero he aceptado la respuesta de Alex porque realmente declaró que Excel no podía hacerlo. que de forma transparente Eso es con lo que confundí automáticamente aquí. La respuesta de Mark promueve una forma más complicada para que los usuarios más avanzados logren el resultado esperado. Ambas respuestas son geniales, pero la de Alex se ajusta un poco mejor a mi pregunta no claramente especificada.

ACTUALIZACIÓN 2

Cinco meses después de la última edición, he notado que la respuesta de Alex ha desaparecido por alguna razón. Realmente espero que no sea un problema técnico y espero que no haya más discusión sobre qué respuesta es mejor ahora. Así que estoy aceptando la respuesta de Mark como la mejor.


  1. Descargar e instalar LibreOffice Calc
  2. Abra el archivo csv de su elección en LibreOffice Calc
  3. Gracias a los cielos que un asistente de importación de texto se muestra ...
  4. ... selecciona tus opciones de delimitador y codificación de caracteres
  5. Seleccione los datos resultantes en Calc y copie y pegue en Excel.

Alex tiene razón, pero como tiene que exportar a csv, puede darles a los usuarios este consejo al abrir los archivos csv:

  1. Guarde el archivo exportado como un csv
  2. Abrir Excel
  3. Importe los datos utilizando Datos -> Importar datos externos -> Importar datos
  4. Seleccione el tipo de archivo de "csv" y busque su archivo
  5. En el asistente de importación, cambie el Origen del archivo a "65001 UTF" (o elija el identificador de caracteres del idioma correcto)
  6. Cambia el delimitador a coma.
  7. Seleccione dónde importar y Finalizar

De esta manera los caracteres especiales deben mostrarse correctamente.


El error con la lista de materiales ignorada parece haberse solucionado para Excel 2013. Tuve el mismo problema con las letras cirílicas, pero agregar el carácter de la lista de materiales \uFEFF ayudó.


El marcador de orden de bytes UTF-8 indicará a Excel 2007+ sobre el hecho de que está utilizando UTF-8. (Ver esta publicación SO ).

En caso de que alguien tenga los mismos problemas que yo, la clase de codificación UTF8 de .NET no genera un marcador de orden de bytes incluso cuando se le indica explícitamente a su constructor. Debe utilizar esta solución alternativa si realmente desea guardarlo con un marcador de orden de bytes.


Es increíble que haya tantas respuestas pero ninguna responde a la pregunta:

"Cuando estaba haciendo esta pregunta, pedí una manera de abrir un archivo CSV UTF-8 en Excel sin ningún problema para un usuario, ..."

La respuesta marcada como la respuesta aceptada con más de 200 votos arriba no me sirve de nada porque no quiero dar a mis usuarios un manual sobre cómo configurar Excel. Aparte de eso: este manual se aplicará a una versión de Excel, pero otras versiones de Excel tienen menús y diálogos de configuración diferentes. Necesitarías un manual para cada versión de Excel.

Entonces, la pregunta es ¿cómo hacer que Excel muestre datos UTF8 con un simple doble clic?

Bueno, al menos en Excel 2007, esto no es posible si utiliza archivos CSV porque se ignora la lista de materiales UTF8 y solo verá basura. Esto ya es parte de la cuestión de Lyubomyr Shaydariv:

"También intenté especificar UTF-8 BOM EF BB BF, pero Excel lo ignora".

Hago la misma experiencia: escribir datos rusos o griegos en un archivo UTF8 CSV con resultados de BOM en basura en Excel:

Contenido del archivo CSV UTF8:

Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ

Resultado en Excel 2007:

Una solución es no usar CSV en absoluto. Microsoft implementa este formato tan estúpidamente que depende de la configuración de la región en el panel de control si se usa una coma o un punto y coma como separador. Por lo tanto, el mismo archivo CSV puede abrirse correctamente en una computadora, pero no en otra computadora. "CSV" significa "Valores separados por comas " pero, por ejemplo, en un Windows en alemán, el punto y coma por defecto debe usarse como separador mientras que la coma no funciona. (Aquí debería llamarse SSV = Valores separados por punto y coma) Los archivos CSV no se pueden intercambiar entre diferentes versiones de idioma de Windows. Este es un problema adicional al problema UTF-8.

Excel existe desde hace décadas. Es una pena que Microsoft no haya podido implementar algo tan básico como la importación de CSV en todos estos años.

Sin embargo, si coloca los mismos valores en un archivo HTML y guarda ese archivo como archivo UTF8 con BOM con la extensión XLS , obtendrá el resultado correcto.

Contenido del archivo UTF8 XLS:

<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>

Resultado en Excel 2007:

Incluso puedes usar colores en HTML que Excel mostrará correctamente.

<style>
.Head { background-color:gray; color:white; }
.Red  { color:red; }
</style>
<table border=1>
<tr><td class=Head>Colum1</td><td class=Head>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td class=Red>Авиабилет</td><td class=Red>Tλληνικ</td></tr>
</table>

Resultado en Excel 2007:

En este caso, solo la tabla tiene un borde negro y líneas. Si desea que TODAS las celdas muestren cuadrículas, esto también es posible en HTML:

<html xmlns:x="urn:schemas-microsoft-com:office:excel">
    <head>
        <meta http-equiv="content-type" content="text/plain; charset=UTF-8"/>
        <xml>
            <x:ExcelWorkbook>
                <x:ExcelWorksheets>
                    <x:ExcelWorksheet>
                        <x:Name>MySuperSheet</x:Name>
                        <x:WorksheetOptions>
                            <x:DisplayGridlines/>
                        </x:WorksheetOptions>
                    </x:ExcelWorksheet>
                </x:ExcelWorksheets>
            </x:ExcelWorkbook>
        </xml>
    </head>
    <body>
        <table>
            <tr><td>Colum1</td><td>Column2</td></tr>
            <tr><td>Val1</td><td>Val2</td></tr>
            <tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
        </table>
    </body>
</html>

Este código incluso permite especificar el nombre de la hoja de trabajo (aquí "MySuperSheet")

Resultado en Excel 2007:


Esta es mi solución de trabajo:

vbFILEOPEN = "your_utf8_file.csv"
Workbooks.OpenText Filename:=vbFILEOPEN, DataType:=xlDelimited, Semicolon:=True, Local:=True, Origin:=65001

La clave es Origen: = 65001



Esto no está abordando la pregunta con precisión, pero como me topé con esto y las soluciones anteriores no funcionaron para mí o tenía requisitos que no pude cumplir, esta es otra forma de agregar la lista de materiales cuando tiene acceso a vim:

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv

He tenido el mismo problema en el pasado (cómo producir archivos que Excel pueda leer y otras herramientas también pueden leer). Estaba usando TSV en lugar de CSV, pero surgió el mismo problema con las codificaciones.

No encontré ninguna forma de hacer que Excel reconociera UTF-8 automáticamente, y no estaba dispuesto / capaz de infligir a los consumidores de los archivos instrucciones complicadas sobre cómo abrirlos. Así que los codifiqué como UTF-16le (con una lista de materiales) en lugar de UTF-8. Dos veces el tamaño, pero Excel puede reconocer la codificación. Y se comprimen bien, por lo que el tamaño rara vez (pero lamentablemente nunca) importa.


Hemos utilizado esta solución:

  1. Convertir CSV a UTF-16
  2. Insertar lista de materiales al principio del archivo
  3. Utilice la pestaña como separador de campo

Macro simple de vba para abrir archivos de texto y csv de utf-8

Sub OpenTextFile()

   filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv")
   If filetoopen = Null Or filetoopen = Empty Then Exit Sub

   Workbooks.OpenText Filename:=filetoopen, _
   Origin:=65001, DataType:=xlDelimited, Comma:=True

End Sub

Origen: = 65001 es UTF-8. Coma: verdadero para archivos .csv distribuidos en columnas

Guárdalo en Personal.xlsb para tenerlo siempre disponible. Personalice la barra de herramientas de Excel agregando un botón de llamada macro y abra archivos desde allí. Puede agregar más formaciones a la macro, como la adaptación automática de columnas, la alineación, etc.


Primero guarda la hoja de cálculo de Excel como texto Unicode. Abra el archivo TXT utilizando Internet Explorer y haga clic en "Guardar como" Codificación TXT: elija la codificación adecuada, es decir, para Win Cyrillic 1251


Sí, esto es posible. Como lo señalaron varios usuarios, parece que hay un problema con Excel al leer la marca de orden de bytes correcta cuando el archivo está codificado en UTF-8. Con UTF-16 no parece tener un problema, por lo que es endémico de UTF-8. La solución que utilizo para esto es agregar la lista de materiales, DOS VECES. Para esto ejecuto el siguiente comando sed dos veces:

sed -I '1s/^/\xef\xbb\xbf/' *.csv

, donde el comodín puede ser reemplazado por cualquier nombre de archivo. Sin embargo, esto conduce a una mutación de sep = al principio del archivo .csv. El archivo .csv se abrirá normalmente en Excel, pero con una fila adicional con "sep =" en la primera celda. El "sep =" también se puede eliminar en la fuente .csv, pero al abrir el archivo con VBA se debe especificar el delimitador:

Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)

El formato 6 es el formato .csv. Establezca Local en verdadero, en caso de que haya fechas en el archivo. Si Local no se establece en verdadero, las fechas serán americanizadas, lo que en algunos casos dañará el formato .csv.


Si desea hacerlo completamente automático, con un solo clic, o para cargarlo automáticamente en Excel desde una página web, pero no puede generar los archivos de Excel adecuados, le sugeriría que busque el formato SYLK como alternativa. Está bien, no es tan simple como CSV pero está basado en texto y es muy fácil de implementar, y admite UTF-8 sin problemas.

Escribí una clase de PHP que recibe los datos y genera un archivo SYLK que se abrirá directamente en Excel con solo hacer clic en el archivo (o iniciará automáticamente Excel si escribe el archivo en una página web con el tipo de mimo correcto. Incluso puede agregue formato (como negrita, números de formato en formas particulares, etc.) y cambie el tamaño de las columnas, o las columnas de tamaño automático al texto en las columnas y, en general, el código probablemente no supere las 100 líneas.

Es muy fácil realizar ingeniería inversa en SYLK mediante la creación de una hoja de cálculo simple, guardarla como SYLK y luego leerla con un editor de texto. El primer bloque son encabezados y formatos de número estándar que reconocerá (que solo regurgitará en cada archivo que cree), luego los datos son simplemente una coordenada X / Y y un valor.


Tenía los mismos problemas con los archivos CSV generados por PHP. Excel ignoró la lista de materiales cuando el separador se definió mediante "sep=,\n" al principio del contenido (pero, por supuesto, después de la lista de materiales).

Entonces, agregue una lista de materiales ( "\xEF\xBB\xBF" ) al principio del contenido y configure el punto y coma como separador mediante fputcsv($fh, $data_array, ";"); Hace el truco.


Una lista de respuestas realmente sorprendente, pero como todavía falta una muy buena, la mencionaré aquí: abra el archivo csv con hojas de google y guárdelo en su computadora local como un archivo de Excel.

A diferencia de Microsoft, Google ha logrado admitir archivos csv UTF-8 por lo que simplemente funciona para abrir el archivo allí. Y el formato exportar a excel también funciona. Entonces, aunque esta no sea la solución preferida para todos, es bastante segura y el número de clics no es tan alto como puede sonar, especialmente cuando ya ha iniciado sesión en Google de todos modos.





utf-8