Come posso generare un CSV UTF-8 in PHP che Excel leggerà correttamente?


191

Ho questa cosa molto semplice che produce solo alcune cose in formato CSV, ma deve essere UTF-8. Apro questo file in TextEdit o TextMate o Dreamweaver e visualizza correttamente i caratteri UTF-8, ma se lo apro in Excel fa invece questo stupido tipo di cosa. Ecco cosa ho in testa al mio documento:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Tutto questo sembra avere l'effetto desiderato tranne Excel (Mac, 2008) che non vuole importarlo correttamente. In Excel non ci sono opzioni per "aprire come UTF-8" o altro, quindi ... mi sto irritando un po '.

Non riesco a trovare soluzioni chiare a questo da nessuna parte, nonostante molte persone abbiano lo stesso problema. La cosa che vedo di più è includere la DBA, ma non riesco esattamente a capire come farlo. Come puoi vedere sopra, sto solo utilizzando echoquesti dati, non sto scrivendo alcun file. Posso farlo se ne ho bisogno, non sono solo perché a questo punto non sembra esserne necessario. Qualsiasi aiuto?

Aggiornamento: ho provato a fare eco alla DBA come echo pack("CCC", 0xef, 0xbb, 0xbf);appena estratta da un sito che stava cercando di rilevare la DBA. Ma Excel aggiunge questi tre caratteri alla prima cella quando importa e continua a incasinare i caratteri speciali.


2
Excel non fornisce un'opzione per regolare il set di caratteri del file in arrivo? Ne sei sicuro al 100%? Non ho una copia a portata di mano, quindi non posso provare ma immagino ci deve essere un menu a discesa scatola da qualche parte.
Pekka,

Questo è Excel su Mac: sembra più limitato di Excel sul PC. Non ci sono menu a discesa nella finestra di dialogo Apri, oltre a quali tipi di file è possibile aprire. Ho cercato dappertutto. Se è lì, è oscuro. Direi sicuro al 98%.
Ben Saufley,

Microsoft Office o openoffice?
Ajreal

Microsoft è migliore a questo proposito, non c'è modo (che ho trovato) per fare in modo che OpenOffice rilevi il set di caratteri, nemmeno la DBA. Dannazione.
Ciantic,

BOM non ha alcun effetto su Microsoft Excel 2008 per Mac.
Ben Saufley,

Risposte:


134

Per citare un tecnico dell'assistenza Microsoft ,

Excel per Mac non supporta attualmente UTF-8

Aggiornamento, 2017 : questo vale per tutte le versioni di Microsoft Excel per Mac prima di Office 2016 . Le versioni più recenti (da Office 365) ora supportano UTF-8.

Per produrre contenuti UTF-8 che Excel sia su Windows che su OS X sarà in grado di leggere correttamente, dovrai fare due cose:

  1. Assicurati di convertire il testo CSV UTF-8 in UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. Assicurarsi di aggiungere il segno di ordine byte UTF-16LE all'inizio del file

    chr(255) . chr(254)

Il prossimo problema che appare solo con Excel su OS X (ma non su Windows) sarà quando si visualizza un file CSV con valori separati da virgola, Excel renderà le righe solo con una riga e tutto il testo insieme alle virgole nella prima riga.

Il modo per evitarlo è utilizzare le schede come valore separato.

Ho usato questa funzione dai commenti di PHP (usando le schede "\ t" invece delle virgole) e ha funzionato perfettamente su OS X e Windows Excel.

Nota che per risolvere un problema con una colonna vuota come fine di una riga, ho dovuto cambiare la riga di codice che dice:

    $field_cnt = count($fields);

per

    $field_cnt = count($fields)-1;

Come dicono alcuni altri commenti su questa pagina, altre app per fogli di calcolo come OpenOffice Calc, i numeri di Apple e il foglio di calcolo di Google Doc non hanno problemi con i file UTF-8 con virgole.

Vedere la tabella in questa domanda per ciò che funziona e non funziona per i file CSV Unicode in Excel


Come nota a margine, potrei aggiungere che se stai usando Composer , dovresti dare un'occhiata alle League\Csvtue esigenze. League\Csvha una bella API per la creazione di file CSV .

