php通過composer安裝phpoffice,composer中添加如下require
"require": {
"php": ">=5.6.0",
"topthink/framework": "5.1.*",
"topthink/think-captcha": "^2.0",
"phpoffice/phpspreadsheet": "^1.6",
"qcloud/cos-sdk-v5": "^1.3",
"hooklife/thinkphp5-wechat": "^1.1",
"qcloudsms/qcloudsms_php": "^0.1.4"
},
代碼封裝
$list_export = '通過數據庫查詢出來的數據';
foreach ($list_export as $k => $v) {
$list_export[$k]['student_name'] = (new StudentModel())->getById($v['student_id'])['student_name'];
$list_export[$k]['course_name'] = (new CourseModel())->getById($v['course_id'])['course_name'];
$list_export[$k]['class_name'] = (new ClassModel())->getById($v['class_id'])['class_name'];
$list_export[$k]['pa'] = (new AdminModel())->getById($v['check_pa'])['nickname'];
$list_export[$k]['teacher_name'] = (new AdminModel())->getById($v['class_teacher'])['nickname'];
$list_export[$k]['school_name'] = (new SchoolModel())->getById($v['school_id'])['school_name'];
$list_export[$k]['check_status'] = $check_work_state[$v['status']];
}
$arr = [
'A' => '校區|school_name|20 ',
'B' => '班級名稱|class_name|20',
'C' => 'PA|pa|20',
'D' => '學員姓名|student_name|20',
'E' => '課程|course_name|20',
'F' => '上課老師|teacher_name|20',
'G' => '在讀狀態|check_status|20',
'H' => '課時|class_hour|20',
'I' => '課銷|price|20',
];
export_excel($arr, $list_export, '', '課銷統計.xlsx', 1);
以上代碼中的$arr就是一個對應的Excel中的列的名稱,對應數據庫中的名字,還有就是每個cell的寬度,如果想要設置更多屬性可以模仿在寬度後面增加|分割新字段。list_export就是要導出的數據。以下關鍵在於export_excel 這個函數。
use PhpOffice\PhpSpreadsheet\Spreadsheet;//使用前先use下命名空間
function export_excel($arr = [], $data = [], $file_dir = './logs', $file_name = '', $is_download = 0)
{
try {
$spreadsheet = new Spreadsheet();
$temp = $spreadsheet->setActiveSheetIndex(0);
$temp1 = $spreadsheet->getActiveSheet();
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$i = 1;
$data1 = [[]];
foreach ($data as $k => $v) {
$data1[] = $data[$k]; //爲表頭增加一次循環
}
$data = $data1;
foreach ($data as $k => $v) {
foreach ($arr as $kk => $vv) {
$val_arr = explode('|', $vv);
$new_key = $kk . $i;
if ($i == 1) {
$temp->setCellValue($new_key, $val_arr[0]);
} else {
$temp1->setCellValue($new_key, $v[$val_arr[1]]);
}
$temp1->getColumnDimension($kk)->setWidth($val_arr[2]);
}
$i++;
}
//設置每一個標題列的寬度
$file_name = ($file_name == '' ? time() . rand(1000, 90000) . '.xlsx' : $file_name);
$save_file = $file_dir . $file_name;
ob_end_clean();
$writer->save($save_file);
if ($is_download) {
//以只讀和二進制模式打開文件
$file = fopen($save_file, "rb");
//告訴瀏覽器這是一個文件流格式的文件
Header("Content-type: application/octet-stream");
//請求範圍的度量單位
Header("Accept-Ranges: bytes");
//Content-Length是指定包含於請求或響應中數據的字節長度
Header("Accept-Length: " . filesize($save_file));
//用來告訴瀏覽器,文件是可以當做附件被下載,下載後的文件名稱爲$file_name該變量的值。
Header("Content-Disposition: attachment; filename=" . $file_name);
//讀取文件內容並直接輸出到瀏覽器
echo fread($file, filesize($save_file));
fclose($file);
exit ();
} else {
return commonArr(1, '生成文件成功', ['name' => $save_file]);
}
} catch (\Exception $exception) {
return commonArr(0, $exception->getMessage());
}
對於這個函數的優點就是通過循環來避免之前的挨個cell的設置,太麻煩了,可以通過is_download配置直接導出數據還是生成文件,然後把文件名返回給前端,這也不是多好的函數,只當是一個工具,如果分享給大家。