É possível forçar o Excel a reconhecer arquivos CSV UTF-8 automaticamente?

455

Estou desenvolvendo uma parte de um aplicativo responsável pela exportação de alguns dados para arquivos CSV. O aplicativo sempre usa UTF-8 devido à sua natureza multilíngue em todos os níveis. Mas abrir esses arquivos CSV (contendo, por exemplo, diacríticos, letras cirílicas, letras gregas) no Excel não alcança os resultados esperados, mostrando algo parecido Г„/Г¤, Г–/Г¶. E não sei como forçar o Excel a entender que o arquivo CSV aberto está codificado em UTF-8. Eu também tentei especificar UTF-8 BOM EF BB BF, mas o Excel ignora isso.

Existe alguma solução alternativa?

PS Quais ferramentas podem se comportar como o Excel?


ATUALIZAR

Devo dizer que confundi a comunidade com a formulação da pergunta. Quando estava fazendo essa pergunta, solicitei uma maneira de abrir um arquivo CSV UTF-8 no Excel sem problemas para o usuário, de maneira fluente e transparente. No entanto, usei uma formulação errada pedindo fazê-lo automaticamente . Isso é muito confuso e entra em conflito com a automação de macro do VBA. Há duas respostas para essas perguntas que eu mais aprecio: a primeira resposta de Alex https://stackoverflow.com/a/6002338/166589 e aceitei essa resposta; e o segundo por Mark https://stackoverflow.com/a/6488070/166589que apareceram um pouco mais tarde. Do ponto de vista da usabilidade, o Excel parecia não ter um bom suporte ao usuário UTF-8 CSV, portanto considero as duas respostas corretas e aceitei a resposta de Alex primeiro, porque realmente afirmava que o Excel não era capaz de fazer isso. isso de forma transparente. É com isso que eu confundi automaticamente aqui. A resposta de Mark promove uma maneira mais complicada para usuários mais avançados alcançarem o resultado esperado. Ambas as respostas são ótimas, mas a de Alex se encaixa um pouco melhor na minha pergunta não claramente especificada.


ATUALIZAÇÃO 2

Cinco meses depois da última edição, notei que a resposta de Alex desapareceu por algum motivo. Eu realmente espero que não tenha sido uma questão técnica e espero que não haja mais discussões sobre qual resposta é maior agora. Então, estou aceitando a resposta de Mark como a melhor.

Lyubomyr Shaydariv
fonte
1
Você pode usar arquivos delimitados por tabulações? Nesse caso, você pode ter mais sorte.
Tim Perry
8
Office 2010+: melhores trabalhos: UTF-16LE com BOM e \tcomo delimitador. Funcionará na configuração do Excel em inglês e não em inglês. Pode pressionar Ctrl-Ssem selecionar o formato do arquivo, etc. Preservará os caracteres Unicode.
Sebastian
@Duncan falando francamente, estou confuso e é difícil "julgar". Aceitei a resposta de alex há mais de 2 anos (Q e A, em 14 de maio), e Mark respondeu sugerindo uma solução alternativa complicada (na verdade, eu não a verifiquei) que surpreendentemente marcou mais pontos na minha pergunta que surpreendentemente se tornou popular também. Na verdade, recusamos o suporte ao Excel em meu projeto há muito tempo, e não quero diminuir a pontuação de reputação de alex, porque o Excel parecia, e provavelmente ainda parece (por favor me corrija se estiver errado), manipular incorretamente o CSV. É difícil dizer desculpe.
Lyubomyr Shaydariv
2
A resposta de Alex foi excluída por um moderador. Nenhuma explicação foi dada, mas se você tiver reputação suficiente, ainda poderá vê-la.
Mark Ransom
1
Como as máquinas do tempo ainda não existem, é preciso apenas discordar.
Osexpert

Respostas:

398

