zoukankan      html  css  js  c++  java
  • PHP实现导出CSV文件

    在做导出一个信息表为excel文件这个功能完成之后,自己用得好好的,但是到HR那边就告诉我导出的文件无法用她电脑上的office打开,心想,兼容没做好,想问下她的版本号,结果半天没回复消息。
    我老大来了句:转csv文件吧,没有兼容性的说法。
    然后开始折腾csv,在这之前我只是见过“导出csv文件”的字样,没有涉及过这个。
    当然一开始要去了解一下csv是什么: https://baike.baidu.com/item/CSV/10739。

    先附上代码:

    public function exportCSVAction()
    {
        $id = (int)$this->_req->getParam('cid',0);
        $reg = new RegistrationModel();
        $studentsArr = $reg->getStudents($id);   // 获取课程及报名学员信息
    
        $fileName = $studentsArr['info']['title'] . "_" . 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('工号','部门名','岗位名','学员名','报名时间','状态','课程建议');  //表头信息
        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。 
    
     //   if (!empty($studentsArr['students'])) {  
            $data = [];  //要导出的数据的顺序与表头一致;提前将最后的值准备好(比如:时间戳转为日期等)
            foreach ($studentsArr['students'] as $key => $val) {
                $data['empno'] = "xm-".$val['empno'];
                $data['dept'] = $val['dept_name'].'-'.$val['job_name'];
                $data['post'] = $val['post'];
                $data['username'] = $val['username'];
                $data['create_time'] = " ".date('Y-m-d H:i', $val['create_time']);  //excel对大数字会自动转科学计数法表示,所以这里加个“”空格是将数字转字符串,这个有多种方式,具体怎么方便怎么来。
    
                switch ($val['status']) {
                    case 0:
                        $data['status'] = '请假';
                        break;
                    case 1:
                        $data['status'] = '正常';
                        break;
                    case 2:
                        $data['status'] = '已取消';
                        break;
                    case 3:
                        $data['status'] = '缺席';
                        break;
                }
                $data['advices'] = $val['advices'];
    
                foreach($data as $i $item){  //$item为一维数组哦
                    $data[$i] = iconv("UTF-8","GBK//IGNORE",$item);  //转为gbk的时候可能会遇到特殊字符“_”之类的会报错,加ignore表示这个特殊字符直接忽略不做转换。
                }
                fputcsv($fp,$data);
            }
            exit;  //记得加这个,不然会跳转到某个页面。
     //   }
    
    }
    

    过程中遇到知识点:

    *    iconv的使用:http://php.net/manual/zh/function.iconv.php;
    *    fputcsv的使用:http://php.net/manual/zh/function.fputcsv.php。 
    

    注意点:

    1. 页面导出按钮应该直接使用url地址跳转的方式,如果使用ajax跳转到导出方法会无法导出文件,并返回一堆乱码的数据。
      这是因为ajax请求需要有返回数据,返回数据就会带有自己的请求头部,会与下载文件头部冲突掉,导致文件无法下载。

    2. 我这里的工号其实有存在前面的数字为0的情况(比如:0123、0001),导出的文件用excel打开后就变成123、1 啦,这明显不合我的要求。
      解决方式是在要处理的字段前加个转义符“`”(英文输入法下的tab键上方的键),据说微信导数据是这样处理的。
      我的解决方式是:因为是公司工号,我加了公司前缀,比如: c_0123;

  • 相关阅读:
    ComparatorUtil 防止空指针异常
    Java resource 读取解释,绝对路径和相对路径
    List -> Map 工具类,list转为map
    Idea debugger 无法启动-unable to open debugger port , java.net.SocketException "socket closed"
    js处理ajax返回的json数组
    ubuntu安装chkconfig.deb系统服务管理工具
    Ubuntu18.04更新源
    IDEA通过Git同步代码到Coding
    解决ERR Client sent AUTH, but no password is set
    PyCharm快捷键
  • 原文地址:https://www.cnblogs.com/xinxinmifan/p/php-export-csv.html
Copyright © 2011-2022 走看看