Per utilizzare League\Csvcon questo metodo di creazione di file CSV, guarda questo esempio


1
Chiamami stupido, ma non riesco a farlo funzionare. Ho convertito i miei dati utilizzando la funzione mb_convert_encoding e ho generato la DBA che precede il contenuto del file, ma quando apro il file in Excel ottengo solo una riga di caratteri cinesi. Sto ancora usando le virgole anziché le schede per ora, ma presumibilmente ciò non dovrebbe causare ciò che vedo.
John Rix,

@JohnRix è strano. Questo codice ha letteralmente risolto tutti i problemi che ho mai avuto con i file CSV esportati, ad eccezione degli importatori che accettano solo virgole. Potete per favore inviarmi una pastebin del codice che state utilizzando, insieme a un array che state trasformando in un CSV e una copia del file esportato?
Tim Groeneveld,

2
Questa soluzione ha anche risolto il problema UTF8 per me su Mac e Windows. Ho anche scoperto che l'aggiunta di una riga con sep=;o sep=,al file CSV dice ad Excel come il CSV è separato e le colonne verranno nuovamente create correttamente.
Luc Wollants,

5
Ho scoperto che le cose si sono confuse se ho iniziato la stringa come solo la DBA, quindi su un'altra riga ho "sep=,\n"aggiunto i dati, quindi su un'altra riga sono stati aggiunti i dati. Le cose andavano bene se avessi fatto tutto in una riga ( $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');). Ora tutto sembra perfetto su Mac. Non ho Windows con cui provare.
tremby,

2
L'unica cosa che ha funzionato pienamente per me. L'incoerenza di Microsoft non smette mai di stupirmi. Il salvataggio di un normale file CSV utilizza "," come delimitatore, ma se esiste una DBA si salva utilizzando "\ t" per qualche motivo. La C in .csv sta per dammit "COMMA". Non è davvero difficile da fare.
Phil

288

Ho lo stesso (o simile) problema.

Nel mio caso, se aggiungo una DBA all'output, funziona:

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

Credo che questo sia un brutto trucco, ma ha funzionato per me, almeno per Windows Excel 2007. Non sono sicuro che funzionerà su Mac.


10
Brutto, ma super utile. Grazie.
abelito,

7
Sono abbastanza sicuro che questo non funzioni affatto su OS X, sfortunatamente. Penso che potrebbe effettivamente visualizzare la DBA durante l'importazione (avviso: ricordi
confusi

2
Questo è corretto. Almeno, ho provato a fare la preposizione con una distinta base, come nell'esempio sopra, ma in effetti ha appena mostrato alcuni caratteri funky all'inizio e ho continuato a mostrare i caratteri speciali sbagliati (testato in Excel 2011). Questo sembrava funzionare meglio per me in tutte le impostazioni: stackoverflow.com/a/1648671/1005334 (usando PHP).
Kasimir,

4
Continuo a ricevere avvisi su questa domanda perché apparentemente molte altre persone si imbattono in essa. Vorrei poterlo contrassegnare come corretto, perché è stato votato molto. Sfortunatamente, ho finalmente dato una possibilità a questa soluzione (abbandonato quel progetto molto tempo fa) e non funziona per me in Excel 2008 per Mac. Sono contento che funzioni per te. Ho votato a favore della soluzione. Ma non risolve il problema di Excel per Mac 2008. Se qualcuno ha fortuna sul Mac, fammelo sapere (e apparentemente tutti ).
Ben Saufley,

Funziona magnificamente inviando un file CSV a MS Excel Starter 2010. Grazie mille!
Jamie Dexter,

32

Ecco come l'ho fatto (per richiedere al browser di scaricare il file 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();

L'unica cosa che ha risolto il problema di codifica UTF8 nell'anteprima CSV quando si preme la barra spaziatrice su Mac .. ma non in Excel Mac 2008 ... non so perché


1
La riga del codice UTF-8 BOM salva la mia giornata con l'esportazione in xls
Mladen Janjetovic,

7
Stavo cercando un modo per emettere direttamente sul browser come utf8, quando mi sono imbattuto in questo post, ecco la mia soluzione con crediti a questo post per la distinta base e l'intestazione del trasferimento binario. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
Fyrye,

Errore di battitura - rimuove il doppio )).
sitilge,

