PHP生成带图片的Excel

最近项目有这样一个需求,要导出带有设备二维码的Excel列表。这个功能此前还没有做过,于是百度了一番。网上的解决方法大多数都可以用,但是都没有封装成函数,复用性不高,于是我这里做了一下封装。具体看代码

/**
     *生成带有图片的
     * $data array(0=>array('A'=>'tom','B'=>10),1=>array('A'=>'jack','B'=>8),)
     * $tableStyle 表格样式 array('A'=>['title'=>'名字','width'=>20],'B'=>['title'=>'年龄','width'=>10])
     * $fileName 文件名
     */
    public function excel_down($data,$tableStyle,$fileName=''){

        // 引入以下类
        import('PHPExcel',EXTEND_PATH.'phpoffice/phpexcel/Classes');
        import('Excel2007',EXTEND_PATH.'phpoffice/phpexcel/Classes/PHPExcel/Writer');
        import('Drawing',EXTEND_PATH.'phpoffice/phpexcel/Classes/PHPExcel/Worksheet');
        import('IOFactory',EXTEND_PATH.'phpoffice/phpexcel/Classes/PHPExcel');

        $objPHPExcel = new \PHPExcel();

        $objActSheet = $objPHPExcel->getActiveSheet();

        //表格样式
        foreach ($tableStyle as $key=>$val){
            //设置表格宽度
            $objPHPExcel->getActiveSheet()->getColumnDimension($key)->setWidth($val['width']);
            //设置单元格居中
            $objPHPExcel->setActiveSheetIndex(0)->getStyle($key)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            $objPHPExcel->getActiveSheet()->getStyle($key)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
            //设置表头
            $objActSheet->setCellValue($key.'1', $val['title']);
        }


        //填入数据
        foreach($data as $k=>$v){
            $k +=2;
            $objActSheet->setCellValue('A'.$k, $v['A']);
            $objActSheet->setCellValue('B'.$k, $v['B']);
            $objActSheet->setCellValue('C'.$k, $v['C']);
            $objActSheet->setCellValue('D'.$k, $v['D']);
            $objActSheet->setCellValue('E'.$k, $v['E']);
            $objActSheet->setCellValue('F'.$k, $v['F']);
            $objActSheet->setCellValue('G'.$k, $v['G']);
            $objActSheet->setCellValue('H'.$k, $v['H']);
            $objActSheet->setCellValue('I'.$k, $v['I']);
            $objActSheet->setCellValue('J'.$k, $v['J']);
            $objActSheet->setCellValue('K'.$k, $v['K']);

            // 图片生成
            $objDrawing[$k] = new \PHPExcel_Worksheet_Drawing();
            $objDrawing[$k]->setPath($v['L']);
            // 设置宽度高度
            $objDrawing[$k]->setHeight(80);//照片高度
            $objDrawing[$k]->setWidth(80); //照片宽度
            /*设置图片要插入的单元格*/
            $objDrawing[$k]->setCoordinates('L'.$k);
            // 图片偏移距离
            $objDrawing[$k]->setOffsetX(12);
            $objDrawing[$k]->setOffsetY(12);
            $objDrawing[$k]->setWorksheet($objPHPExcel->getActiveSheet());

            // 表格高度
            $objActSheet->getRowDimension($k)->setRowHeight(80);

        }


        $date = date("Y-m-d",time());
        $fileName .= "_{$date}.xls";
        $fileName = iconv("utf-8", "gb2312", $fileName);

        //设置默认打开这是第一个表
        $objPHPExcel->setActiveSheetIndex(0);
        header('Content-Type: application/vnd.ms-excel');
        header("Content-Disposition: attachment;filename=\"$fileName\"");
        header('Cache-Control: max-age=0');
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output'); //下载
    }

调用如下

/**
     * 列表导出
     */
    public function dataExcel($data){

        $exel = new ExcelController();
        //表格样式
        $tableStyle = array(
            'A'=>[
                'title'=>'设备编号',//表头
                'width'=>20        //宽度
            ],
            'B'=>[
                'title'=>'设备名称',
                'width'=>20
            ],
            'C'=>[
                'title'=>'设备类型',
                'width'=>20
            ],
            'D'=>[
                'title'=>'设备状态',
                'width'=>20
            ],
            'E'=>[
                'title'=>'货道数',
                'width'=>15
            ],
            'F'=>[
                'title'=>'设备拥有者',
                'width'=>20
            ],
            'G'=>[
                'title'=>'运维人员',
                'width'=>20
            ],
            'H'=>[
                'title'=>'点位方',
                'width'=>20
            ],
            'I'=>[
                'title'=>'地址',
                'width'=>35
            ],
            'J'=>[
                'title'=>'sim',
                'width'=>35
            ],
            'K'=>[
                'title'=>'添加时间',
                'width'=>20
            ],
            'L'=>[
                'title'=>'二维码',
                'width'=>15
            ]
        );
        //处理数组把对应值放入对应列
        $excelData=array();
        foreach ($data as $key=>$val){
            $excelData[$key]['A']=$val['device_sn']."\t";
            $excelData[$key]['B']=$val['machineName']."\t";
            $excelData[$key]['C']=$val['type'];
            if ($val['status']==1){
                $statusName = '设备在线';
            }elseif ($val['status']==3){
                $statusName = '设备离线';
            }elseif ($val['status']==2){
                if ($val['quenum']){
                    $statusName = '货道'.$val['quenum'].'缺货';
                }else{
                    $statusName = '货道'.$val['badnum'].'异常';
                }
            }
            $excelData[$key]['D']=$statusName;
            $excelData[$key]['E']=$val['number'];
            $excelData[$key]['F']=$val['user_login'];
            $excelData[$key]['G']=isset($val['managerName']) ? $val['managerName'] : '无';
            $excelData[$key]['H']=isset($val['dianweiName']) ? $val['dianweiName'] : '无';
            $excelData[$key]['I']=isset($val['addresName']) ? $val['addresName'].$val['addressDetail'] : '无';
            $excelData[$key]['J']=$val['sim'] ? $val['sim']."\t" : '无';
            $excelData[$key]['K']=date('Y-m-d H:i:s',$val['time']);
            $excelData[$key]['L']=$val['qrcode'];
        }

        $exel->excel_down($excelData,$tableStyle,'设备列表');
    }

猜你喜欢

转载自blog.csdn.net/YoungJ_Zhou/article/details/89011145