phpspreadsheet 導出多個工作表
因為有多組數據導出,所以要新建多張工作表
實現效果
主要創建方式有兩種
//方式1 $spreadsheet->createSheet();
//方式2 Create a new worksheet called "My Data"
$myWorkSheet = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, 'My Data');//與下面的配合使用
$spreadsheet->addSheet($myWorkSheet, 0);//將“My Data”工作表作為電子表格對象中的第一個工作表附加
代碼如下
優化后的代碼
public function export(){
$name='每日統計'.date("Y-m-d H-i-s",time());
// $data=[['aa','aa','cc','dd','ee'],['bb','bb','cc','dd','ee']];
// ?工地考勤
$data['kaoqin'] = Db::name('pt_gd_gdrz rz')
->field("DATE_FORMAT(FROM_UNIXTIME(ctime),'%Y-%m-%d') as date,u.name,rz.title,rz.content")
->where(['p.appid'=>session('pt_res.appid')])
->join('zf_pt_post p','p.id=rz.gd_id')
->join('zf_user u','rz.openid = u.openid')
->whereTime('ctime', 'today')
->select();
////工地打卡
$data['daka'] = Db::name('pt_gd_gddk rz')
->field("DATE_FORMAT(FROM_UNIXTIME(ctime),'%Y-%m-%d') as date,u.name,p.title")
->where(['p.appid'=>session('pt_res.appid')])
->join('zf_pt_post p','p.id=rz.gd_id')
->join('zf_user u','rz.openid = u.openid')
->whereTime('ctime', 'today')
->select();
// 新用戶
$data['yonghu'] = Db::name('user')->where(['appid'=>session('pt_res.appid')])->field("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d %H:%i:%s') as date,name")
->whereTime('create_time', 'today')
->select();
// 預約
$data['yuyue'] = Db::name('yuyue y')
->field("DATE_FORMAT(FROM_UNIXTIME(ctime),'%Y-%m-%d') as date,u.name,y.phone")
->where(['u.appid'=>session('pt_res.appid')])
->whereTime('ctime', 'today')
->join('zf_user u','u.id=y.uid')
->select();
//設置表頭:
$head['kaoqin'] = ['時間','姓名','標題', '內容'];
//數據中對應的字段,用於讀取相應數據:
$keys['kaoqin'] = ['date','name','title','content'];
$count['kaoqin'] = count($head['kaoqin']); //計算表頭數量
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet()->setTitle('工地考勤');
for ($i = 65; $i < $count['kaoqin'] + 65; $i++) { //數字轉字母從65開始,循環設置表頭:
$sheet->setCellValue(strtoupper(chr($i)) . '1', $head['kaoqin'][$i - 65]);
}
/*--------------開始從數據庫提取信息插入Excel表中------------------*/
foreach ($data['kaoqin'] as $key => $item) { //循環設置單元格:
//$key+2,因為第一行是表頭,所以寫到表格時 從第二行開始寫
for ($i = 65; $i < $count['kaoqin'] + 65; $i++) { //數字轉字母從65開始:
$sheet->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys['kaoqin'][$i - 65]]);
$spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20); //固定列寬
}
}
//工地打卡
//方式2 Create a new worksheet called "My Data"
$myWorkSheet['daka'] = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, '工地打卡');//與下面的配合使用
$spreadsheet->addSheet($myWorkSheet['daka'], 0);//將“My Data”工作表作為電子表格對象中的第一個工作表附加
$head['daka'] = ['時間','姓名','標題'];
//數據中對應的字段,用於讀取相應數據:
$keys['daka'] = ['date','name','title'];
$count['daka'] = count($head['daka']); //計算表頭數量
for ($i = 65; $i < $count['daka'] + 65; $i++) { //數字轉字母從65開始,循環設置表頭:
$myWorkSheet['daka']->setCellValue(strtoupper(chr($i)) . '1', $head['daka'][$i - 65]);
}
/*--------------開始從數據庫提取信息插入Excel表中------------------*/
foreach ($data['daka'] as $key => $item) { //循環設置單元格:
//$key+2,因為第一行是表頭,所以寫到表格時 從第二行開始寫
for ($i = 65; $i < $count['daka'] + 65; $i++) { //數字轉字母從65開始:
$myWorkSheet['daka']->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys['daka'][$i - 65]]);
$spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20); //固定列寬
}
}
// 新用戶
//方式2 Create a new worksheet called "My Data"
$myWorkSheet['yonghu'] = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, '新用戶');//與下面的配合使用
$spreadsheet->addSheet($myWorkSheet['yonghu'], 0);//將“My Data”工作表作為電子表格對象中的第一個工作表附加
$head['yonghu'] = ['時間','姓名'];
//數據中對應的字段,用於讀取相應數據:
$keys['yonghu'] = ['date','name'];
$count['yonghu'] = count($head['yonghu']); //計算表頭數量
for ($i = 65; $i < $count['yonghu'] + 65; $i++) { //數字轉字母從65開始,循環設置表頭:
$myWorkSheet['yonghu']->setCellValue(strtoupper(chr($i)) . '1', $head['yonghu'][$i - 65]);
}
/*--------------開始從數據庫提取信息插入Excel表中------------------*/
foreach ($data['yonghu'] as $key => $item) { //循環設置單元格:
//$key+2,因為第一行是表頭,所以寫到表格時 從第二行開始寫
for ($i = 65; $i < $count['yonghu'] + 65; $i++) { //數字轉字母從65開始:
$myWorkSheet['yonghu']->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys['yonghu'][$i - 65]]);
$spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20); //固定列寬
}
}
// 預約
//方式2 Create a new worksheet called "My Data"
$myWorkSheet['yuyue'] = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, '預約');//與下面的配合使用
$spreadsheet->addSheet($myWorkSheet['yuyue'], 0);//將“My Data”工作表作為電子表格對象中的第一個工作表附加
$head['yuyue'] = ['時間','姓名','電話'];
//數據中對應的字段,用於讀取相應數據:
$keys['yuyue'] = ['date','name','phone'];
$count['yuyue'] = count($head['yuyue']); //計算表頭數量
for ($i = 65; $i < $count['yuyue'] + 65; $i++) { //數字轉字母從65開始,循環設置表頭:
$myWorkSheet['yuyue']->setCellValue(strtoupper(chr($i)) . '1', $head['yuyue'][$i - 65]);
}
/*--------------開始從數據庫提取信息插入Excel表中------------------*/
foreach ($data['yuyue'] as $key => $item) { //循環設置單元格:
//$key+2,因為第一行是表頭,所以寫到表格時 從第二行開始寫
for ($i = 65; $i < $count['yuyue'] + 65; $i++) { //數字轉字母從65開始:
$myWorkSheet['yuyue']->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys['yuyue'][$i - 65]]);
$spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20); //固定列寬
}
}
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $name . '.xlsx"');
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
//刪除清空:
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
exit;
}
