Eu tenho uma coisa muito simples que apenas gera algumas coisas no formato CSV, mas deve ser UTF-8. Abro esse arquivo no TextEdit ou TextMate ou Dreamweaver e ele exibe caracteres UTF-8 corretamente, mas se eu o abrir no Excel, ele está fazendo esse tipo de coisa boba. Aqui está o que eu tenho na cabeça do meu documento:
header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");
Tudo isso parece ter o efeito desejado, exceto o Excel (Mac, 2008) não deseja importá-lo adequadamente. Não há opções no Excel para "abrir como UTF-8" ou algo assim, então ... estou ficando um pouco irritado.
Não consigo encontrar soluções claras para isso em nenhum lugar, apesar de muitas pessoas terem o mesmo problema. O que mais vejo é incluir a lista técnica, mas não consigo descobrir exatamente como fazer isso. Como você pode ver acima, estou apenas echo
inserindo esses dados, não estou escrevendo nenhum arquivo. Posso fazer isso se precisar, mas não o faço porque não parece haver necessidade neste momento. Qualquer ajuda?
Atualização: tentei repetir a BOM como a echo pack("CCC", 0xef, 0xbb, 0xbf);
que acabei de extrair de um site que estava tentando detectar a BOM. Mas o Excel apenas anexa esses três caracteres à primeira célula quando é importada e ainda atrapalha os caracteres especiais.
fonte
Respostas:
Para citar um engenheiro de suporte da Microsoft ,
Atualização, 2017 : isso é válido para todas as versões do Microsoft Excel para Mac antes do Office 2016 . Versões mais recentes (do Office 365) agora oferecem suporte ao UTF-8.
Para gerar o conteúdo UTF-8 que o Excel, tanto no Windows quanto no OS X, conseguirá ler com êxito, você precisará fazer duas coisas:
Certifique-se de converter seu texto UTF-8 CSV em UTF-16LE
Certifique-se de adicionar a marca de ordem de byte UTF-16LE ao início do arquivo
O próximo problema que aparece apenas com o Excel no OS X (mas não no Windows) será ao exibir um arquivo CSV com valores separados por vírgula; o Excel renderizará linhas apenas com uma linha e todo o texto juntamente com as vírgulas na primeira linha.
A maneira de evitar isso é usar guias como seu valor separado.
Eu usei essa função nos comentários do PHP (usando as guias "\ t" em vez de vírgulas) e funcionou perfeitamente no OS X e no Windows Excel.
Observe que, para corrigir um problema com uma coluna vazia no final de uma linha, tive que alterar a linha de código que diz:
para
Como dizem os outros comentários desta página, outros aplicativos de planilha como o OpenOffice Calc, o Numbers da Apple e a Planilha do Google Doc não têm problemas com arquivos UTF-8 com vírgulas.
Veja a tabela nesta pergunta para que funciona e o que não funciona para arquivos Unicode CSV no Excel
Como uma observação lateral, devo acrescentar que, se você estiver usando o Composer , deverá dar uma olhada em
League\Csv
suas necessidades.League\Csv
tem uma API muito boa para criar arquivos CSV .Para usar
League\Csv
com esse método de criação de arquivos CSV, confira este exemplofonte
sep=;
ousep=,
no arquivo CSV informa ao Excel como o CSV é separado e as colunas serão criadas corretamente novamente."sep=,\n"
, e em outra linha adicionasse os dados. As coisas estavam bem se eu fizesse tudo em uma linha ($csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
). Tudo está ótimo agora no Mac. Não tenho o Windows para testar.Eu tenho o mesmo problema (ou semelhante).
No meu caso, se eu adicionar uma lista técnica à saída, ela funcionará:
Eu acredito que este é um truque muito feio, mas funcionou para mim, pelo menos no Excel 2007 Windows. Não tenho certeza se funcionará no Mac.
fonte
Aqui está como eu fiz (isso é para solicitar ao navegador que baixe o arquivo csv):
A única coisa que corrigiu o problema de codificação UTF8 na visualização de CSV quando você pressiona a barra de espaço no Mac .. mas não no Excel Mac 2008 ... não sei por que
fonte
$outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
))
.Eu apenas lidei com o mesmo problema e criei duas soluções.
Use a classe PHPExcel como sugerido por bpeterson76 .
Aqui está um método PHP que pega alguns dados TSV e gera um arquivo do Excel para o navegador. Observe que ele usa o Excel5 Writer, o que significa que o arquivo deve ser compatível com versões mais antigas do Excel, mas não tenho mais acesso a nenhum, então eu não posso testá-los.
Devido aos problemas de eficiência do PHPExcel, também tive que descobrir como gerar um arquivo CSV ou TSV compatível com UTF-8 e Excel.
Aqui está o código PHP que usei, observe que estou usando dados tsv (guias como delimitadores em vez de vírgulas):
fonte
Eu estava tendo o mesmo problema e foi resolvido como abaixo:
fonte
O Excel não suporta UTF-8. Você precisa codificar seu texto UTF-8 no UCS-2LE.
fonte
No meu caso, o seguinte funciona muito bem para criar um arquivo CSV com caracteres UTF-8 exibidos corretamente no Excel.
O
0xEF 0xBB 0xBF
cabeçalho da lista técnica permitirá que o Excel saiba a codificação correta.fonte
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
<- é exatamente isso que eu precisava. Ele funciona como um encanto.Para acompanhar isso:
Parece que o problema é simplesmente com o Excel no Mac. Não é assim que estou gerando os arquivos, porque até gerar CSVs do Excel os está quebrando. Salvei como CSV, reimportei e todos os personagens estão confusos.
Então ... não parece haver uma resposta correta para isso. Obrigado por todas as sugestões.
Eu diria que, pelo que li, a sugestão de @Daniel Magliola sobre a lista técnica provavelmente seria a melhor resposta para outro computador. Mas ainda não resolve o meu problema.
fonte
Isso funciona bem no Excel para Windows e Mac OS.
Corrija problemas no Excel que não exibem caracteres contendo sinais diacríticos, letras cirílicas, letra grega e moeda.
fonte
O arquivo CSV deve incluir uma marca de ordem de bytes.
Ou como sugerido e solução alternativa, apenas faça eco com o corpo HTTP
fonte
Como a codificação UTF8 não funciona bem com o Excel. Você pode converter os dados em outro tipo de codificação usando
iconv()
.por exemplo
fonte
Adicionar:
Ou:
Antes de gravar qualquer conteúdo no arquivo CSV.
Exemplo:
fonte
mb_convert_encoding
Não é necessário converter texto já codificado em utf-8 usando . Basta adicionar três caracteres na frente do conteúdo original:Para mim, isso resolveu o problema de caracteres especiais nos arquivos csv.
fonte
fputs
.Como eu investiguei e descobri que o UTF-8 não está funcionando bem no MAC e no Windows, tentei com o Windows-1252, ele suporta bem nos dois, mas você deve selecionar o tipo de codificação no ubuntu. Aqui está o meu código
$valueToWrite = mb_convert_encoding($value, 'Windows-1252');
fonte
fonte
Que tal apenas produzir para o Excel? Esta é uma excelente classe que permite gerar arquivos XLS do lado do servidor. Eu o uso frequentemente para clientes que não conseguem "descobrir" o CSV e até agora nunca tiveram uma reclamação. Ele também permite alguma formatação extra (sombreamento, alturas de linha, cálculos etc.) que o csv nunca fará.
fonte
você pode converter sua string CSV com iconv . por exemplo:
fonte
Você precisa usar a codificação "Windows-1252".
Talvez você precise converter suas strings:
fonte
Você pode acrescentar os 3 bytes ao arquivo antes de exportar, ele funciona para mim. Antes de fazer esse sistema, apenas funcionava no Windows e no HP -UX, mas falhou no Linux.
Tenha uma BOM UTF-8 (3 bytes, hex BB EF BF) no início do arquivo. Caso contrário, o Excel interpretará os dados de acordo com a codificação padrão da localidade (por exemplo, cp1252) em vez de utf-8
Gerando arquivo CSV para Excel, como ter uma nova linha dentro de um valor
fonte
Estou no Mac, no meu caso, apenas precisei especificar o separador
"sep=;\n"
e codificar o arquivo em UTF-16LE desta forma:fonte
Para mim, nenhuma das soluções acima funcionou. Abaixo está o que eu fiz para resolver o problema: modifique o valor usando esta função no código PHP:
Esta saída valoriza corretamente em uma planilha do Excel.
fonte
Eu tive esse mesmo problema quando tive uma rotina do Excel VBA que importou dados. Como o CSV é um formato de texto sem formatação, eu estava trabalhando nisso, abrindo os dados de maneira programática em um editor de arquivos simples como o wordpad e salvando-o novamente como texto unicode ou copiando-o para a área de transferência de lá e colando-o no Excel. Se o Excel não analisar automaticamente o CSV em células, isso será facilmente remediado usando o recurso "Texto para colunas" incorporado.
fonte
O problema ainda ocorre quando você o salva como um arquivo .txt e o abre no Excel com vírgula como delimitador?
O problema pode não ser a codificação, pode ser que o arquivo não seja um CSV perfeito, de acordo com os padrões do Excel.
fonte
Este Post é bastante antigo, mas depois de horas tentando compartilhar minha solução ... talvez ajude alguém que lida com Excel e Mac e CSV e tropeça nessa ameaça. Estou gerando um csv dinamicamente como saída de um banco de dados com usuários do Excel em mente. (UTF-8 com BOM)
Eu tentei vários ícones, mas não consegui que os tremados alemães funcionassem no Mac Excel 2004. Uma solução: PHPExcel. É ótimo, mas para o meu projeto é um pouco demais. O que funciona para mim é criar o arquivo csv e converter esse arquivo csv em xls com este PHPsnippet: csv2xls . o resultado xls funciona com tremas alemães do Excel (ä, ö, Ü, ...).
fonte
Eu apenas tentei esses cabeçalhos e obtive o Excel 2013 em um PC com Windows 7 para importar o arquivo CSV com caracteres especiais corretamente. A Byte Order Mark (BOM) foi a chave final que a fez funcionar.
fonte
Caso contrário, você pode:
fonte
Solução FÁCIL para Mac Excel 2008: lutei com isso muitas vezes, mas aqui estava minha solução fácil: abra o arquivo .csv no Textwrangler, que deve abrir corretamente os caracteres UTF-8. Agora, na barra de status inferior, altere o formato do arquivo de "Unicode (UTF-8)" para "Western (ISO Latin 1)" e salve o arquivo. Agora vá para o seu Mac Excel 2008 e selecione Arquivo> Importar> Selecione csv> Encontre seu arquivo> na origem do arquivo, selecione "Windows (ANSI)" e pronto, os caracteres UTF-8 estão sendo exibidos corretamente. Pelo menos faz para mim ...
fonte
Eu uso isso e funciona
fonte
#output um CSV UTF-8 em PHP que o Excel lerá corretamente.
fonte
fonte