Estou exportando dados programaticamente (usando o PHP 5.2) para um arquivo de teste .csv.
Dados de exemplo: Numéro 1
(observe o e acentuado). Os dados são utf-8
(sem lista técnica anexada).
Quando abro este arquivo no MS Excel, é exibido como Numéro 1
.
Consigo abrir isso em um editor de texto (UltraEdit) que o exibe corretamente. UE informa que o personagem é decimal 233
.
Como posso exportar dados de texto em um arquivo .csv para que o MS Excel os processe corretamente , de preferência sem forçar o uso do assistente de importação ou configurações não padrão do assistente?
excel
encoding
csv
diacritics
Freddo411
fonte
fonte
Respostas:
Um arquivo UTF8 formatado corretamente pode ter uma marca de ordem de bytes como seus três primeiros octetos. Esses são os valores hexadecimais 0xEF, 0xBB, 0xBF. Esses octetos servem para marcar o arquivo como UTF8 (pois não são relevantes como informações de "ordem de bytes"). 1 Se essa lista técnica não existir, resta ao consumidor / leitor deduzir o tipo de codificação do texto. Os leitores que não são capazes de UTF8 lerão os bytes como alguma outra codificação, como Windows-1252, e exibirão os caracteres

no início do arquivo.Há um bug conhecido em que o Excel, ao abrir arquivos UTF8 CSV por associação de arquivo, assume que eles estão em uma codificação de byte único, desconsiderando a presença da lista técnica do UTF8. Isso não pode ser corrigido por nenhuma página de código padrão do sistema ou configuração de idioma. A lista técnica não indica no Excel - simplesmente não funciona. (Um relatório minoritário alega que a BOM às vezes aciona o assistente "Importar texto".) Esse bug parece existir no Excel 2003 e versões anteriores. A maioria dos relatórios (entre as respostas aqui) diz que isso foi corrigido no Excel 2007 e mais recente.
Observe que você sempre pode * abrir corretamente arquivos UTF8 CSV no Excel usando o assistente "Importar texto", que permite especificar a codificação do arquivo que você está abrindo. Claro que isso é muito menos conveniente.
Os leitores desta resposta provavelmente estão em uma situação em que não suportam particularmente o Excel <2007, mas estão enviando texto UTF8 bruto para o Excel, que está interpretando mal e borrifando seu texto com
Ã
outros caracteres semelhantes do Windows-1252. Adicionar a BOM UTF8 é provavelmente a melhor e mais rápida correção.Se você está preso aos usuários do Excels mais antigo, e o Excel é o único consumidor de seus CSVs, é possível solucionar isso exportando UTF16 em vez de UTF8. O Excel 2000 e 2003 clicam duas vezes para abrir corretamente. (Alguns outros editores de texto podem ter problemas com o UTF16, portanto, talvez seja necessário ponderar suas opções com cuidado.)
* Exceto quando não é possível, (pelo menos) o Assistente de Importação do Excel 2011 para Mac nem sempre funciona com todas as codificações, independentemente do que você diz. </anecdotal-evidence> :)
fonte