Alex está correto, mas como você precisa exportar para csv, pode dar aos usuários esse conselho ao abrir os arquivos csv:

  1. Salve o arquivo exportado como um CSV
  2. Abra o Excel
  3. Importe os dados usando Dados -> Importar Dados Externos -> Importar Dados
  4. Selecione o tipo de arquivo "csv" e navegue até o seu arquivo
  5. No assistente de importação, altere o File_Origin para "65001 UTF" (ou escolha o identificador de caracteres de idioma correto)
  6. Alterar o delimitador para vírgula
  7. Selecione para onde importar e Concluir

Dessa forma, os caracteres especiais devem aparecer corretamente.

Marca
fonte
163

O marcador de ordem de bytes UTF-8 indicará ao Excel 2007+ o fato de você estar usando UTF-8. (Veja este post do SO ).

Caso alguém tenha os mesmos problemas que eu, a classe de codificação UTF8 do .NET não gera um marcador de ordem de bytes em uma GetBytes()chamada. Você precisa usar fluxos (ou uma solução alternativa ) para obter a BOM para saída.

StriplingWarrior
fonte
18
Inserir uma lista técnica UTF-8 parece ser o caminho a seguir. Depois disso é transparente.
vy32
12
Eu uso o Notepad ++ para converter facilmente o arquivo .csv a partir UTF-8deUTF-8 with BOM
Sébastien
3
Sim - melhor solução. Muitas postagens confusas sobre como definir cabeçalhos nas respostas http. Isso resolve o problema. O mesmo pode ser visto ao abrir o arquivo no bloco de notas e salvá-lo novamente usando a opção UTF-8. Também adiciona o marcador de ordem de bytes.
user369142
1
@ Elmue: Imaginei que talvez (como eu) ele pensasse que estava salvando com um marcador de ordem de bytes, mas não porque algumas bibliotecas não funcionassem como ele pensava. Achei interessante acrescentar esta resposta e, evidentemente, várias outras pessoas também a acharam útil. De qualquer forma, parece uma resposta melhor do que dizer para não usar CSV ou instruir os usuários como abrir o arquivo de alguma maneira bizarra.
StriplingWarrior
1
A versão para Mac do Excel ainda parece ignorar a lista técnica. (Excel para Mac 2011.)
Thomas Andrews
74

O bug com a lista técnica ignorada parece ter sido corrigido para o Excel 2013. Eu tive o mesmo problema com letras cirílicas, mas a adição de caracteres da lista técnica \uFEFFajudou.

sshturma
fonte
8
Como adicionei \ uFEFF no início do meu arquivo CSV (gerado em Java), o Excel pode abri-los corretamente! Thx
Galdo
16
isso também resolveu meu problema, no php fica assim $utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText:;
Abdullah
@updola muito obrigado por este comentário, me salvou horas
Nathan hayfield
UTF-8, por definição, não usa nem deve usar os caracteres da BOM. A maneira como o Excel lê a BOM reduz a vantagem do UTF-8 sobre o Unicode, que é compatibilidade retroativa com o ASCII. A adição da lista técnica fará com que o Excel funcione, mas interrompe outras leituras apropriadas do arquivo UTF-8 / ASCII.
Nelson Nelson
1
\ FE \ FF torna o Mac OS Excel 2016 o arquivo inteiro como hieróglifos japoneses.
Nakilon
56

É incrível que haja tantas respostas, mas nenhuma responda à pergunta:

"Quando estava fazendo essa pergunta, solicitei uma maneira de abrir um arquivo CSV UTF-8 no Excel sem problemas para o usuário ..."

A resposta marcada como resposta aceita com mais de 200 votos positivos é inútil para mim porque não quero fornecer aos meus usuários um manual de como configurar o Excel. Além disso: este manual será aplicado a uma versão do Excel, mas outras versões do Excel têm menus e diálogos de configuração diferentes. Você precisaria de um manual para cada versão do Excel.

Portanto, a questão é como fazer com que o Excel mostre dados UTF8 com um simples clique duplo?

