¿Es posible forzar a Excel a reconocer los archivos CSV UTF-8 automáticamente?


455

Estoy desarrollando una parte de una aplicación que se encarga 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, diacríticos, letras cirílicas, letras griegas) en Excel no logra los resultados esperados que muestran algo así Г„/Г¤, Г–/Г¶. Y no sé cómo obligar 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 como Excel?


ACTUALIZAR

Tengo que decir que confundí a la comunidad con la formulación de la pregunta. Cuando hacía esta pregunta, pedí una forma de abrir un archivo CSV UTF-8 en Excel sin ningún problema para un usuario, de manera fluida y transparente. Sin embargo, utilicé una formulación incorrecta pidiendo hacerlo automáticamente . Eso es muy confuso y choca con la automatización de macros VBA. Hay dos respuestas para estas preguntas que más aprecio: 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/166589que han aparecido un poco más tarde Desde el punto de vista de la usabilidad, Excel parecía carecer de un buen soporte CSV UTF-8 fácil de usar, por lo que considero que ambas respuestas son correctas, y primero acepté la respuesta de Alex porque realmente decía 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, noté que la respuesta de Alex había desaparecido por alguna razón. Realmente espero que no haya sido un problema técnico y espero que no haya más discusión sobre qué respuesta es mejor ahora. Así que acepto la respuesta de Mark como la mejor.


1
¿Se pueden usar archivos delimitados por tabulaciones? Si es así, puede que tengas más suerte.
Tim Perry

8
Office 2010+: mejores trabajos: UTF-16LE con BOM y \tcomo delimitador. Funcionará en configuración de Excel en inglés y no en inglés. Puede presionar Ctrl-Ssin seleccionar el formato de archivo, etc. Conservará los caracteres Unicode.
Sebastian

@Duncan hablando con franqueza, estoy confundido y es difícil "juzgar". Acepté la respuesta de Alex hace más de 2 años (preguntas y respuestas, ambas el 14 de mayo), y luego Mark respondió sugiriendo una solución difícil (en realidad no lo comprobé) que sorprendentemente obtuvo más puntos en mi pregunta que sorprendentemente se convirtió en popular también. De hecho, rechazamos el soporte de Excel en mi proyecto hace mucho tiempo, y no quiero quitarle el puntaje de reputación de Alex, porque Excel parecía, y probablemente todavía parece (corrígeme si me equivoco), manejar mal el CSV. Es difícil decirlo, lo siento.
Lyubomyr Shaydariv

2
La respuesta de Alex fue eliminada por un moderador. No se dio ninguna explicación, pero si tienes suficiente reputación, aún puedes verla.
Mark Ransom

1
Dado que las máquinas del tiempo aún no existen, simplemente tienen que estar en desacuerdo.
osexpert

Respuestas:


398

Alex tiene razón, pero como debe exportar a csv, puede dar 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 usando 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 File_Origin a "65001 UTF" (o elija el identificador de caracteres de idioma correcto)
  6. Cambiar el delimitador a coma
  7. Seleccione dónde importar y finalizar

De esta manera, los caracteres especiales deberían mostrarse correctamente.


163

El marcador de orden de bytes UTF-8 le dará una pista a Excel 2007+ sobre el hecho de que está usando 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 en una GetBytes()llamada. Debe usar transmisiones (o una solución alternativa ) para obtener la lista de materiales.


18
Insertar una lista de materiales UTF-8 parece ser el camino a seguir. Después de eso es transparente.
vy32

12
Uso Notepad ++ para convertir fácilmente el .csv de UTF-8aUTF-8 with BOM
Sébastien

3
Sí, la mejor solución. Muchas publicaciones confusas en torno a la configuración de encabezados en las respuestas http. Esto resuelve el problema. Lo mismo se puede ver al abrir el archivo en el bloc de notas y guardarlo de nuevo usando la opción UTF-8. También agrega el marcador de orden de bytes.
user369142

1
@Elmue: Supuse que tal vez (como yo) pensaba que lo estaba guardando con un marcador de orden de bytes, pero no porque alguna biblioteca no funcionara como él pensaba. Me pareció que valía la pena agregar esta respuesta, y evidentemente otras personas también la han encontrado útil. En cualquier caso, parece una mejor respuesta que decir que no use CSV o instruir a los usuarios sobre cómo abrir el archivo de alguna manera extraña.
StriplingWarrior

