/**
* 格式化导出到excel文件(csv格式)的数据
* @param mixed $item array | string
*/
function format_export_string($item){
if(is_array($item) || is_object($item)){
$array = array();
foreach($item as $k=>$v){
$array[$k] = format_export_string($v);
}
return $array;
}else{
if(is_numeric($item)){ //数值型
$item = (string)$item;
if(preg_match("/^-?\d{1,11}$/", $item)){ //不超过11位的整数
return $item;
}else if(is_lng($item) && $item!='0' && substr($item,0,1)=='0'){ //以0开头的数字字符串
return '="' . $item . '"';
}else{
return '="' . $item . '"';
}
}else{
if(strpos($item, ',') !== FALSE || strpos($item, "\r") !== FALSE || strpos($item, "\n") !== FALSE){ //逗号、回车、换行
if(strpos($item, '"') !== FALSE){ //有双引号
return '"' . str_replace('"', '""', $item) . '"';
}else{
return '"' . $item . '"';
}
}else if(!check_datetime($item) && preg_match("/^[\+\-\*\/\%\^\(\)\d]+$/", $item)){ //不是日期型的连加/连减/带区号电话号码数据
return '="'.$item.'"';
}else{
return $item;
}
}
}
}
//清空缓冲区
if (ob_get_level() !== 0 && @ob_end_clean() === FALSE)@ob_clean();
//输出headers
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="文件名.csv"');
header('Expires: 0');
header('Content-Transfer-Encoding: binary');
//header('Content-Length: '.$filesize);
header('Cache-Control: private, no-transform, no-store, must-revalidate');
$s='';
//输出表头
foreach($fields as $k=>$v){
$s .= format_export_string($v) . ',';
}
$s .= "\n";
echo utf82gbk($s);
ob_start();
foreach($data as $row){
foreach($fields as $k=>$v){
$field_value=$row[$k];
switch($k){ //根据字段判断数据类型是否需要转换
case 'mobile':
case 'createtime':
case 'id':
echo $field_value,',';
break;
default:
echo format_export_string($field_value),',';
}
}
echo "\n";
}
//获取缓冲区内容并转为gbk编码
$str = utf82gbk(ob_get_contents());
//清空缓冲区
ob_clean();
//重新输出转码后的内容
echo $str;
//发送至浏览器
ob_flush();
flush();