Bem, pelo menos no Excel 2007, isso não é possível se você usar arquivos CSV porque a BOM UTF8 é ignorada e você verá apenas lixo. Isso já faz parte da questão de Lyubomyr Shaydariv:

"Eu também tentei especificar UTF-8 BOM EF BB BF, mas o Excel ignora isso."

Faço a mesma experiência: gravar dados em russo ou grego em um arquivo UTF8 CSV com resultados de lista técnica em lixo no Excel:

Conteúdo do arquivo UTF8 CSV:

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

Resultado no Excel 2007:

CSV UTF8 Excel

Uma solução é não usar CSV. Esse formato é implementado de maneira tão estúpida pela Microsoft que depende das configurações da região no painel de controle se vírgula ou ponto- e- vírgula for usado como separador. Portanto, o mesmo arquivo CSV pode abrir corretamente em um computador, mas em outro computador não. "CSV" significa " Valores Separados por Vírgula ", mas, por exemplo, em um Windows alemão por ponto-e-vírgula deve ser usado como separador, enquanto a vírgula não funciona. (Aqui deve ser nomeado SSV = valores separados por ponto e vírgula). Os arquivos CSV não podem ser trocados entre versões de idiomas diferentes do Windows. Este é um problema adicional para o problema UTF-8.

O Excel existe há décadas. É uma pena que a Microsoft não tenha conseguido implementar uma coisa tão básica como a importação de CSV em todos esses anos.


No entanto, se você colocar os mesmos valores em um arquivo HTML e salvá-lo como arquivo UTF8 com BOM com a extensão de arquivo XLS , obterá o resultado correto.

Conteúdo do arquivo 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 no Excel 2007:

UTF8 HTML Excel

Você pode até usar cores em HTML, que o Excel mostrará corretamente.

<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 no Excel 2007:

UTF8 HTML Excel

Nesse caso, apenas a própria tabela possui uma borda e linhas pretas. Se você deseja que TODAS as células exibam linhas de grade, isso também é possível em 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>

Esse código ainda permite especificar o nome da planilha (aqui "MySuperSheet")

Resultado no Excel 2007:

insira a descrição da imagem aqui

Elmue
fonte
1
E também é incrível que as pessoas ainda atendam. :) No entanto, eu argumentaria que o CSV está morto: o CSV é um formato de streaming simples e mortal e, quando eu estava nesse projeto, também o usamos muito para a interação de componentes. Eu nunca usaria o formato HTML por causa de sua natureza muito representativa e nunca consegui fazer com que os usuários desse projeto exportassem dados para HTML apenas para torná-los compatíveis com o Excel. O Excel foi péssimo no UTF-8 CSV, e não faço ideia do que mudou 5 anos desde então. Mas esses arquivos delimitados por vírgula, ponto-e-vírgula e tabulação são uma verdadeira loucura, eu acho.
Lyubomyr Shaydariv
5
Não é incrível que as pessoas ainda respondam sua pergunta porque o Google as traz para cá: todas com a mesma pergunta: como faço para que o Excel estúpido faça o que eu quero? Digite 3 palavras no Google: "excel csv utf8" e sua pergunta é o PRIMEIRO resultado em todo o mundo. Você escreveu um best-seller!
Elmue
8
Como você dedicou um tempo para apontar como nenhuma das outras respostas aqui faz com que o Excel abra um arquivo CSV corretamente, vale a pena mencionar que essa resposta também não faz isso. A resposta originalmente aceita (que foi excluída por um moderador) recomenda exportar os dados para um arquivo do Excel diretamente ou exportar um arquivo HTML e permitir que os usuários abram o arquivo no Excel. Qualquer uma dessas soluções é menos invasiva do que salvar um arquivo HTML com uma extensão de arquivo XLS, mas nenhuma resposta foi proposta que realmente responda à pergunta.
StriplingWarrior
3
@ Guerreiro: "..mas nenhuma resposta foi proposta que realmente responde à pergunta." Isso não está correto. Eu respondi a essa pergunta: pelo menos no Excel 2007, NÃO É POSSÍVEL. Esta é a resposta definitiva. Se o Excel ignora a lista técnica UTF8 e interpreta os dados como ANSI, não há como importar, por exemplo, texto em grego ou russo para o Excel via CSV com um simples clique duplo no arquivo (que era a pergunta: "sem problemas para o usuário" ) O que proponho é uma solução funcional que funcione com TODAS as versões do Excel com um clique duplo e não requer etapas adicionais nos menus do Excel.
Elmue
2
Isso não apenas não responde à pergunta, como é completamente errado afirmar que o CSV é "legado" e "morto". Só porque você não vê o uso para isso, não significa que está morto. Além disso, você claramente não entende sua história ou quão amplamente é usada atualmente. Isso é melhor que XML (devido a tamanhos de pacotes menores) e o problema aqui é como a Microsoft simplesmente não segue um padrão para o formato UTF8. A resposta correta seria usar o escritório aberto e não a Microsoft, pois a Microsoft nunca foi boa em codificação em primeiro lugar.
Jeremy
49