1
La versión Mac de Excel parece ignorar la lista de materiales. (Excel para Mac 2011.)
Thomas Andrews

74

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 lista de materiales \uFEFFayudó.


8
¡Desde que agregué \ uFEFF al comienzo de mi archivo CSV (generado en Java), Excel puede abrirlos correctamente! Thx
Galdo

16
que resuelven de mi problema también, en php que tiene este aspecto: $utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText;
Abdullah

@updola muchas gracias por este comentario, me ahorró horas
nathan hayfield

UTF-8, por definición, no usa ni debe usar los caracteres BOM. La forma en que Excel lee BOM arruina la ventaja de UTF-8 sobre Unicode, que es la compatibilidad con ASCII. Agregar la lista de materiales hará que Excel funcione, pero romperá otras lecturas de archivo UTF-8 / ASCII adecuadas.
Nelson

1
\ FE \ FF hace que Mac OS Excel 2016 sea el archivo completo como jeroglíficos japoneses.
Nakilon

56

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

"Cuando hacía esta pregunta, pedí una forma 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 positivos es inútil para mí porque no quiero darles 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 diferentes menús y cuadros de diálogo de configuración. Necesitaría 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 pregunta de Lyubomyr Shaydariv:

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

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

Contenido del archivo UTF8 CSV:

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

Resultado en Excel 2007:

CSV UTF8 Excel

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 utiliza una coma o punto y coma como separador. Entonces, el mismo archivo CSV puede abrirse correctamente en una computadora pero en otra computadora no. "CSV" significa " Valores separados por comas " pero, por ejemplo, en un Windows alemán, el punto y coma por defecto debe usarse como separador mientras la coma no funciona. (Aquí debe llamarse SSV = valores separados por punto y coma) Los archivos CSV no pueden intercambiarse 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 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 de archivo 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:

UTF8 HTML Excel

Incluso puede 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:

UTF8 HTML Excel

En este caso, solo la tabla en sí tiene un borde negro y líneas. Si desea que TODAS las celdas muestren líneas de cuadrícula, 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:

ingrese la descripción de la imagen aquí


1
Y también es increíble que la gente todavía responda. :) Sin embargo, diría que CSV está muerto: CSV es un formato de transmisión simple y mortal y, cuando estaba en ese proyecto, también lo usamos mucho para la interacción de componentes. Nunca usaría el formato HTML debido a su naturaleza demasiado representativa, y nunca podría hacer que los usuarios de ese proyecto exporten datos a HTML solo para hacerlo compatible con Excel. Excel apestaba en UTF-8 CSV, y no tengo idea de qué ha cambiado 5 años desde entonces. Pero supongo que los archivos delimitados por comas, punto y coma y tabuladores son una verdadera locura.
Lyubomyr Shaydariv el

55
No es increíble que la gente todavía responda a su pregunta porque Google los trae aquí: Todos con la misma pregunta: ¿Cómo hago para que Excel estúpido haga lo que quiero? Ingrese 3 palabras en Google: "excel csv utf8" y su pregunta es el PRIMER resultado en todo el mundo. ¡Escribiste un éxito de ventas!
Elmue

8
Como se ha tomado el tiempo de señalar cómo ninguna de las otras respuestas aquí hace que Excel abra un archivo CSV correctamente, vale la pena mencionar que esta respuesta tampoco lo hace. La respuesta originalmente aceptada (que fue eliminada por un moderador) recomendó exportar los datos a un archivo de Excel directamente, o exportar un archivo HTML y permitir a los usuarios abrir el archivo en Excel. Cualquiera de esas soluciones es menos hacky que guardar un archivo HTML con una extensión de archivo XLS, pero no se ha propuesto ninguna respuesta que realmente responda a la pregunta.
StriplingWarrior

