php导出excel表格封装
/**
* 导出excel
* @param $name excel名称
* @param $titles 标题 [['name'=>'姓名'],['gender'=>'性别']]
* @param array $data
* @throws \PhpOffice\PhpSpreadsheet\Exception
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
*/
function downLoadExcel($name, $titles, $data=[])
{
$count = count($titles); //计算表头数量
$spreadsheet = new Spreadsheet();
$styleArray = [
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER_CONTINUOUS,
'vertical' => Alignment::VERTICAL_CENTER,
],
];
$sheet = $spreadsheet->getActiveSheet();
for ($i = 65; $i < $count + 65; $i++) { //数字转字母从65开始,循环设置表头
$sheet->getStyle(strtoupper(chr($i)))->applyFromArray($styleArray);
$sheet->getCell(strtoupper(chr($i)).'1')->getStyle()->getFont()->setBold(true);
$key = key($titles[$i - 65]);
$sheet->setCellValue(strtoupper(chr($i)) . '1', $titles[$i - 65][$key]);
}
/*--------------开始从数据库提取信息插入Excel表中------------------*/
foreach ($data as $key => $item) { //循环设置单元格:
//$key+2,因为第一行是表头,所以写到表格时 从第二行开始写
for ($i = 65; $i < $count + 65; $i++) { //数字转字母从65开始:
$sheet->setCellValue(strtoupper(chr($i)) . ($key + 2),$item[key($titles[$i - 65])]);
$spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setAutoSize(true);
}
}
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $name . '.xlsx"');
header('Cache-Control: max-age=0');
$writer = IOFactory::createWriter($spreadsheet,'Xlsx');
$writer->save('php://output');
//删除清空
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
exit;
}
function test(){
$titles = [
['nickname'=>'昵称'],
['phone'=>'手机号'],
];
$data=[
[
'nickname'=>'张三',
'phone'=>'13411111111'
]
];
downLoadExcel('text表',$titles,$data);
}