Usamos esta solução alternativa:

  1. Conversão CSV para UTF-16 LE
  2. Inserir lista técnica no início do arquivo
  3. Use a guia como separador de campos
e-zinco
fonte
1
Obrigado! Eu tentei todas as outras respostas neste tópico, mas a conversão para UTF-8 simplesmente não funcionou. Quando tentei o UTF-16 com BOM, ele funcionou instantaneamente.
Husky
Para o Excel 2011 para Mac eu era bem sucedido com pequenos arquivos CSV endian UTF-16
multidynamic
Obrigado, esta solução é excelente para fornecer aos meus usuários um csv unicode que eles podem abrir no Excel.
user1073075
21

Teve os mesmos problemas com arquivos CSV gerados por PHP. O Excel ignorou a BOM quando o Separador foi definido "sep=,\n"no início do conteúdo (mas é claro após a BOM).

Portanto, adicionar uma BOM ( "\xEF\xBB\xBF") no início do conteúdo e definir o ponto-e-vírgula como separador via fputcsv($fh, $data_array, ";");faz o truque.

Ixtlilton
fonte
13

Eu tive o mesmo problema no passado (como produzir arquivos que o Excel pode ler e outras ferramentas também podem ler). Eu estava usando TSV em vez de CSV, mas o mesmo problema com codificações surgiu.

Não consegui encontrar nenhuma maneira de fazer o Excel reconhecer o UTF-8 automaticamente, e não estava disposto / capaz de infligir aos consumidores dos arquivos instruções complicadas de como abri-los. Então, eu os codifiquei como UTF-16le (com uma lista técnica) em vez de UTF-8. O dobro do tamanho, mas o Excel pode reconhecer a codificação. E eles se comprimem bem, então o tamanho raramente (mas infelizmente nunca) importa.

Steve Jessop
fonte
É uma pergunta antiga, mas estou feliz que as pessoas ainda respondam. Obrigado. :)
Lyubomyr Shaydariv
1
@LyubomyrShaydariv: desde que respondi a essa pergunta, um colega me disse que o último Excel identifica arquivos CSV UTF-8, desde que tenham uma lista técnica inicial. Assim, em poucos anos, quando todos no mundo (ou de qualquer maneira, todos nós entregar os arquivos para) está nessa versão do Excel ou melhor, eu poderia ser capaz de mudar a minha codificação :-)
Steve Jessop
Estranho, para mim, não funciona. Transforma os personagens em símbolos chineses ... (que é suposto ser hebraico)
Veverke
Eu tinha caracteres chineses no Excel quando salvei em "UTF-16 BE with BOM". Quando tentei "UTF-16 LE with BOM", funcionou! Eu usei Sublime Text para testar.
Henno 07/04
12

