最近项目有这样一个需求,要导出带有设备二维码的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,'设备列表');
}