22

Ho appena affrontato lo stesso problema e ho trovato due soluzioni.

  1. Utilizzare la classe PHPExcel come suggerito da bpeterson76 .

    • Utilizzando questa classe genera il file più ampiamente compatibile, sono stato in grado di generare un file da dati codificati UTF-8 che si apriva bene in Excel 2008 Mac, Excel 2007 Windows e Google Documenti.
    • Il problema più grande con l'utilizzo di PHPExcel è che è lento e utilizza molta memoria, il che non è un problema per file di dimensioni ragionevoli, ma se il tuo file Excel / CSV ha centinaia o migliaia di righe, questa libreria diventa inutilizzabile .
    • Ecco un metodo PHP che prenderà alcuni dati TSV e produrrà un file Excel sul browser, nota che utilizza Excel5 Writer, il che significa che il file dovrebbe essere compatibile con le versioni precedenti di Excel, ma non ho più accesso a nessuno, quindi non posso provarli.

      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. A causa dei problemi di efficienza con PHPExcel, ho anche dovuto capire come generare un file CSV o TSV compatibile con UTF-8 ed Excel.

    • Il meglio che ho potuto trovare era un file compatibile con Excel 2008 per Mac e Excel 2007 per PC, ma non con Google Documenti, che è abbastanza buono per la mia applicazione.
    • Ho trovato la soluzione qui , in particolare, questa risposta , ma dovresti anche leggere la risposta accettata in quanto spiega il problema.
    • Ecco il codice PHP che ho usato, nota che sto usando i dati tsv (schede come delimitatori anziché virgole):

      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;

sto affrontando lo stesso problema su Windows-7 Excel 2007 e ho provato tutti i suggerimenti ma non ci riesco :(
PHP Ferrari

La soluzione UTF-16LE è quella che ha funzionato. Nota che devi formattare correttamente tsv, e deve essere tsc, quindi delimitato da tabulazioni, non delimitato da virgole. Vedi anche il post di Marc qui: stackoverflow.com/a/1648671/1697370
Ellert van Koperen,

17

Stavo avendo lo stesso problema ed è stato risolto come di seguito:

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

13

Excel non supporta UTF-8. Devi codificare il testo UTF-8 in UCS-2LE.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

3
Meglio usare UTF-16LE come suggerito sopra, che copre ogni personaggio esistente.
Ellert van Koperen,

Ho notato che mb_convert_encoding funziona bene e mostra correttamente i segni diacritici nel mio file XLS esportato. Ho configurazioni mysql predefinite e apache + php è impostato per funzionare con utf-8
Junior Mayhé,

10

Nel mio caso il seguente funziona molto bene per rendere il file CSV con caratteri UTF-8 visualizzati correttamente in Excel.

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

L' 0xEF 0xBB 0xBFintestazione della distinta componenti consentirà a Excel di conoscere la codifica corretta.


1
grande per te fratello <3
Adrien G,

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- questo è esattamente ciò di cui avevo bisogno. Esso funziona magicamente.
Alex,

8

Per dare seguito a questo:

Sembra che il problema sia semplicemente con Excel sul Mac. Non è come sto generando i file, perché anche generare CSV da Excel li sta rompendo. Salvo come CSV e reimporto e tutti i personaggi sono incasinati.

Quindi ... non sembra esserci una risposta corretta a questo. Grazie per tutti i suggerimenti.

Direi che da tutto quello che ho letto, il suggerimento di @Daniel Magliola sulla DBA sarebbe probabilmente la migliore risposta per qualche altro computer. Ma non risolve ancora il mio problema.


Poiché il supporto UTF8 è incoerente tra Mac e Windows, la soluzione migliore è utilizzare una codifica completamente diversa. Ho trovato cp1252 che generalmente funziona bene con le cose di Microsoft. en.wikipedia.org/wiki/Windows-1252
s29

1
Ben, c'è una risposta corretta a questa domanda :) Vedi la mia!
Tim Groeneveld,

7

Funziona bene in Excel sia per Windows sia per Mac OS.

Risolvi i problemi in Excel che non mostrano caratteri contenenti segni diacritici, lettere cirilliche, lettere greche e simboli di valuta.

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;
}