Pergunta antiga, mas heck, a solução mais simples é:

  1. Abrir CSV no bloco de notas
  2. Salvar como -> selecione a codificação correta
  3. Abra o novo arquivo
Aki
fonte
1
Qual versão do Excel você usa?
precisa saber é o seguinte
1
Brilhante, simplesmente funciona e resolve o problema (pelo menos para mim)
Auberon Vacher
1
Não, porque o problema é fazer com que o Excel abra o arquivo .csv como um arquivo csv. Quero dizer, eu tenho um processo onde eu gero arquivos csv. O usuário só seria obrigado a abrir os arquivos. Aqui ele / ela é obrigado a fazer mais do que isso.
Veverke
2
@Veverke, se você gerar arquivos regularmente, essa não é a melhor solução. Mas se for único, essa resposta é perfeita. Funciona porque o Bloco de Notas colocará a BOM no início de um arquivo UTF-8 ou UTF-16.
Mark Ransom
Funciona como um encanto. ((:
user2925795 28/0319
10

Como eu publiquei em http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html :

Informe ao desenvolvedor do software responsável por gerar o CSV para corrigi-lo. Como solução rápida, você pode usar gsed para inserir a BOM UTF-8 no início da string:

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

Este comando insere a lista técnica UTF-4, se não estiver presente. Portanto, é um comando idempotente. Agora você deve poder clicar duas vezes no arquivo e abri-lo no Excel.

Nestor Urquiza
fonte
Graças isso consertou. Acabei de converter o csv ';' separado para UTF-BOM no Notepad ++ e conhecido se destaca, abre-o corretamente.
RandomGuy
Exatamente o que era necessário! Aqui está um ponteiro para como implementar isso no PHP stackoverflow.com/questions/25686191/…
EFC
Esta é a solução alternativa para o Excel, que não conseguiu reconhecer os chareacters utf nos arquivos csv. Portanto, esta correção para corrigir o problema do Excel.
cobp 6/05/19
Isso funcionou para a versão grega do Excel 2007, com separadores de vírgula. Obrigado.
NameOfTheRose 15/11/19
Mudou de codificação para 'UTF-16LE' em fs.createWriteStream (fileName, {codificar: 'UTF-16LE'}) e excel abriu o arquivo CSV corretamente
shukla rahul
9

Você pode converter o arquivo .csv em UTF-8 com BOM via Notepad ++:

  1. Abra o arquivo no Notepad ++ .
  2. Vá para o menu EncodingConvert to UTF-8.
  3. Vá para o menu FileSave.
  4. Feche o Notepad ++.
  5. Abra o arquivo no Excel.

Trabalhou no Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) de 64 bits do Microsoft Office Professional Plus 2013 no Windows 8.1 com local para programas não Unicode definidos como "Alemão (Alemanha)".

Christopher Adi Pascual
fonte
1
Fiz o que você disse, não funcionou. Convertendo / codificando, definindo conjuntos de caracteres, nada funcionou no meu caso. O arquivo de importação para as folhas do Google, o download como csv, funcionou perfeitamente.
Bem-
1
Eu tive que convertê-lo com Encoding -> Cinvert ti UTF-8-BOM versão Excel 2016
Igor Vuković
4

Macro vba simples para abrir arquivos de texto e 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

Origem: = 65001 é UTF-8. Vírgula: verdadeiro para arquivos .csv distribuídos em colunas

Salve-o no Personal.xlsb para que ele esteja sempre disponível. Personalize a barra de ferramentas do Excel adicionando um botão de chamada macro e abra arquivos a partir daí. Você pode adicionar mais formatação à macro, como ajuste automático da coluna, alinhamento, etc.

alc
fonte
2
Obrigado. Infelizmente, esta é a sugestão para usuários realmente avançados do Excel, e o que eu pretendo, fazendo esta pergunta, é fazer com que o Excel faça isso automaticamente.
Lyubomyr Shaydariv 20/03/12
Tentei usar esse trecho de código, mas ele não funciona para mim. Eu uso o Excel 2013.
Sharunas Bielskis
3

Apenas para ajudar os usuários interessados ​​em abrir o arquivo no Excel que atendem a esse segmento como eu.

Eu usei o assistente abaixo e funcionou bem para mim, importando um arquivo UTF-8. Não é transparente, mas útil se você já possui o arquivo.

  1. Abra o Microsoft Excel 2007.
  2. Clique na opção da barra de menus Dados.
  3. Clique no ícone Do texto.
  4. Navegue para o local do arquivo que você deseja importar. Clique no nome do arquivo e, em seguida, clique no botão Importar. A janela Assistente para importação de texto - Etapa 1 ou 3 será exibida na tela.
  5. Escolha o tipo de arquivo que melhor descreve seus dados - Largura Delimitada ou Fixa.
  6. Escolha 65001: Unicode (UTF-8) na lista suspensa que aparece ao lado de Origem do arquivo.
  7. Clique no botão Avançar para exibir a janela Assistente para importação de texto - Etapa 2 ou 3.
  8. Coloque uma marca de seleção ao lado do delimitador usado no arquivo que você deseja importar para o Microsoft Excel 2007. A janela Visualização de dados mostrará como seus dados serão exibidos com base no delimitador escolhido.
  9. Clique no botão Avançar para exibir o Assistente para importação de texto - Etapa 3 de 3.
  10. Escolha o formato de dados apropriado para cada coluna de dados que você deseja importar. Você também tem a opção de não importar uma ou mais colunas de dados, se desejar.
  11. Clique no botão Concluir para concluir a importação dos dados para o Microsoft Excel 2007.

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

Wagner Bertolini Junior
fonte
3

Sim, isso é possível. Como observado anteriormente por vários usuários, parece haver um problema com o Excel lendo a Marca de Ordem de Byte correta quando o arquivo é codificado em UTF-8. Com o UTF-16, ele não parece ter um problema, portanto é endêmico ao UTF-8. A solução que eu uso para isso é adicionar a BOM, DUAS VEZES. Para isso, eu executo o seguinte comando sed duas vezes:

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

, onde o curinga pode ser substituído por qualquer nome de arquivo. No entanto, isso leva a uma mutação do sep = no início do arquivo .csv. O arquivo .csv será aberto normalmente no Excel, mas com uma linha extra com "sep =" na primeira célula. O "sep =" também pode ser removido no arquivo .csv de origem, mas ao abrir o arquivo com o VBA, o delimitador deve ser especificado:

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

O formato 6 é o formato .csv. Defina Local como true, caso haja datas no arquivo. Se Local não estiver definido como verdadeiro, as datas serão americanizadas, o que, em alguns casos, corromperá o formato .csv.

TheCharlatan
fonte
1
ao executar o comando sed, recebo: "sed: opção inválida - 'I'", acho que deveria ser 'i'
BiAiB 25/02
2

Esta é a minha solução de trabalho:

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

A chave é Origem: = 65001

Nobilis
fonte
2

Sim, é possível. Ao escrever o fluxo criando o csv, a primeira coisa a fazer é:

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)
zax
fonte
Você não leu a pergunta! Lyubomyr Shaydariv escreveu: "Eu também tentei especificar UTF-8 BOM EF BB BF, mas o Excel ignora isso."
Elmue
Este é um código de trabalho. Se você gravar arquivos UTF-8 de aplicativos .Net com esse lead, o Excel reconhecerá o arquivo como UTF8.
Zax 28/11
Pode estar no SEU Excel, ele funciona. Mas, pelo menos no Excel 2007, a lista técnica é completamente ignorada. Portanto, se você pretende escrever um código que funcione em todas as versões do Excel, seu código não é útil.
Elmue # 1/16
2

