Como posso gerar um CSV UTF-8 em PHP que o Excel leia corretamente?

191

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 echoinserindo 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.

Ben Saufley
fonte
2
O Excel não fornece uma opção para ajustar o conjunto de caracteres do arquivo recebido? Você tem 100% de certeza disso? Como não tenho uma cópia à mão, não posso tentar, mas imagino que deve haver uma caixa suspensa em algum lugar.
Pekka
Este é o Excel em um Mac - parece mais limitado que o Excel no PC. Não há nenhuma lista suspensa na caixa de diálogo Abrir, além dos tipos de arquivo que podem ser abertos. Eu olhei em todos os lugares. Se estiver lá, é obscuro. Eu diria 98% de certeza.
Ben Saufley
Microsoft office ou openoffice?
precisa
A Microsoft é melhor nesse sentido, não há nenhuma maneira (que eu encontrei) de fazer o OpenOffice detectar o conjunto de caracteres, nem mesmo a BOM. Droga.
Ciantic
A BOM também não tem efeito no Microsoft Excel 2008 para Mac.
quer

Respostas:

134

Para citar um engenheiro de suporte da Microsoft ,

O Excel para Mac atualmente não suporta UTF-8

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:

  1. Certifique-se de converter seu texto UTF-8 CSV em UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. Certifique-se de adicionar a marca de ordem de byte UTF-16LE ao início do arquivo

    chr(255) . chr(254)

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:

    $field_cnt = count($fields);

para

    $field_cnt = count($fields)-1;

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\Csvsuas necessidades. League\Csvtem uma API muito boa para criar arquivos CSV .

Para usar League\Csvcom esse método de criação de arquivos CSV, confira este exemplo

Tim Groeneveld
fonte
1
Me chame de idiota, mas não posso fazer isso funcionar. Converti meus dados usando a função mb_convert_encoding e produzi a BOM anterior ao conteúdo do arquivo, mas recebo apenas uma única linha de caracteres chineses quando abro o arquivo no Excel. Ainda estou usando vírgulas em vez de guias por enquanto, mas presumivelmente isso não deve causar o que estou vendo.
John Rix
@ JohnRix isso é estranho. Esse código literalmente resolveu todos os problemas que já tive com a exportação de arquivos CSV - com exceção dos importadores que aceitam apenas vírgulas. Você pode me enviar uma pasta do código que está usando, juntamente com uma matriz que você está transformando em um CSV e uma cópia do arquivo exportado?
Tim Groeneveld
2
Essa solução também resolveu o problema de UTF8 para mim no Mac e no Windows. Também descobri que adicionar uma linha com sep=;ou sep=,no arquivo CSV informa ao Excel como o CSV é separado e as colunas serão criadas corretamente novamente.
Luc Wollants
5
Eu descobri que as coisas saíam ilegíveis se eu iniciasse a string apenas como a lista técnica e, em outra linha, adicionasse o "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.
tremby
2
A única coisa que funcionou totalmente para mim. A inconsistência da Microsoft nunca deixa de me surpreender. Salvar um arquivo csv normal usa "," como delimitador, mas se houver uma BOM, ele salva usando "\ t" por algum motivo. OC em .csv significa "COMMA" caramba. Realmente não é difícil de fazer.
Phil
288

Eu tenho o mesmo problema (ou semelhante).

No meu caso, se eu adicionar uma lista técnica à saída, ela funcionará:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

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.

Daniel Magliola
fonte
10
Feio, mas super útil. Obrigado.
Abelito
7
Tenho certeza de que isso não funciona bem no OS X, infelizmente. Eu acho que pode realmente mostrar o BOM quando você importa: (aviso memórias nebulosas.)
davidtbernal
2
Isto está certo. Pelo menos, tentei anexar uma BOM, como no exemplo acima, mas na verdade apenas mostrou alguns caracteres descolados no início e continuou exibindo os caracteres especiais incorretos (testado no Excel 2011). Isso pareceu funcionar melhor para mim em todas as configurações: stackoverflow.com/a/1648671/1005334 (usando PHP).
kasimir
4
Continuo recebendo alertas sobre essa questão, porque aparentemente muitas outras pessoas se deparam com ela. Eu gostaria de poder marcar isso como correto, porque foi muito votado. Infelizmente, finalmente dei uma chance a esta solução (abandonado esse projeto há muito tempo) e ela não está funcionando para mim no Excel 2008 para Mac. Que bom que está trabalhando para você. Eu votei na solução. Mas isso não resolve o problema do Excel para Mac 2008. Se alguém tiver sorte no Mac, informe-me definitivamente (e aparentemente todos ).
Ben Saufley
Funciona lindamente com a saída de um arquivo CSV para o MS Excel Starter 2010. Muito obrigado!
Jamie Dexter
32

Aqui está como eu fiz (isso é para solicitar ao navegador que baixe o arquivo csv):

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

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

