快捷搜索:   nginx

PHP使用fputcsv+iconv原生函数实现CSV文件导出功能 PHP导出CSV文件实现方法

PHP开发过程中,经常会需要把输出的数据导出EXCEL表格,其中应用最多的是导出为CSV格式的表格,因为CSV兼容性更强,不单单EXCEL能处理,WPS也可以,部分数据库还支持CSV直接导入,因此应用最广。这里教大家如何轻松快速的使用PHP将数据输出为CSV格式文件

这里主要使用到PHP的两个函数fputcsv和iconv

fputcsv(PHP 5 >= 5.1.0, PHP 7)
fputcsv — 将行格式化为 CSV 并写入文件指针
说明:fputcsv() 将一行(用 fields 数组传递)格式化为 CSV 格式并写入由 handle 指定的文件。
用法:fputcsv ( resource $handle , array $fields [, string $delimiter = ',' [, string $enclosure = '"' ]] ) : int

iconv(PHP 4 >= 4.0.5, PHP 5, PHP 7)
iconv — 字符串按要求的字符编码来转换
说明:将字符串 str 从 in_charset 转换编码到 out_charset。
用法:iconv ( string $in_charset , string $out_charset , string $str ) : string


完整参考代码:

foreach((array)$output as $key=>$value){

//导出CSV用的数据
 if($_GET['csv']=='yes'){
 $csv[$key]['num']=$num1;
 $csv[$key]['time']=$outtime;
 $csv[$key]['action']='('.$source.')'.$action;
 $csv[$key]['ip']=$value["ip"];
 $csv[$key]['ip_class']=$value["ip_class"].'['.$out_put[$action][$outip].'/'.$ipnum.']';
 $csv[$key]['country']=$countryb;
 $csv[$key]['colo']=$value["colo"];
 $csv[$key]['ua']=$value["ua"];
 $csv[$key]['firewallrule']=$firewallrule[$rule_id]['filter']['expression'];
 $csv[$key]['method']=$value["method"];
 $csv[$key]['url']=$value["scheme"].'://'.$value["host"].$value["uri"];
 }
 //导出CSV用的数据处理结束
}
//导出CSV
if($_GET['csv']=='yes'){
    $fileName = time();  //这里定义下载时候显示的表名。简单点的就直接  $fileName = time();
    header('Content-Type: application/vnd.ms-excel');   //header设置
    header("Content-Disposition: attachment;filename=".$fileName.".csv");
    header('Cache-Control: max-age=0');

    $fp = fopen('php://output','a');    //打开php文件句柄,php://output表示直接输出到PHP缓存,a表示将输出的内容追加到文件末尾

    $head = array('顺序','时间','触发规则','IP地址','IP类型/第几次/总次数','国别','CF节点','UA','规则','请求方式','网址');  //表头信息
    foreach($head as $k=>$v){
        $head[$k] = iconv("UTF-8","GBK//IGNORE",$v);    //将utf-8编码转为gbk。理由是: Excel 以 ANSI 格式打开,不会做编码识别。如果直接用 Excel 打开 UTF-8 编码的 CSV 文件会导致汉字部分出现乱码。  
    }
    fputcsv($fp,$head);  //fputcsv() 函数将行格式$head化为 CSV 并写入一个打开的文件$fp。

        $data = [];  //要导出的数据的顺序与表头一致;提前将最后的值准备好(比如:时间戳转为日期等)
        foreach ($csv as $key => $val) {
            
            foreach($val as $i=> $item){  //$item为一维数组哦
                $data[$i] = iconv("UTF-8","GBK//IGNORE",$item);  //转为gbk的时候可能会遇到特殊字符‘-’之类的会报错,加 ignore表示这个特殊字符直接忽略不做转换。
            }
            
            fputcsv($fp,$data);
        }
        unset($csv);unset($data);
        exit;  //记得加这个,不然会跳转而不会进行CSV下载输出。
 }//IF结束

//导出CSV完成



顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论