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.
\t
como delimitador. Funcionará na configuração do Excel em inglês e não em inglês. Pode pressionarCtrl-S
sem selecionar o formato do arquivo, etc. Preservará os caracteres Unicode.Respostas:
Alex está correto, mas como você precisa exportar para csv, pode dar aos usuários esse conselho ao abrir os arquivos csv:
Dessa forma, os caracteres especiais devem aparecer corretamente.
fonte
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.fonte
UTF-8
deUTF-8 with BOM
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
\uFEFF
ajudou.fonte
$utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText
:;É incrível que haja tantas respostas, mas nenhuma responda à pergunta:
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:
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:
Resultado no Excel 2007:
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:
Resultado no Excel 2007:
Você pode até usar cores em HTML, que o Excel mostrará corretamente.
Resultado no Excel 2007:
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:
Esse código ainda permite especificar o nome da planilha (aqui "MySuperSheet")
Resultado no Excel 2007:
fonte
Usamos esta solução alternativa:
fonte
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 viafputcsv($fh, $data_array, ";");
faz o truque.fonte
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.
fonte
Pergunta antiga, mas heck, a solução mais simples é:
fonte
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:
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.
fonte
Você pode converter o arquivo .csv em UTF-8 com BOM via Notepad ++:
Encoding
→Convert to UTF-8
.File
→Save
.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)".
fonte
Macro vba simples para abrir arquivos de texto e csv utf-8
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.
fonte
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.
Fonte: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0
fonte
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:
, 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:
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.
fonte
Esta é a minha solução de trabalho:
A chave é Origem: = 65001
fonte
Sim, é possível. Ao escrever o fluxo criando o csv, a primeira coisa a fazer é:
fonte
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.
fonte
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:
fonte
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
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"
fonte
Eu enfrentei o mesmo problema há alguns dias e não consegui encontrar nenhuma solução porque não posso usar o
import from csv
recurso 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.fonte
No php, você apenas adiciona $ bom ao seu $ csv_string:
Testado com o MS Excel 2016, php 7.2.4
fonte
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:
fonte
Close()
naDispose
pilha, 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-intuitivoSe 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.
fonte
fonte
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:
Originalmente, eu tinha o seguinte código, com o qual os acentos ficam bem no Notepad ++, mas estavam sendo mutilados no Excel:
Sua milhagem pode variar - estou usando o .NET 4 e o Excel do Office 365.
fonte
Solução de trabalho para o Office 365
UTF-16
(sem LE, BE)\t
Código em PHP
fonte
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
fonte
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.
fonte