Jazzer
fonte
1
Linha de UTF-8 BOM do código salvar meu dia com a exportação para xls
Mladen Janjetovic
6
Eu estava procurando uma maneira de enviar diretamente para o navegador como utf8, quando me deparei com este post. Aqui está minha solução com créditos a este post para a BOM e o cabeçalho de transferência binária. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
Fyrye 15/05
Erro de digitação - remova o dobro )).
sitilge
22

Eu apenas lidei com o mesmo problema e criei duas soluções.

  1. Use a classe PHPExcel como sugerido por bpeterson76 .

    • Usando essa classe gera o arquivo mais amplamente compatível, eu pude gerar um arquivo a partir de dados codificados em UTF-8 que abriram perfeitamente no Excel 2008 Mac, Excel 2007 Windows e Google Docs.
    • O maior problema com o uso do PHPExcel é que ele é lento e usa muita memória, o que não é um problema para arquivos de tamanho razoável, mas se o seu arquivo Excel / CSV tiver centenas ou milhares de linhas, essa biblioteca se tornará inutilizável .
    • 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.

      function excel_export($tsv_data, $filename) {
          $export_data = preg_split("/\n/", $tsv_data);
          foreach($export_data as &$row) {
              $row = preg_split("/\t/", $row);
          }
      
          include("includes/PHPExcel.php");
          include('includes/PHPExcel/Writer/Excel5.php');
      
          $objPHPExcel = new PHPExcel();          
      
          $objPHPExcel->setActiveSheetIndex(0);
          $sheet = $objPHPExcel->getActiveSheet();
          $row = '1';
          $col = "A";
          foreach($export_data as $row_cells) {
              if(!is_array($row_cells)) { continue; }
                  foreach($row_cells as $cell) {
                      $sheet->setCellValue($col.$row, $cell);
                      $col++;
                  }
              $row += 1;
              $col = "A";
          }
      
          $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
          header('Content-Type: application/vnd.ms-excel');
          header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
          header('Cache-Control: max-age=0');
          $objWriter->save('php://output');   
          exit;   
      }
  2. 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.

    • O melhor que pude criar foi um arquivo compatível com o Excel 2008 Mac e o Excel 2007 PC, mas não com o Google Docs, que é bom o suficiente para o meu aplicativo.
    • Encontrei a solução aqui , especificamente, esta resposta , mas você também deve ler a resposta aceita , pois explica o problema.
    • Aqui está o código PHP que usei, observe que estou usando dados tsv (guias como delimitadores em vez de vírgulas):

      header ( 'HTTP/1.1 200 OK' );
      header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Content-Type: application/vnd.ms-excel') ;
      header ( 'Content-Disposition: attachment;filename=export.csv' );
      print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
      exit;
Jasdeep Gosal
fonte
Estou enfrentando o mesmo problema no Windows-7 Excel 2007 e tentei todas as sugestões, mas falhar :(
PHP Ferrari
A solução UTF-16LE é a que funcionou. Observe que você precisa formatar o tsv corretamente e ele deve ser tsc, portanto, delimitado por tabulação, não por vírgula. Veja também o post de Marc aqui: stackoverflow.com/a/1648671/1697370
Ellert van Koperen
16

Eu estava tendo o mesmo problema e foi resolvido como abaixo:

    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=utf-8' );
    header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    $df = fopen( 'php://output', 'w' );

    //This line is important:
    fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

    foreach ( $rows as $row ) {
        fputcsv( $df, $row );
    }
    fclose($df);
    exit();
Reza Mamun
fonte
13

O Excel não suporta UTF-8. Você precisa codificar seu texto UTF-8 no UCS-2LE.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');
Leopold Gault
fonte
3
Melhor usar o UTF-16LE como sugerido acima, que abrange todos os caracteres existentes.
Ellert van Koperen
Percebi que este mb_convert_encoding está funcionando bem e mostrando diacríticos corretamente no meu arquivo XLS exportado. Eu tenho configurações padrão do mysql e o apache + php está configurado para trabalhar com utf-8
Junior Mayhé
10

No meu caso, o seguinte funciona muito bem para criar um arquivo CSV com caracteres UTF-8 exibidos corretamente no Excel.

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

O 0xEF 0xBB 0xBFcabeçalho da lista técnica permitirá que o Excel saiba a codificação correta.

Codemole
fonte
1
big up para você bro <3
Adrien G
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- é exatamente isso que eu precisava. Ele funciona como um encanto.
187 Alex
8

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.

Ben Saufley
fonte
Como o suporte ao UTF8 é inconsistente entre Mac e Windows, a melhor aposta é usar uma codificação diferente. Descobri que o cp1252 geralmente funciona bem com as coisas da Microsoft. pt.wikipedia.org/wiki/Windows-1252
s29
1
Ben, há uma resposta correta para esta pergunta :) Veja a minha!
Tim Groeneveld
7

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.

function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}
Murali Krishna
fonte
esta solução permitiu-me para fazer trabalho de exportação para o Google Sheets também (alguns outros falharam)
Cafn
6

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

Cybot
fonte
4

Como a codificação UTF8 não funciona bem com o Excel. Você pode converter os dados em outro tipo de codificação usandoiconv() .

