2011-12-14 9 views
14

Voglio scrivere qualcosa di similefuga carattere virgola quando si scrive in un file CSV

=HYPERLINK("http://example.com"; "Example") 

in un file CSV separato da virgole, ma Excel analizza il punto e virgola e mette "Esempio") parte in un'altra cella. Ho provato a sfuggire il punto e virgola con il backslash e avvolgere tutto in virgolette doppie senza fortuna.

Qualsiasi aiuto?

risposta

16

Il wrapping con virgolette era già l'idea corretta, ma è necessario assicurarsi di farlo correttamente. Puoi inserire una colonna tra virgolette, quindi tutto all'interno è considerato come un singolo valore. Le virgolette stesse devono essere sfuggite scrivendone due ("").

Si veda ad esempio questo:

Column A;Column B;Column C 
Column A;"Column B; with semicolon";Column C 
Column A;"Column B"";"" with semicolon and quotes";Column C 
Column A;"=HYPERLINK(""http://example.com""; ""Example"")";Column C 
3

Ho anche avuto un tempo molto selvaggio Tring per capire l'intero quadro, allora è come ho tutta la mia csv pronti ad aprire in Excel in PHP (che comprende codifica utf8 pure):

$sep='";"';//note the separator is double quoted 
while($t=mysql_fetch_assoc(mysql_query('select ..')){ 
    #replaces the caracters who are breaking csv display 
    $t=array_map(function($x){return str_replace(array("\n","\r",'"'),array('\\n',"\\r",'""'),$x);},$t); 
    $csv.="\n\"".implode($sep,$t)."\""; 
} 
$charset='utf-8'; 
header('Content-Type: application/csv;charset='.$charset); 
header('Content-Disposition: attachment; filename="filename.csv"'); 
$bom=chr(239).chr(187).chr(191);#this tells excel document is utf8 encoded 
die($bom.$csv); 
0

uso questa funzione per ciascun valore CSV passare correttamente. Cita un valore solo se contiene nuovi simboli di linea, virgolette doppie o separatori. In realtà, l'unico valore da evitare è il simbolo delle doppie virgolette. Tutto il contenuto di altre celle viene inserito e visualizzato correttamente in Excel.

Controllato con varie versioni di Excel e parser CSV ODBC in locale cirillico sotto Windows.

/** 
* This function escapes single CSV value if it contains new line symbols, quotes or separator symbol and encodes it into specified $encoding. 
* 
* @param string $source - origin string 
* @param string $sep - CSV separator 
* @param string $source_encoding - origin string encoding 
* @param string $encoding - destination encoding 
* 
* @return string - escaped string, ready to be added to CSV 
* 
* @example echo escapeStringCSV("Hello\r\n\"World\"!"); 
* will output 
*  "Hello 
*  ""World""!" 
*/ 
function escapeStringCSV($source, $sep=';', $source_encoding='utf-8', $encoding="windows-1251//TRANSLIT"){ 

    $str = ($source_encoding!=$encoding ? iconv($source_encoding, $encoding, $source) : $source); 

    if(preg_match('/[\r\n"'.preg_quote($sep, '/').']/', $str)){ 
     return '"'.str_replace('"', '""', $str).'"'; 
    } else 
     return $str; 
} 

Così utilizzo può essere simile a questo:

while($row = mysql_fetch_assoc($res)){ 
    foreach($row as $val){ 
     $csv .= escapeStringCSV($val).';'; 
    } 
    $csv .= "\r\n"; 
} 
Problemi correlati