通过PHPExcel 生成 excel 文件

xyj2156 PHP 2018-02-24

代码 在此

    /** 把一个二维数组 转换成 excel 表格
     * @param array $data                   | 待转换数据
     * @param array $pro                    | 需要设置的属性 自动判断 是否合法,只设置合法参数
     * @param string $fileName              | 下载后默认的文件名
     */
    function arrayToDownload(Array $data, Array $pro = array(), $fileName = 'default')
    {
        Vendor("Classes.PHPExcel");
        Vendor("Classes.PHPExcel.IOFactory.php");
        Vendor("Classes.PHPExcel.Writer.Excel2007");
//        实例化 excel 类
        $objPHPExcel = new \PHPExcel();
//        设置 文件属性
        $objProps = $objPHPExcel->getProperties();
        $pros = [
            'creator',          // 创作者
            'lastmodifiedby',   // 最后的修饰
            'created',          // 创建
            'modified',         // 修改
            'title',            // 标题
            'description',      // 描述
            'subject',          // 主题
            'keywords',         // 关键词
            'category',         // 类别
            'company',          // 单位
            'manager',          // 管理者
            'customproperty'    // 自定义属性
        ];
        if($pro){
            foreach ($pro as $k => $v){
//                不合法的跳过
                if(!in_array(strtolower($k), $pros)){
                    continue;
                }
                $k = 'set'.$k;
//                自定义属性??
                if(strtolower($k) == 'setcustomproperty'){
//                    检测数据合法性
                    if(!is_array($v) && empty($v['name'])){
                        continue;
                    }
//                    设置默认的 属性值
                    $v['value'] = $v['value'] ? $v['value'] : 'tripsters_jief' ;
//                        设置默认的属性类型
                    $v['type'] = $v['type'] ? $v['type'] : NULL ;
                    $objProps -> $k ($v['name'], $v['value'], $v['type']);
                    continue;
                }
                $objProps -> $k ($v);
            }
        }

//        设置文件名
        $date = date("Y_m_d",time());
        $fileName = "{$fileName}_{$date}.xlsx";
        $fileName = iconv("utf-8", "gb2312", $fileName);

//        设置 sheet
        $objPHPExcel -> setActiveSheetIndex(0);
//        处理二维数组 生成表格
        foreach($data as $k => $v){
            if(!is_array($v)){
                continue;
            }
            $row = $k + 1;
            $col = 'A';
            foreach ($v as $key => $val){
                if(is_array($val)){
                    $val = implode(',', $val);
                }
                $objPHPExcel -> getActiveSheet() -> setCellValue($col.$row, $val);
                $col ++;
            }
        }
        //重命名 sheet
        // $objPHPExcel->getActiveSheet()->setTitle('test');
//        设置header 文件下载
        header('Content-Type: application/vnd.ms-excel');
        header("Content-Disposition: attachment;filename=\"$fileName\"");
        header('Cache-Control: max-age=0');

        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
        $objWriter->save('php://output'); //文件通过浏览器下载
        exit;
    }
主要几点
  1. 我用的是双层循环嵌套,这样可以导出 列数不同的数据。
  2. 第一层 是行数据, 第二层是列数据,在php 中 $a = 'A'; $a++; 此时的$a 就是 'B';所以 第二层循环中直接 简化成 $col ++;
  3. 设置属性 通过一个合法数组过滤当然还有其他方法, 这只是我现在能想到的一种。
  4. 设置属性 不是很明白每一个啥意思。
PREV
服务器下 微信 导出的语音转换成 MP3
NEXT
《PHP文档 》 =》 PHP标记

评论(0)

评论已关闭