3
@ Guerrero: "... pero no se ha propuesto ninguna respuesta que realmente responda la pregunta". Esto no es correcto. HE respondido esa pregunta: al menos con Excel 2007 NO ES POSIBLE. Esta es la respuesta definitiva. Si Excel ignora la lista de materiales UTF8 e interpreta los datos como ANSI, no hay forma de importar, por ejemplo, texto griego o ruso en Excel a través de CSV con un simple doble clic en el archivo (que era la pregunta: "sin ningún problema para un usuario" ) Lo que propongo es una solución de trabajo que funciona con TODAS las versiones de Excel con un doble clic y no requiere pasos adicionales en los menús de Excel.
Elmue

2
Esto no solo no responde la pregunta, es completamente incorrecto decir que CSV es "heredado" y "muerto". El hecho de que no veas el uso no significa que esté muerto. Además, claramente no entiendes su historia o lo ampliamente utilizado que es hoy. Esto es mejor que XML (debido a los tamaños de paquete más pequeños) y el problema aquí es cómo Microsoft simplemente no sigue un estándar para el formato UTF8. La respuesta correcta sería usar la oficina abierta y no Microsoft, ya que Microsoft nunca ha sido bueno codificando en primer lugar.
Jeremy

49

Hemos utilizado esta solución alternativa:

  1. Convertir CSV a UTF-16 LE
  2. Insertar BOM al principio del archivo
  3. Usar pestaña como separador de campo

1
¡Gracias! Intenté todas las otras respuestas en este hilo, pero la conversión a UTF-8 simplemente no funcionó. Cuando probé UTF-16 con BOM, funcionó al instante.
Husky

Para Excel para Mac 2011 tuve éxito con los archivos csv little endian UTF-16
multidynamics

Gracias, esta solución es excelente para darles a mis usuarios un csv unicode que pueden abrir en Excel.
user1073075

21

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

Por lo tanto, agregar una lista de materiales ( "\xEF\xBB\xBF") al comienzo del contenido y establecer el punto y coma como separador a través fputcsv($fh, $data_array, ";");del truco.


13

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

No pude encontrar ninguna manera de hacer que Excel reconociera UTF-8 automáticamente, y no estaba dispuesto / no podía 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 no nunca) importa.


Es una vieja pregunta, pero me alegra que la gente todavía la responda. Gracias. :)
Lyubomyr Shaydariv

1
@LyubomyrShaydariv: desde que respondí esta pregunta, un colega me dijo que el último Excel identifica los archivos UTF-8 CSV siempre que tengan una lista de materiales inicial. Entonces, en unos pocos años, cuando todos en el mundo (o de todos modos, todos los que entreguemos los archivos) estén en esa versión de Excel o mejor, podría cambiar mi codificación :-)
Steve Jessop

