phpspreadsheet 批量導出與批量導入

使用組件

composer.json中添加該組件,執行composer update命令

 "require": {
        "phpoffice/phpspreadsheet": "^1.9"
    },

1、導出列表數據

use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
 
public function export($list){
	   $title = '職位招聘信息列表';
       $title_arr = ['職位類別','職位名稱','城市','部門','類型','性質','薪資','人數','投遞郵箱','截止時間', '崗位職責','任職資格','發佈狀態'];
       $cell_arr = range('A','Z');
       $spreadsheet = new Spreadsheet();
       $spreadsheet->getActiveSheet()->setTitle($title);
       foreach ($title_arr as $k => $v) {
           $spreadsheet->getActiveSheet()->getStyle($cell_arr[$k] . 1)->getFont()->setBold(true);
           $spreadsheet->getActiveSheet()->getColumnDimension($cell_arr[$k])->setWidth($cell_arr[$k]  > 'H' ? 25 : 15);
           $spreadsheet->getActiveSheet()->setCellValue($cell_arr[$k] . 1, $v);
       }

       $spreadsheet->setActiveSheetIndex(0);

       foreach ($list as $key => $val) {
           $tmp = $key + 2;
           $spreadsheet->getActiveSheet()->setCellValue('A' . $tmp, $val['category']);
           $spreadsheet->getActiveSheet()->setCellValue('B' . $tmp, $val['position']);
           $spreadsheet->getActiveSheet()->setCellValue('C' . $tmp, $val['city']);
           $spreadsheet->getActiveSheet()->setCellValue('D' . $tmp, $val['department']);
           $spreadsheet->getActiveSheet()->setCellValue('E' . $tmp, $val['type']);
           $spreadsheet->getActiveSheet()->setCellValue('F' . $tmp, $val['nature']);
           $spreadsheet->getActiveSheet()->setCellValue('G' . $tmp, $val['salary']);
           $spreadsheet->getActiveSheet()->setCellValue('H' . $tmp, $val['num']);
           $spreadsheet->getActiveSheet()->setCellValue('I' . $tmp, $val['email']);
           $spreadsheet->getActiveSheet()->setCellValue('J' . $tmp, $val['end_date']);
           $spreadsheet->getActiveSheet()->getColumnDimension('K')->setAutoSize(true);
           $spreadsheet->getActiveSheet()->setCellValue('K' . $tmp, $val['task']);
           $spreadsheet->getActiveSheet()->getColumnDimension('L')->setAutoSize(true);
           $spreadsheet->getActiveSheet()->setCellValue('L' . $tmp, $val['ask']);
           $spreadsheet->getActiveSheet()->setCellValue('M' . $tmp, $val['status']);
       }

       //或者$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); 非2007格式
       header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=GB2312');
       header("Pragma: public");
       header('Content-Disposition: attachment;filename="'. $title .'.xlsx"');
       header('Cache-Control: max-age=0');
       $objWriter = IOFactory::createWriter($spreadsheet, 'Xlsx');
       return $objWriter->save('php://output');
   }

