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




formato cambiar (21)

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://.com/a/6002338/166589 , y he aceptado esta respuesta; y el segundo por Mark https://.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.


Answers

Vieja pregunta pero, diablos, la solución más simple es:

  1. Abrir CSV en el Bloc de notas
  2. Guardar como -> seleccione la codificación correcta
  3. Abre el nuevo archivo

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.


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

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ó.


Como publiqué en http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html :

Dígale al desarrollador de software a cargo de generar el CSV para corregirlo. Como solución rápida, puede usar gsed para insertar la lista de materiales UTF-8 al principio de la cadena:

gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv

Este comando inserta la lista de materiales UTF-4 si no está presente. Por lo tanto es un comando idempotente. Ahora debería poder hacer doble clic en el archivo y abrirlo en Excel.


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:


Sí, es posible. Al escribir el flujo creando el csv, lo primero que debe hacer es esto:

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)

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


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.


Solo para ayudar a los usuarios interesados ​​en abrir el archivo en Excel que logre este hilo como yo.

He utilizado el asistente a continuación y funcionó bien para mí, importando un archivo UTF-8. No transparente, pero útil si ya tiene el archivo.

  1. Abra Microsoft Excel 2007.
  2. Haga clic en la opción de barra de menú de datos.
  3. Haga clic en el icono de texto.
  4. Vaya a la ubicación del archivo que desea importar. Haga clic en el nombre del archivo y luego haga clic en el botón Importar. El asistente de importación de texto - Paso 1 o 3 ventana aparecerá ahora en la pantalla.
  5. Elija el tipo de archivo que mejor describa sus datos: Delimitado o Ancho fijo.
  6. Elija 65001: Unicode (UTF-8) en la lista desplegable que aparece junto al origen del archivo.
  7. Haga clic en el botón Siguiente para mostrar la ventana Asistente de importación de texto - Paso 2 o 3.
  8. Coloque una marca de verificación junto al delimitador que se usó en el archivo que desea importar a Microsoft Excel 2007. La ventana de vista previa de Datos le mostrará cómo aparecerán sus datos según el delimitador que eligió.
  9. Haga clic en el botón Siguiente para mostrar el Asistente de importación de texto - Paso 3 de 3.
  10. Elija el formato de datos adecuado para cada columna de datos que desea importar. También tiene la opción de no importar una o más columnas de datos si lo desea.
  11. Haga clic en el botón Finalizar para terminar de importar sus datos a Microsoft Excel 2007.

Fuente: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0


Es 2018, y vine del futuro.

Para abrir el archivo con solo un doble clic que muestra los caracteres correctos, abra el archivo en notepad ++ y seleccione Codificación-> UTF-8-BOM y presione guardar.



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.


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.


Estoy generando archivos csv desde una aplicación simple de C # y tuve el mismo problema. Mi solución fue asegurar que el archivo esté escrito con codificación UTF8, así:

// Use UTF8 encoding so that Excel is ok with accents and such.
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
    SaveCSV(writer);
}

Originalmente tenía el siguiente código, con el cual los acentos se ven bien en Notepad ++, pero fueron destrozados en Excel:

using (StreamWriter writer = new StreamWriter(path))
{
    SaveCSV(writer);
}

Su millaje puede variar. Estoy usando .NET 4 y Excel de Office 365.


  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.

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


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.


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.


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

Como la codificación UTF8 no funciona bien con Excel. Puede convertir los datos a otro tipo de codificación usando iconv() .

p.ej

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),






excel csv utf-8