需先安装spreadsheet第三方类库
public function getReportExcel(){
//取出要导出的值
$id = I('id');
$result=$this->getReportData($id);
//验证值是否存在
if (empty($result)) {
return [false, '未获取到相关表格数据!'];
}
vendor('autoload', '', '.php'); //引入自动加载类,用于加载第三方类库
//实例化Spreadsheet库
//创建一个excel文件
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
//用report来写入文件
$report = $spreadsheet->getActiveSheet();
//数据处理
$title = $result['data']['name'];
$data = $result['report'];
$str="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //如果26列不够 AA AB AC类推
foreach($result['fields'] as $k =>$v){
$cellName[$str[$k]]=[$v['name'],$v['title']];
}
// $cellName的格式为
// $cellName=[
// 'A'=>['字段','字段中文名'],
// 'B'=>['id', '文章ID'],
// 'C' => ['title', '标题']
// ]
//设置第一行为标题 mergeCells(A1:E1) 从A1合并到E1
//setCellValue 赋值 给标题赋值为 标题+年月日
$report->mergeCells('A1:'.end(array_keys($cellName)).'1')->setCellValue('A1', $title.' 时间: '.date('Y-m-d')); //先合并,再赋值
//第二行为字段名
//循环设置字段名
foreach ($cellName as $k => $v) {
$report->setCellValue($k.'2', $v[1]); //注意是从的二行开始
}
// //循环赋值,填充表单内容,PS:从第三开始
for ($i = 0, $count = count($data); $i < $count; ++$i) {
$cellRowIndex = $i + 3; //表格从第三行开始
foreach ($cellName as $k => $v) {
$value = $data[$i][$v[0]]; //对应字段的值
$report->setCellValue($k.$cellRowIndex, $value);
}
}
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($spreadsheet);
ob_end_clean();
header('Pragma:public');
header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$title.'.xls"');
//attachment新窗口打印inline本窗口打印
header('Content-Disposition:attachment;filename='.$title.date('Ymd').'.xls');
header('Cache-Control: max-age=0');
//输出选择框 选择保存到哪
$writer->save('php://output');
}
//这个类不能以api的形式访问,如果是前后分离,请用windows.open;
//若需要给excel表格添加样式 参考文档 https://www.helloweba.net/php/564.html
//本文中的写法
$report->getColumnDimension($k)->setAutoSize(true);