na primeira célula; ou algo completamente diferente.
). Isso ajuda apenas a adivinhar algoritmos e a formatos de arquivo que permitem especificamente isso (por exemplo, XML). A desvantagem de incluir uma lista técnica falsa em arquivos UTF-8 é que você quebra a compatibilidade com ASCII (um importante ponto de venda para UTF-8) Muitas ferramentas de texto ignorantes de codificação se deparam com uma lista inicial falsa inicial inesperada.A adição de uma lista técnica (\ uFEFF) funcionou para mim (Excel 2007), pois o Excel reconheceu o arquivo como UTF-8. Caso contrário, salvar e usar o assistente de importação funciona, mas é menos ideal.
fonte
\ufeff
é um UTF-16 (BE) BOM não uma BOM UTF-8Abaixo está o código PHP que uso no meu projeto ao enviar o Microsoft Excel para o usuário:
ATUALIZADO: aprimoramento do nome do arquivo e erro corrigem o cálculo do comprimento correto. Graças a TRiG e @ ivanhoe011
fonte
'Content-Disposition: attachment; filename="'.$filename.'.csv"'
porque o Firefox deseja aspas duplas, ou então ele cortará seu nome de arquivo após um espaço.text/csv
), mas chamando-o de Excel (application/vnd.ms-excel
)?header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));
?A resposta para todas as combinações de versões do Excel (2003 + 2007) e tipos de arquivo
A maioria das outras respostas aqui se refere apenas à versão do Excel e não o ajudará necessariamente, porque a resposta delas talvez não seja verdadeira para a sua versão do Excel.
Por exemplo, adicionar o caractere BOM apresenta problemas com o reconhecimento automático do separador de colunas, mas não em todas as versões do Excel.
Existem 3 variáveis que determinam se ele funciona na maioria das versões do Excel:
Alguém estóico da SAP tentou todas as combinações e relatou o resultado. Resultado final? Use UTF16le com BOM e caractere de tabulação como separador para que ele funcione na maioria das versões do Excel.
Você não acredita em mim? Eu também não, mas leia aqui e chore: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator
fonte
sep=,
ou o que você deseja usar? Se você já está adicionando a lista técnica, presumo que você não seja avesso a adicionar coisas ao arquivo.selecione recepção UTF-8 ao importar. se você usa o Office 2007, é onde você o escolhe: logo após abrir o arquivo.
fonte
Faça eco da lista técnica UTF-8 antes de enviar dados CSV. Isso corrige todos os problemas de caracteres no Windows, mas não funciona no Mac.
Funciona para mim porque preciso gerar um arquivo que será usado apenas em PCs com Windows.
fonte
O UTF-8 não funciona para mim no escritório 2007 sem nenhum service pack, com ou sem BOM (U + ffef ou 0xEF, 0xBB, 0xBF, nem funciona) a instalação do sp3 faz o UTF-8 funcionar quando 0xEF, 0xBB, 0xBF BOM é anexado.
O UTF-16 funciona ao codificar em python usando "utf-16-le" com uma BOM 0xff 0xef anexada e usando tab como separador. Eu tive que escrever manualmente a lista técnica e, em seguida, usar "utf-16-le" em vez de "utf-16"; caso contrário, cada encode () precedeu a lista técnica a todas as linhas gravadas que apareciam como lixo na primeira coluna do segunda linha e depois.
não sei dizer se o UTF-16 funcionaria sem nenhum sp instalado, pois não posso voltar agora. suspiro
Isso é no Windows, não sei sobre o Office para MAC.
nos dois casos de trabalho, a importação funciona ao iniciar um download diretamente do navegador e o assistente de importação de texto não interfere, funciona como você esperaria.
fonte
Como Fregal disse, \ uFEFF é o caminho a percorrer.
fonte
Também notei que a pergunta foi "respondida" há algum tempo, mas não entendo as histórias que dizem que você não pode abrir um arquivo csv codificado em utf8 com êxito no Excel sem usar o assistente de texto.
Minha experiência reproduzível: Digite
Old MacDonald had a farm,ÈÌÉÍØ
no Bloco de notas, pressione Enter e, em seguida, Salvar como (usando a opção UTF-8).Usando o Python para mostrar o que realmente está lá:
Boa. O bloco de notas colocou uma lista técnica na frente.
Agora entre no Windows Explorer, clique duas vezes no nome do arquivo ou clique com o botão direito do mouse e use "Abrir com ..." e aparece o Excel (2003) com a exibição conforme o esperado.
fonte
open('oldmac.csv', 'rb').read()
para verificar sua entrada?Você pode salvar um arquivo html com a extensão 'xls' e os acentos funcionarão (pelo menos antes de 2007).
Exemplo: salve isso (usando Salvar como utf8 no bloco de notas) como test.xls:
fonte
border="1"
a tabela, você faz obter linhas, mas apenas em torno dos 4 células :)Isso é apenas uma questão de codificação de caracteres. Parece que você está exportando seus dados como UTF-8: é em UTF-8 é a sequência de dois bytes 0xC3 0xA9, que quando interpretada no Windows-1252 é Ã ©. Ao importar seus dados para o Excel, informe-o de que a codificação de caracteres que você está usando é UTF-8.
fonte
O formato CSV é implementado como ASCII, não unicode, no Excel, manipulando os diacríticos. Tivemos o mesmo problema, e foi assim que descobri que o padrão CSV oficial foi definido como baseado em ASCII no Excel.
fonte
O Excel 2007 lê corretamente UTF-8 com csv codificado em BOM (EF BB BF).
O Excel 2003 (e talvez mais cedo) lê UTF-16LE com BOM (FF FE), mas com TABs em vez de vírgulas ou ponto e vírgula.
fonte
Só consigo que o CSV analise corretamente no Excel 2007 como UTF-16 little-endian separado por tabulação, começando com a marca de ordem de bytes adequada.
fonte
Escrever uma lista técnica no arquivo CSV de saída realmente funcionou para mim no Django:
Para mais informações http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Obrigado pessoal!
fonte
printWriter.print('\ufeff')
, consulte também Como adicionar uma BOM UTF-8 em java .Outra solução que encontrei foi apenas codificar o resultado como Página de código 1252 do Windows (Windows-1252 ou CP1252). Isso seria feito, por exemplo, definindo
Content-Type
apropriadamente algo comotext/csv; charset=Windows-1252
e definindo a codificação de caracteres do fluxo de resposta da mesma forma.fonte
Observe que incluir a BOM UTF-8 não é necessariamente uma boa ideia - as versões para Mac do Excel o ignoram e na verdade exibirão a BOM como ASCII… três caracteres desagradáveis no início do primeiro campo da planilha…
fonte
'\uFEFF' + myCsvString
funciona conforme o esperado no Mac Excel 15.19.1 (2016).Verifique a codificação na qual você está gerando o arquivo. Para que o Excel exiba o arquivo corretamente, você deve usar a página de códigos padrão do sistema.
Qual idioma você está usando? se for .Net, você só precisará usar Encoding.Default ao gerar o arquivo.
fonte
Se você tiver um código legado no vb.net como eu, o seguinte código funcionou para mim:
fonte
Eu encontrei uma maneira de resolver o problema. Este é um truque desagradável, mas funciona: abra o documento com o Open Office e salve-o em qualquer formato do Excel; o resultante
.xls
ou.xlsx
exibirá os caracteres acentuados.fonte
Com o Ruby 1.8.7, codifico todos os campos para UTF-16 e descarto a BOM (talvez).
O código a seguir é extraído de active_scaffold_export:
A linha importante é:
fonte
abra o arquivo csv com o notepad ++ clic em Encode, selecione converter para UTF-8 (não converter para UTF-8 (sem BOM)) Salve aberto por duplo clic com excel Espero que ajude Christophe GRISON
fonte