questa soluzione mi ha permesso di far funzionare anche l'esportazione per Fogli Google (alcuni altri hanno fallito)
Cafn

6

Il musst del file CSV include un contrassegno di ordine byte.

O come suggerito e soluzione alternativa, fai eco con il corpo HTTP


5

Inserisci:

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

O:

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

Prima di scrivere qualsiasi contenuto nel file CSV.

Esempio:

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

4

Poiché la codifica UTF8 non funziona bene con Excel. È possibile convertire i dati in un altro tipo di codifica utilizzando iconv().

per esempio

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),

Questa è stata l'unica soluzione che ha funzionato per me con Excel Mac 2011
Christer Fernstrom,

3

Non è necessario convertire il testo già codificato utf-8 utilizzando mb_convert_encoding. Basta aggiungere tre caratteri davanti al contenuto originale:

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

Per me questo ha risolto il problema dei caratteri speciali nei file CSV.


Incredibile; Ho provato almeno altre 10 soluzioni e l'unica soluzione per me sembra essere questa, se combinata con la BOM UTF-8 via fputs.
Kaarto

2

Come ho studiato e ho scoperto che UTF-8 non funziona bene su MAC e Windows, quindi ho provato con Windows-1252, supporta bene su entrambi ma è necessario selezionare il tipo di codifica su Ubuntu. Ecco il mio codice$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

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;
}

2
In generale, le risposte sono molto più utili se includono una spiegazione di ciò che il codice è destinato a fare e perché risolve il problema senza introdurre altri.
Tim Diekmann,

1

Che ne dici di produrre solo Excel? Questa è una classe eccellente che ti consente di generare file XLS sul lato server. Lo uso spesso per i clienti che non riescono a "capire" il CSV e finora non hanno mai avuto un reclamo. Permette anche alcune formattazioni extra (shading, rowheights, calcoli, ecc.) Che CSV non potrà mai fare.


Essere consapevoli del fatto che phpexcel ha problemi con la quantità di dati di lage.
Ellert van Koperen,

1

puoi convertire la tua stringa CSV con iconv . per esempio:

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

Grandi testi di esempio;)
ngeek

1

Devi usare la codifica "Windows-1252".

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

Forse devi convertire le tue stringhe:

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

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

1

È possibile aggiungere i 3 byte al file prima dell'esportazione, funziona per me. Prima di farlo quel sistema funziona solo su Windows e HP -UX ma non funziona su 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 );

Avere una DBA UTF-8 (3 byte, esadecimale EF BB BF) all'inizio del file. Altrimenti Excel interpreterà i dati in base alla codifica predefinita della tua locale (es. Cp1252) invece di utf-8

Generazione di file CSV per Excel, come avere una nuova riga all'interno di un valore


1

Sono su Mac, nel mio caso ho dovuto solo specificare il separatore con "sep=;\n"e codificare il file in UTF-16LE in questo modo:

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

1

Per me nessuna delle soluzioni sopra ha funzionato. Di seguito è riportato ciò che ho fatto per risolvere il problema: modificare il valore utilizzando questa funzione nel codice PHP:

$value = utf8_encode($value);

Questo output apporta correttamente valori in un foglio Excel.


0

Ho avuto questo stesso problema quando avevo una routine VBA di Excel che importava i dati. Poiché CSV è un formato di testo semplice, stavo lavorando su questo aprendo programmaticamente i dati in un semplice editor di file come wordpad e salvandoli nuovamente come testo unicode o copiandoli negli Appunti da lì e incollandoli in Excel. Se Excel non analizza automaticamente il file CSV in celle, questo può essere facilmente risolto utilizzando la funzione integrata "Testo in colonne".


Ci ho provato! Ma è già codificato come testo unicode ... salvarlo come testo unicode non cambia nulla. Come potrei salvarlo come testo semplice senza interpretare erroneamente tutti i caratteri speciali?
Ben Saufley,

Penso che "salvandolo come testo Unicode", Alain potrebbe significare "UTF-16LE". Windows spesso (purtroppo) usa "Unicode" per riferirsi erroneamente a UTF-16LE o UTF-16LE con una DBA iniziale. File di Blocco note -> La finestra di dialogo Salva utilizza "Unicode" in questo modo.
Thanatos,

