我为每个CSV值使用此函数来正确传递它 . 仅在包含新行符号,双引号或分隔符时才引用值 . 实际上,唯一要逃避的值是双引号符号 . 所有其他单元格内容都会进入并在Excel中正确显示 .
使用Windows下的西里尔语言环境中的各种版本的Excel和ODBC CSV解析器进行检查 .
/**
* 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;
}
所以用法可以是这样的:
while($row = mysql_fetch_assoc($res)){
foreach($row as $val){
$csv .= escapeStringCSV($val).';';
}
$csv .= "\r\n";
}