Uma lista realmente incrível de respostas, mas como uma delas ainda está faltando, vou mencioná-la aqui: abra o arquivo csv com as folhas do Google e salve-o no computador local como um arquivo do Excel.

Ao contrário da Microsoft, o Google conseguiu oferecer suporte a arquivos UTF-8 csv, portanto, ele simplesmente funciona para abrir o arquivo lá. E a exportação para o formato Excel também funciona. Portanto, mesmo que essa não seja a solução preferida para todos, é bastante segura e o número de cliques não é tão alto quanto parece, especialmente quando você já está logado no Google.

Christoph
fonte
2

Isso não está respondendo com precisão à pergunta, mas como eu me deparei com isso e as soluções acima não funcionavam para mim ou tinham requisitos que não consegui atender, aqui está outra maneira de adicionar a lista técnica quando você tiver acesso ao vim:

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

oi eu estou usando ruby ​​on trilhos para geração csv. Em nosso aplicativo, planejamos usar o idioma multilíngue (I18n) e enfrentamos um problema ao exibir o conteúdo I18n no arquivo CSV do Windows Excel.

Foi bom com Linux (Ubuntu) e mac.

Identificamos que o Windows Excel precisa ser importado novamente para visualizar os dados reais. Durante a importação, teremos mais opções para escolher o conjunto de caracteres.