Extraño, para mí no funciona. Convierte los caracteres en símbolos chinos ... (se supone que son
hebreos

Tenía caracteres chinos en Excel cuando guardé en "UTF-16 BE with BOM". ¡Cuando probé "UTF-16 LE con BOM" funcionó! Usé Sublime Text para las pruebas.
Henno

12

Antigua 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

1
¿Qué versión de Excel usas?
Lyubomyr Shaydariv

1
Brillante, simplemente funciona y resuelve el problema (al menos para mí)
Auberon Vacher

1
No, porque el problema es que Excel abra el archivo .csv como un archivo csv. Quiero decir, tengo un proceso donde genero archivos csv. El usuario solo debería abrir los archivos. Aquí se le exige que haga más que eso.
Veverke

2
@Veverke si genera archivos de forma regular, esta no es la mejor solución. Pero si es algo único, esta respuesta es perfecta. Funciona porque el Bloc de notas colocará la lista de materiales al comienzo de un archivo UTF-8 o UTF-16.
Mark Ransom

Funciona de maravilla. ((:
user2925795

10

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 que lo corrija. Como solución rápida, puede usar gsed para insertar la lista de materiales UTF-8 al comienzo 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.


Gracias esto lo arregló. Acabo de convertir el csv ';' separado a UTF-BOM en Notepad ++ y know excels lo abre correctamente.
RandomGuy

¡Exactamente lo que se necesitaba! Aquí hay un indicador de cómo implementar esto en PHP stackoverflow.com/questions/25686191/…
EFC

Esta es la solución para Excel que no pudo reconocer los caracteres utf en los archivos csv. Entonces esta corrección para solucionar el problema de Excel.
cobp

Esto funcionó para la versión griega de Excel 2007, con separadores de comas. Gracias.
NameOfTheRose

Cambió la codificación a 'UTF-16le' en fs.createWriteStream (fileName, {encoding: 'UTF-16le'}) y Excel abrió el archivo CSV correctamente
rahul shukla

9

Puede convertir el archivo .csv a UTF-8 con BOM a través de Notepad ++:

  1. Abra el archivo en Notepad ++ .
  2. Ir al menú EncodingConvert to UTF-8.
  3. Ir al menú FileSave.
  4. Cierre Notepad ++.
  5. Abre el archivo en Excel.

Trabajó en Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) de 64 bits de Microsoft Office Professional Plus 2013 en Windows 8.1 con configuración regional para programas no Unicode configurados en "Alemán (Alemania)".


1
Hiciste lo que dijiste, no funcionó en absoluto. Convertir / codificar, configurar juegos de caracteres, nada funcionó en mi caso. Importar archivos a hojas de google, descargar como csv, funcionó a la perfección.
nada

1
Tuve que convertirlo con codificación -> Cinvert ti UTF-8-BOM Excel versión 2016
Igor Vuković

4

Macro vba simple para abrir archivos de texto y csv 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árdelo 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 formato a la macro, como ajuste automático de columna, alineación, etc.


2
Gracias. Desafortunadamente, esta es la sugerencia para usuarios de Excel realmente avanzados, y lo que busco es hacer que Excel lo haga automáticamente.
Lyubomyr Shaydariv

Traté de usar este fragmento de código pero no me funciona. Yo uso Excel 2013.
Sharunas Bielskis

3

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

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

  1. Abra Microsoft Excel 2007.
  2. Haga clic en la opción de barra de menú Datos.
  3. Haga clic en el icono De texto.
  4. Navegue 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 ahora aparecerá en la pantalla.
  5. Elija el tipo de archivo que mejor describa sus datos: ancho delimitado o fijo.
  6. Elija 65001: Unicode (UTF-8) de la lista desplegable que aparece junto a Origen del archivo.
  7. Haga clic en el botón Siguiente para mostrar el Asistente de importación de texto - Paso 2 o 3 ventana.
  8. Coloque una marca de verificación junto al delimitador que se utilizó 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 en función del 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 apropiado 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


3

Si, esto es posible. Como lo señalaron anteriormente varios usuarios, parece haber 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 uso para esto es agregar BOM, TWICE. Para esto ejecuto el siguiente comando sed dos veces:

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

, donde el comodín se puede reemplazar con cualquier nombre de archivo. Sin embargo, esto conduce a una mutación de sep = al comienzo 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 se americanizarán, lo que en algunos casos dañará el formato .csv.


1
cuando ejecuto el comando sed, obtengo: "sed: opción no válida - 'I'", creo que debería ser 'i'
BiAiB

2

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


2

Sí, es posible. Al escribir la secuencia que crea el csv, lo primero que debe hacer es esto:

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

¡No leíste la pregunta! Lyubomyr Shaydariv escribió: "También intenté especificar UTF-8 BOM EF BB BF, pero Excel lo ignora".
Elmue

Este es el código de trabajo. Si escribe archivos UTF-8 desde aplicaciones .Net con este cable, Excel reconocerá el archivo como UTF8.
zax

Puede estar en SU ​​Excel, funciona. Pero al menos en Excel 2007, la lista de materiales se ignora por completo. Entonces, si tiene la intención de escribir un código que funcione en todas las versiones de Excel, su código no será útil.
Elmue

2

Una lista realmente sorprendente de respuestas, pero como todavía falta una muy buena, la mencionaré aquí: abra el archivo csv con las 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 solo funciona para abrir el archivo allí. Y la exportación a formato Excel también funciona. Entonces, aunque esta puede no ser la solución preferida para todos, es bastante segura y la cantidad de clics no es tan alta como puede parecer, especialmente cuando ya está conectado a Google de todos modos.


2

Esto no aborda con precisión la pregunta, pero dado que me topé con esto y las soluciones anteriores no funcionaron para mí o tenían requisitos que no podía cumplir, aquí hay 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

2

hola estoy usando ruby ​​on rails para la generación de csv. En nuestra aplicación, planeamos utilizar el idioma múltiple (I18n) y enfrentamos un problema al ver el contenido de I18n en el archivo CSV de Windows Excel.

Estaba bien con Linux (Ubuntu) y mac.

Identificamos que Windows Excel debe importarse nuevamente los datos para ver los datos reales. Mientras importamos obtendremos más opciones para elegir el conjunto de caracteres.

Pero esto no puede ser educado para todos y cada uno de los usuarios, por lo que la solución que buscamos es abrir con solo hacer doble clic.

A continuación, identificamos la forma de mostrar los datos de modo abierto y lista de materiales en ventanas sobresalir con la ayuda de aghuddleston GIST . Agregado en la referencia.

Ejemplo I18n contenido

En Mac y Linux

Sueco: Förnamn Inglés: Nombre

En Windows

Sueco: Förnamn Inglés: Nombre

def user_information_report(report_file_path, user_id)
    user = User.find(user_id)
    I18n.locale = user.current_lang
    open_mode = "w+:UTF-16LE:UTF-8"
    bom = "\xEF\xBB\xBF"
    body user, open_mode, bom
  end

def headers
    headers = [
        "ID", "SDN ID",
        I18n.t('sys_first_name'), I18n.t('sys_last_name'), I18n.t('sys_dob'),
        I18n.t('sys_gender'), I18n.t('sys_email'), I18n.t('sys_address'),
        I18n.t('sys_city'), I18n.t('sys_state'), I18n.t('sys_zip'),
        I18n.t('sys_phone_number')
    ]
  end

def body tenant, open_mode, bom
    File.open(report_file_path, open_mode) do |f|
      csv_file = CSV.generate(col_sep: "\t") do |csv|
        csv << headers
        tenant.patients.find_each(batch_size: 10) do |patient|
          csv <<  [
              patient.id, patient.patientid,
              patient.first_name, patient.last_name, "#{patient.dob}",
              "#{translate_gender(patient.gender)}", patient.email, "#{patient.address_1.to_s} #{patient.address_2.to_s}",
              "#{patient.city}", "#{patient.state}",  "#{patient.zip}",
              "#{patient.phone_number}"
          ]
        end
      end
      f.write bom
      f.write(csv_file)
    end
  end

Cosas importantes a tener en cuenta aquí es el modo abierto y bom

open_mode = "w +: UTF-16LE: UTF-8"

bom = "\ xEF \ xBB \ xBF"

Antes de escribir el CSV inserte BOM

f.write bom

f.write (csv_file)

Windows y Mac

El archivo se puede abrir directamente haciendo doble clic.

Linux (ubuntu)

Al abrir un archivo, solicite las opciones de separador -> elija "TAB" ingrese la descripción de la imagen aquí


1

Me enfrenté al mismo problema hace unos días, y no pude encontrar ninguna solución porque no puedo usar la import from csvfunción porque hace que todo esté diseñado como una cadena.

Mi solución fue abrir primero el archivo con notpad ++ y change the encode to ASCII. Luego solo abrí el archivo en Excel y funcionó como se esperaba.


1

En php, simplemente antepone $ bom a su $ csv_string:

$bom = sprintf( "%c%c%c", 239, 187, 191); // EF BB BF
file_put_contents( $file_name, $bom . $csv_string );

Probado con MS Excel 2016, php 7.2.4


0

Esta es una pregunta antigua, pero acabo de encontrarme con un problema similar y la solución puede ayudar a otros:

Tuve el mismo problema al escribir datos de texto CSV en un archivo, luego abrir el archivo .csv resultante en Excel desplaza todo el texto en una sola columna. Después de leer las respuestas anteriores, intenté lo siguiente, que parece solucionar el problema.

Aplique una codificación de UTF-8 cuando cree su StreamWriter. Eso es.

Ejemplo:

using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
   /* ... do stuff .... */
   output.Close();
}

@elmue cuidado de elaborar un poco? ¿Seguramente generar CSV usando la codificación correcta para comenzar asegura que no haya problemas de compatibilidad con Excel más adelante en el flujo de trabajo?
Rex

El código es incorrecto porque no necesita salida. Cierre () si tiene una instrucción using (). Aparte de eso, el CSV de Excel es muy primitivo. No lo usaría en absoluto. Si desea importar en Excel, use una tabla HTML y ábrala en Excel.
Elmue

Gracias por aclarar @Elmue: desafortunadamente me he encontrado con una serie de escenarios (incluidos archivos en unidades de red) donde se requiere un cierre explícito , así como la eliminación. No encontré una razón por la que, creo, recuerdo haber visto una llamada Close()en la Disposepila, pero ahí vamos. También es incorrecto en su declaración sobre la importación de CSV como primitiva, ya que no necesita el enfoque HTML ineficiente que ha sugerido. De hecho, crear pasos programáticos adicionales para tomar datos de texto sin formato, transformarlos en HTML y luego extraerlos en Excel parece contrario a la intuición
Rex

continúa ... Sin embargo, diferentes escenarios tienen diferentes requisitos y mi ejemplo muestra correctamente cómo especificar la codificación como lo solicitó el OP
Rex

Lea nuevamente la pregunta original: "También intenté especificar UTF-8 BOM EF BB BF, pero Excel lo ignora". Probé lo mismo y obtuve el mismo resultado: Excel NO reconoce la lista de materiales UTf8. ¡Intentalo! Escribe un archivo CSV y ponle caracteres griegos o rusos. Luego ábralo en Excel y obtendrá garbarge. Entonces tu respuesta no resuelve nada.
Elmue

0

Si desea que sea completamente automático, un clic o cargar automáticamente en Excel desde una página web, pero no puede generar los archivos de Excel adecuados, le sugiero que busque el formato SYLK como alternativa. OK, no es tan simple como CSV, pero está basado en texto y es muy fácil de implementar y es compatible con UTF-8 sin problemas.

Escribí una clase PHP que recibe los datos y genera un archivo SYLK que se abrirá directamente en Excel simplemente haciendo clic en el archivo (o iniciará automáticamente Excel si escribe el archivo en una página web con el tipo MIME correcto. Incluso puede agregue formato (como negrita, números de formato de 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 tenga más de 100 líneas.

Es muy fácil aplicar ingeniería inversa a SYLK creando una hoja de cálculo simple y guardándola como SYLK y luego leyéndola con un editor de texto. El primer bloque son encabezados y formatos de números estándar que reconocerá (que regurgitará en cada archivo que cree), luego los datos son simplemente una coordenada X / Y y un valor.


0
  1. Descargue e instale LibreOffice Calc
  2. Abra el archivo csv de su elección en LibreOffice Calc
  3. Gracias a Dios que aparece un asistente de importación de texto ...
  4. ... seleccione su delimitador y las opciones de codificación de caracteres
  5. Seleccione los datos resultantes en Calc y copie y pegue en Excel

0

Estoy generando archivos csv desde una aplicación simple de C # y tuve el mismo problema. Mi solución fue asegurarme de 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 me estaban destrozando en Excel:

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

Su kilometraje puede variar: estoy usando .NET 4 y Excel de Office 365.


0

Solución de trabajo para office 365

  • guardar en UTF-16(sin LE, BE)
  • usar separador \t

Código en PHP

$header = ['číslo', 'vytvořeno', 'ěščřžýáíé'];
$fileName = 'excel365.csv';
$fp = fopen($fileName, 'w');
fputcsv($fp, $header, "\t");
fclose($fp);

$handle = fopen($fileName, "r");
$contents = fread($handle, filesize($fileName));
$contents = iconv('UTF-8', 'UTF-16', $contents);
fclose($handle);

$handle = fopen($fileName, "w");
fwrite($handle, $contents);
fclose($handle);

-1

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


-1

Intenté todo lo que pude encontrar en este hilo y similares, nada funcionó completamente. Sin embargo, importar a hojas de google y simplemente descargar como csv funcionó de maravilla. Pruébalo si llegas a mi punto de frustración.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.