0

Il problema si verifica ancora quando lo salvi come file .txt e li aprono in Excel con la virgola come delimitatore?

Il problema potrebbe non essere affatto la codifica, potrebbe essere solo che il file non sia un CSV perfetto secondo gli standard di Excel.


Per quanto ne so, la formattazione CSV va bene. Posso creare un CSV "perfetto" in TextEdit, nessun problema, o anche rinominare un txt come csv, quindi non manca nulla di segreto: i CSV sono solo file di testo. Inoltre, la formattazione è perfetta in Excel, sono solo i caratteri speciali che si rompono. Ma nel caso, ho provato il tuo suggerimento, e purtroppo sta producendo gli stessi problemi.
Ben Saufley,

Dal dipartimento "WTF stavano pensando": tenere presente che, secondo Microsoft, il separatore di campo corretto dipende dalle impostazioni locali. Un file 'separato da virgola' potrebbe quindi richiedere che i campi siano effettivamente separati da punto e virgola in alcune impostazioni locali - e non c'è nulla che tu possa fare se non suggerire OpenOffice
djn

è piuttosto folle - sfortunatamente non ho problemi a delimitare correttamente i campi. Sto solo avendo problemi con questi personaggi speciali.
Ben Saufley,

0

Questo post è piuttosto vecchio, ma dopo ore di tentativi voglio condividere la mia soluzione ... forse aiuta qualcuno a gestire Excel, Mac e CSV e inciampa su questa minaccia. Sto generando un csv in modo dinamico come output da un database con in mente gli utenti di Excel. (UTF-8 con DBA)

Ho provato un sacco di iconv ma non sono riuscito a far funzionare le umlaut tedesche in Mac Excel 2004. Una soluzione: PHPExcel. È fantastico ma per il mio progetto un po 'troppo. Quello che funziona per me è creare il file CSV e convertire questo file CSV in XLS con questo PHPsnippet: CSV2Xls . il risultato xls funziona con excel umlaut tedesche (ä, ö, Ü, ...).


0

Ho appena provato queste intestazioni e ho ottenuto Excel 2013 su un PC Windows 7 per importare correttamente il file CSV con caratteri speciali. Il Byte Order Mark (BOM) è stata la chiave finale che l'ha fatto funzionare.

    header ('Codifica contenuto: UTF-8');
    header ('Content-type: text / csv; charset = UTF-8');
    header ("Disposizione del contenuto: allegato; nomefile = nomefile.csv");
    header ("Pragma: public");
    header ("Scade: 0");
    echo "\ xEF \ xBB \ xBF"; // DBA UTF-8


Sì, è corretto, funzionerà correttamente in Excel per Windows, ma come spiegato nella mia risposta, non funzionerà su Excel per OS X.
Tim Groeneveld,

0

Altrimenti puoi:

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

0

Soluzione FACILE per Mac Excel 2008: ho avuto molte difficoltà con questo, ma ecco la mia soluzione semplice: Apri il file .csv in Textwrangler che dovrebbe aprire correttamente i tuoi caratteri UTF-8. Ora nella barra di stato in basso cambia il formato del file da "Unicode (UTF-8)" a "Western (ISO Latin 1)" e salva il file. Ora vai su Mac Excel 2008 e seleziona File> Importa> Seleziona csv> Trova il tuo file> in Origine file seleziona "Windows (ANSI)" e voilà i caratteri UTF-8 vengono visualizzati correttamente. Almeno lo fa per me ...


0

Lo uso e funziona

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;

0

#output un CSV UTF-8 in PHP che Excel leggerà correttamente.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';

Una risposta per persona è sufficiente. In futuro ricorda che puoi aggiungere informazioni alla tua risposta in qualsiasi momento, non è necessario creare 2
RiggsFolly

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

Questa domanda non chiede come convertire, ma chiede come produrre. La parte rilevante di questo contributo, in uscita in UTF-16, è già fornita nella risposta selezionata .
Ben Saufley,

@BenSaufley Bene, ma risolve il problema della domanda con 2 semplici righe di codice
b3wii

La domanda è già risolta e spiegata in modo più approfondito.
Ben Saufley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.