Mas isso não pode ser educado para todos os usuários, por isso a solução que procuramos é abrir apenas com um clique duplo.

Em seguida, identificamos a maneira de mostrar dados pelo modo aberto e surgir no windows excel com a ajuda do aghuddleston gist . Adicionado na referência.

Exemplo de conteúdo I18n

No Mac e Linux

Sueco: Förnamn Inglês: Nome

No Windows

Sueco: Fõrnamn Inglês: Nome

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

O que é importante observar aqui é o modo aberto e bom

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

bom = "\ xEF \ xBB \ xBF"

Antes de escrever o CSV, insira a BOM

f.write bom

f.write (csv_file)

Windows e Mac

O arquivo pode ser aberto diretamente clicando duas vezes.

Linux (ubuntu)

Ao abrir um arquivo, solicite as opções do separador -> escolha "TAB" insira a descrição da imagem aqui

praaveen
fonte
1

Eu enfrentei o mesmo problema há alguns dias e não consegui encontrar nenhuma solução porque não posso usar o import from csvrecurso porque faz com que tudo seja denominado como string.

Minha solução foi primeiro abrir o arquivo com notpad ++ e change the encode to ASCII. Em seguida, basta abrir o arquivo no excel e funcionou como esperado.

lpinto.eu
fonte
1

No php, você apenas adiciona $ bom ao seu $ csv_string:

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

Testado com o MS Excel 2016, php 7.2.4

vess
fonte
0

Esta é uma pergunta antiga, mas acabei de encontrar um problema semelhante e a solução pode ajudar outras pessoas:

Teve o mesmo problema ao gravar dados de texto CSV em um arquivo e, em seguida, abrir o .csv resultante no Excel muda todo o texto em uma única coluna. Depois de ler as respostas acima, tentei o seguinte, o que parece resolver o problema.

Aplique uma codificação de UTF-8 ao criar seu StreamWriter. É isso aí.

Exemplo:

using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
   /* ... do stuff .... */
   output.Close();
}
Rex
fonte
@ Elmue cuidado para elaborar um pouco? A saída segura de CSV usando a codificação correta garante que não haja problemas de compatibilidade com o Excel posteriormente no fluxo de trabalho?
Rex
O código está errado porque você não precisa de output.Close () se você tiver uma instrução using (). Além disso, o inport CSV do Excel é muito primitivo. Eu não usaria isso de jeito nenhum. Se você deseja importar no Excel, use uma tabela HTML e abra-a no Excel.
Elmue
Obrigado por esclarecer o @Elmue - infelizmente, já encontrei vários cenários (incluindo arquivos em unidades de rede) em que é necessário um fechamento explícito e a eliminação. Não encontrei uma razão para isso, pois acho que me lembro de ter visto uma chamada Close()na Disposepilha, mas lá vamos nós. Você também está incorreto em sua declaração sobre a importação de CSV ser primitiva, pois não precisa da abordagem HTML ineficiente que você sugeriu. Na verdade criando etapas programáticas adicionais para levar dados de texto simples, transformar em HTML , em seguida, puxar para Excel parece contra-intuitivo
Rex
continua ... No entanto, cenários diferentes têm requisitos diferentes e meu exemplo mostra corretamente como especificar a codificação conforme o OP solicitado
Rex
Por favor, leia a pergunta original novamente: "Eu também tentei especificar UTF-8 BOM EF BB BF, mas o Excel ignora isso." Testei o mesmo e cheguei ao mesmo resultado: O Excel NÃO reconhece a lista técnica UTf8. Tente! Escreva um arquivo CSV e coloque caracteres gregos ou russos nele. Em seguida, abra isso no Excel e você obterá gargarge. Portanto, sua resposta não resolve nada.
Elmue
0

Se você deseja torná-lo totalmente automático, com um clique, ou carregar automaticamente no Excel a partir de uma página da web, mas não pode gerar arquivos adequados do Excel, sugiro que olhe o formato SYLK como uma alternativa. OK, não é tão simples quanto o CSV, mas é baseado em texto e muito fácil de implementar e suporta UTF-8 sem problemas.

Eu escrevi uma classe PHP que recebe os dados e gera um arquivo SYLK que será aberto diretamente no Excel apenas clicando no arquivo (ou iniciará o Excel automaticamente se você gravar o arquivo em uma página da Web com o tipo MIME correto. Você pode até adicione formatação (como negrito, formate números de maneiras particulares, etc.) e altere os tamanhos das colunas ou as colunas de tamanho automático no texto nas colunas e, no conjunto, todo o código provavelmente não terá mais que 100 linhas.

É muito fácil fazer engenharia reversa do SYLK criando uma planilha simples e salvando-o como SYLK e depois lendo-o com um editor de texto. O primeiro bloco são os cabeçalhos e os formatos de número padrão que você reconhecerá (que você acaba de regurgitar em todos os arquivos criados); os dados são simplesmente uma coordenada X / Y e um valor.

Cloudranger
fonte
0
  1. Baixe e instale o LibreOffice Calc
  2. Abra o arquivo csv de sua escolha no LibreOffice Calc
  3. Graças a Deus que um assistente de importação de texto aparece ...
  4. ... selecione suas opções de delimitador e codificação de caracteres
  5. Selecione os dados resultantes no Calc e copie e cole no Excel
Dan
fonte
0

Estou gerando arquivos csv a partir de um aplicativo c # simples e tive o mesmo problema. Minha solução foi garantir que o arquivo seja gravado com a codificação UTF8, assim:

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

Originalmente, eu tinha o seguinte código, com o qual os acentos ficam bem no Notepad ++, mas estavam sendo mutilados no Excel:

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

Sua milhagem pode variar - estou usando o .NET 4 e o Excel do Office 365.

yoyo
fonte
0

Solução de trabalho para o Office 365

  • salvar em UTF-16(sem LE, BE)
  • use separador \t

Código em 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);
podolinek
fonte
-1

Primeiro salve a planilha do Excel como texto Unicode. Abra o arquivo TXT usando o Internet Explorer e clique em "Salvar como" Codificação TXT - escolha a codificação apropriada, ou seja, para Win Cyrillic 1251

Bragabondio
fonte
-1

Eu tentei tudo o que pude encontrar neste tópico e similar, nada funcionou completamente. No entanto, importar para o google sheets e simplesmente fazer o download como csv funcionou como um encanto. Experimente se você chegar ao meu ponto de frustração.

pakalbekim
fonte