2、導出模板

 public function template(){
 	    $title = '職位錄入模板';
        $title_arr = ['職位類別','職位名稱','城市','部門','類型','性質','薪資','人數','投遞郵箱','截止時間,'崗位職責','任職資格'];
        $cell_arr = range('A','Z');
        $spreadsheet = new Spreadsheet();
        $spreadsheet->getActiveSheet()->setTitle($title);
        $spreadsheet->setActiveSheetIndex(0);

        foreach ($title_arr as $k => $v) {
            $cell_num = $cell_arr[$k] . 1;
            $spreadsheet->getActiveSheet()->getStyle($cell_num)->getFont()->setBold(true);
            $spreadsheet->getActiveSheet()->getColumnDimension($cell_arr[$k])->setWidth($cell_arr[$k]  > 'H' ? 25 : 15);
            $spreadsheet->getActiveSheet()->setCellValue($cell_num, $v);
        }

        $dropdown_arr = [ //表格下拉選項
            'A' => ['研發類','行政類','銷售類'],
            'C' => ['深圳市','廣州市','上海市'],
            'D' =>  ['研發部','人事部','財務部'],
            'E' =>  ['校招','社招'],
            'F' =>  ['全職','兼職'],
        ];
        foreach ($dropdown_arr as $column => $item) { //渲染下拉列表
            $objValidation = $spreadsheet->getActiveSheet()->getDataValidation('$'.$column.':$'.$column);
            $objValidation->setType(DataValidation::TYPE_LIST)
                ->setErrorStyle(DataValidation::STYLE_INFORMATION)
                ->setAllowBlank(false)
                ->setShowInputMessage(true)
                ->setShowErrorMessage(true)
                ->setShowDropDown(true)
                ->setErrorTitle('輸入的值有誤')
                ->setError('您輸入的值不在下拉框列表內.')
                ->setPromptTitle('請選擇')
                ->setFormula1('"'.implode(',', $item).'"');
        }

        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=GB2312');
        header("Pragma: public");
        header('Content-Disposition: attachment;filename="'. $title .'.xlsx"');
        header('Cache-Control: max-age=0');
        $objWriter = IOFactory::createWriter($spreadsheet, 'Xlsx');
        return $objWriter->save('php://output');
    }

3、批量導入

 public function import(){
        set_time_limit(60);
        ini_set('memory_limit', '256M');

        $file_size = $_FILES['file']['size'];
        if ($file_size > 5 * 1024 * 1024) {
            throw new \Exception('文件大小不能超過5M');
        }

        $suffix = substr(strrchr($_FILES['file']["name"], '.'), 1);
        if ($suffix != 'xlsx') {
            throw new \Exception('必須爲excel表格,且必須爲xlsx格式!');
        }

        $filename = $_FILES['file']['tmp_name'];
        if (is_uploaded_file($filename)) {
            $objReader = IOFactory::createReader('Xlsx');
            $objReader->setReadDataOnly(true);//忽略任何格式的信息
            $objPHPExcel = $objReader->load($filename);
            $sheet = $objPHPExcel->getSheet(0);   //excel中的第一張sheet
            $highestRow = $sheet->getHighestRow();       // 取得總行數
            // $highestColumn = $sheet->getHighestColumn();   // 取得總列數

            $cates = ['1' => '研發類', '2' => '行政類', '3' => '銷售類'];
            $cites =  ['1'  => '深圳市','2' => '廣州市', '3' => '上海市'];
            $departments =['1'  => '研發部', '2' =>  '人事部', '3' => '財務部'];
            $types =  ['1'  => '校招', '2' =>  '社招'];
            $natures = ['1'  => '全職', '2' => '兼職'];

            $data = [];
            for ($j = 2; $j <= $highestRow; $j++) {
                $category = $objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue();
                if(empty($category)) {
                    throw new \Exception('A列第'.$j.'行職位類別不能爲空');
                }
                $cate_id = array_search($category, $cates);
                if(empty($cate_id)) {
                    throw new \Exception('A列第'.$j.'行職位類別不存在,請先在系統中添加該類型');
                }

                $position = $objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue();
                if(empty($position)) {
                    throw new \Exception('B列第'.$j.'職位名稱不能爲空');
                }

                $city =  $objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue();
                if(empty($city)) {
                    throw new \Exception('C列第'.$j.'行城市信息不能爲空');
                }
                $city_id = array_search($city, $cites);
                if(empty($city_id)) {
                    throw new \Exception('C列第'.$j.'行城市信息不存在,請先在系統中添加該類型');
                }

                $department =  $objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue();
                if(empty($department)) {
                    throw new \Exception('D列第'.$j.'行部門信息不能爲空');
                }
                $department_id = array_search($department, $departments);
                if(empty($department_id)) {
                    throw new \Exception('D列第'.$j.'行部門信息不存在,請先在系統中添加該類型');
                }

                $type =  $objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue();
                if(empty($type)) {
                    throw new \Exception('E列第'.$j.'行招聘類型信息不能爲空');
                }
                $type_id = array_search($type, $types);
                if(empty($type_id)) {
                    throw new \Exception('E列第'.$j.'行招聘類型信息錯誤');
                }

                $nature =  $objPHPExcel->getActiveSheet()->getCell("F" . $j)->getValue();
                if(empty($nature)) {
                    throw new \Exception('F列第'.$j.'行招聘性質信息不能爲空');
                }
                $nature_id = array_search($nature, $natures);
                if(empty($nature_id)) {
                    throw new \Exception('F列第'.$j.'行招聘性質信息錯誤');
                }

                $salary = $objPHPExcel->getActiveSheet()->getCell("G" . $j)->getValue();
                if(empty($salary)) {
                    throw new \Exception('G列第'.$j.'薪資不能爲空');
                }

                $num = $objPHPExcel->getActiveSheet()->getCell("H" . $j)->getValue();
                if(empty($num)) {
                    throw new \Exception('H列第'.$j.'招聘人數不能爲空');
                }

                $email = $objPHPExcel->getActiveSheet()->getCell("I" . $j)->getValue();
                if(empty($email)) {
                    throw new \Exception('I列第'.$j.'投遞郵箱不能爲空');
                }

				$end_date = $objPHPExcel->getActiveSheet()->getCell("J" . $j)->getValue();//獲取的時間爲浮點型
                $end_date = date('Y-m-d', Date::excelToTimestamp($end_date));//轉化爲時間類型

                $task = $objPHPExcel->getActiveSheet()->getCell("K" . $j)->getValue();
                if(empty($task)) {
                    throw new \Exception('K列第'.$j.'崗位職責描述不能爲空');
                }

                $ask = $objPHPExcel->getActiveSheet()->getCell('L' . $j)->getValue();
                if(empty($ask)) {
                    throw new \Exception('L列第'.$j.'任職資格描述不能爲空');
                }

                $data[] = [
                    'cate_id' => $cate_id,
                    'position' => $position,
                    'city_id' => $cate_id,
                    'department_id' => $department_id,
                    'type' => $type_id,
                    'nature' => $nature_id,
                    'salary' => $salary,
                    'num' => $num,
                    'email' => $email,
                    'end_date' => $end_date,
                    'task' => $task,
                    'ask' => $ask,
                    'status' => 1
                ];
            }

            $model = new JobModel();
            $ret = $model->saveAll($data);
            return true;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章