php導出Excel簡單函數封裝

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配置直接導出數據還是生成文件,然後把文件名返回給前端,這也不是多好的函數,只當是一個工具,如果分享給大家。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章