por exemplo

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),
Abrar A. Shareef
fonte
Esta foi a única solução que funcionou para mim com o Excel Mac 2011
Christer Fernstrom
4

Adicionar:

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

Ou:

fprintf($file, "\xEF\xBB\xBF");

Antes de gravar qualquer conteúdo no arquivo CSV.

Exemplo:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);
Rejaul
fonte
3

mb_convert_encodingNão é necessário converter texto já codificado em utf-8 usando . Basta adicionar três caracteres na frente do conteúdo original:

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

Para mim, isso resolveu o problema de caracteres especiais nos arquivos csv.

Rvanlaak
fonte
Inacreditável; Tentei pelo menos 10 outras soluções e a única solução para mim parece ser essa, quando combinada com o UTF-8 BOM via fputs.
kaarto
2

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');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM
Ho Ha
fonte
2
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($filename, $headings, $data) {

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
    exit;
}
Sagar72427
fonte
2
Geralmente, as respostas são muito mais úteis se incluirem uma explicação do que o código pretende fazer e por que isso resolve o problema sem a introdução de outros.
Tim Diekmann 27/03
1

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á.

bpeterson76
fonte
Esteja ciente de que o phpexcel tem problemas com grandes quantidades de dados.
Ellert van Koperen
1

você pode converter sua string CSV com iconv . por exemplo:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );
foued611
fonte
Grandes textos da amostra;)
ngeek
1

Você precisa usar a codificação "Windows-1252".

header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");

Talvez você precise converter suas strings:

private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}
roNn23
fonte
1

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.

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

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

Cherry Yap
fonte
1

Estou no Mac, no meu caso, apenas precisei especificar o separador "sep=;\n"e codificar o arquivo em UTF-16LE desta forma:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');
Sebastien Horin
fonte
1

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:

$value = utf8_encode($value);

Esta saída valoriza corretamente em uma planilha do Excel.

Barani r
fonte
0

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.

Alain
fonte
Eu tentei isso! Mas já está codificado como texto unicode ... salvá-lo como texto unicode não muda nada. Como eu o salvaria como texto sem a interpretação incorreta de todos os caracteres especiais?
Ben Saufley
Eu acho que "salvando-o como texto Unicode", Alain pode significar "UTF-16LE". O Windows geralmente (infelizmente) usa "Unicode" para se referir incorretamente ao UTF-16LE ou UTF-16LE com uma lista técnica principal. A caixa de diálogo Arquivo -> Salvar do bloco de notas usa "Unicode" dessa maneira.
Thanatos
0

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.

Alain
fonte
Tanto quanto eu sei, a formatação CSV está bem. Posso criar um CSV "perfeito" no TextEdit, sem problemas, ou até renomear um txt como csv, para que não perca nada secreto - os CSVs são apenas arquivos de texto. Além disso, a formatação é perfeita no Excel, são apenas os caracteres especiais que quebram. Mas, por precaução, tentei sua sugestão e, infelizmente, está produzindo os mesmos problemas.
Ben Saufley
No departamento "WTF eles estavam pensando": lembre-se de que, de acordo com a Microsoft, o separador de campo correto depende da localidade. Um arquivo 'separados por vírgula' pode assim o exigem campos para ser realmente ponto e vírgula separados em alguns locais - e não há nada que você possa fazer senão sugerindo OpenOffice
djn
isso é muito louco - infelizmente não estou tendo problemas para delimitar adequadamente os campos. Só estou tendo problemas com esses caracteres especiais.
Ben Saufley
0

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 (ä, ö, Ü, ...).

t Livro
fonte
0

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.

    cabeçalho ('Content-Encoding: UTF-8');
    cabeçalho ('Tipo de conteúdo: texto / csv; charset = UTF-8');
    header ("Disposição do conteúdo: anexo; filename = filename.csv");
    cabeçalho ("Pragma: public");
    cabeçalho ("Expira em 0");
    eco "\ xEF \ xBB \ xBF"; // BOM UTF-8

Brian
fonte
Sim, isso é correto, ele irá funcionar corretamente no Excel para Windows, mas como explicado na minha resposta, não vai funcionar no Excel para Mac OS X.
Tim Groeneveld
0

Caso contrário, você pode:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);
user3519396
fonte
0

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 ...

Poul
fonte
0

Eu uso isso e funciona

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;
BoRnbeBaD
fonte
0

#output um CSV UTF-8 em PHP que o Excel lerá corretamente.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';
Murali Krishna
fonte
Uma resposta por pessoa é suficiente. Lembre-se de que no futuro você pode adicionar informações à sua resposta a qualquer momento, não precisa criar 2
RiggsFolly 5/17
-1
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));
b3wii
fonte
Esta pergunta não pergunta como converter, mas como gerar. A parte relevante desta contribuição, produzida em UTF-16, já está contribuída na resposta selecionada .
Ben Saufley
@BenSaufley Bem, mas ele resolve o problema da questão com 2 linhas simples de código
b3wii
A questão já está resolvida e também é mais bem explicada.
Ben Saufley