TP6框架--EasyAdmin學習筆記:Excel表單導入數據庫


這是我寫的學習EasyAdmin的第四章,這一章我給大家分享下Excel表單導入數據庫的全流程需要怎么處理並提供案例

首先給大家看下這個功能的原理,下面是PHP連接打印機的代碼

    public function uplExcel(Request $request)
    {
        if (!empty($_FILES['excel']['name'])) {
            $fileName = $_FILES['excel']['name'];    //得到文件全名
            $dotArray = explode('.', $fileName);    //把文件名安.區分,拆分成數組
            $type = end($dotArray);

            if ($type != "xls" && $type != "xlsx") {
                $ret['res'] = "0";
                $ret['msg'] = "不是Excel文件,請重新上傳!";
                return json_encode($ret);
            }

            //取數組最后一個元素,得到文件類型
            $uploaddir = "../uploads2/" . date("Y-m-d") . '/';//設置文件保存目錄 注意包含
            if (!file_exists($uploaddir)) {
                mkdir($uploaddir, 0777, true);
            }

            $path = $uploaddir . md5(uniqid(rand())) . '.' . $type; //產生隨機文件名
            //$path = "images/".$fileName; //客戶端上傳的文件名;
            //下面必須是tmp_name 因為是從臨時文件夾中移動
            move_uploaded_file($_FILES['excel']['tmp_name'], $path); //從服務器臨時文件拷貝到相應的文件夾下

            $file_path = $path;
            if (!file_exists($path)) {
                $ret['res'] = "0";
                $ret['msg'] = "上傳文件丟失!" . $_FILES['excel']['error'];
                return json_encode($ret);
            }

            //文件的擴展名
            $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
            if ($ext == 'xlsx') {
                $objReader = \PHPExcel_IOFactory::createReader('Excel2007');
                $objPHPExcel = $objReader->load($file_path, 'utf-8');
            } elseif ($ext == 'xls') {
                $objReader = \PHPExcel_IOFactory::createReader('Excel5');
                $objPHPExcel = $objReader->load($file_path, 'utf-8');
            }

            $sheet = $objPHPExcel->getSheet(0);
            $highestRow = $sheet->getHighestRow(); // 取得總行數
            $highestColumn = $sheet->getHighestColumn(); // 取得總列數
            $ar = array();
            $i = 0;
            $importRows = 0;
            for ($j = 2; $j <= $highestRow; $j++) {
                $importRows++;

                $realName = (string)$objPHPExcel->getActiveSheet()->getCell("A$j")->getValue();//需要導入的realName
                $phone = (string)$objPHPExcel->getActiveSheet()->getCell("B$j")->getValue();   //需要導入的phone
                $company = (string)$objPHPExcel->getActiveSheet()->getCell("C$j")->getValue(); //需要導入的company
                $job = (string)$objPHPExcel->getActiveSheet()->getCell("D$j")->getValue();     //需要導入的job
                $email = (string)$objPHPExcel->getActiveSheet()->getCell("E$j")->getValue();   //需要導入的email
                $ret['mdata'] = $this->addMemb($phone, $realName, $company, $job, $email);//這里就是我的數據庫添加操作定義的一個方法啦,對應替換為自己的

                if ($ret['mdata'] && !is_Bool($ret['mdata'])) {
                    $ar[$i] = $ret['mdata'];
                    $i++;
                }
            }
            if ($i > 0) {
                $ret['res'] = "0";
                $ret['errNum'] = $i;
                $ret['allNum'] = $importRows;
                $ret['sucNum'] = $importRows - $i;
                $ret['mdata'] = $ar;
                $ret['msg'] = "導入完畢!";
                return json_encode($ret);
            }
            $ret['res'] = "1";
            $ret['allNum'] = $importRows;
            $ret['errNum'] = 0;
            $ret['sucNum'] = $importRows;
            $ret['mdata'] = "導入成功!";
            return json_encode($ret);
        } else {
            $ret['res'] = "0";
            $ret['msg'] = "上傳文件失敗!";
            return json_encode($ret);
        }
    }  

大家可以看到,正常的Excel導入流程分為上傳+解析+數據處理+錄入四部,整體的流程是調用對應的接口和插件,而使用TP框架,會直接幫我們繞過上傳流程,我們使用PHPEXCEL插件直接到解析,具體代碼如下:

下載PHPExcel放到vendor下,並在后台接口中導入

public function save(){
       if(request() -> isPost())
       {
           vendor("PHPExcel.PHPExcel"); 
           $objPHPExcel =new \PHPExcel();
 
           //var_dump($objPHPExcel);die;
           //獲取表單上傳文件
           $file = request()->file('excel');
           //print_r($file);die;
           $info = $file->validate(['ext' => 'xlsx'])->move(ROOT_PATH . 'public/file');  //上傳驗證后綴名,以及上傳之后移動的地址  
 
           if($info)
           {
 
               $exclePath = $info->getSaveName();  //獲取文件名
               $file_name = ROOT_PATH . 'public/file/' . DS . $exclePath;//上傳文件的地址
               $objReader =\PHPExcel_IOFactory::createReader("Excel2007");
               $obj_PHPExcel =$objReader->load($file_name, $encode = 'utf-8');  //加載文件內容,編碼utf-8
               $excel_array=$obj_PHPExcel->getSheet(0)->toArray();   //轉換為數組格式
 
               //print_r($excel_array);die;
               array_shift($excel_array);  //刪除第一個數組(標題);
               $city = [];
               $i=0;
               foreach($excel_array as $k=>$v) {
 
               	   $click_time  = strtotime($v[2]);//點擊時間轉為時間戳
               	   $active_time = strtotime($v[2]);//激活時間轉為時間戳
                   $city[$k]['adid']      = $v[0];
                   $city[$k]['idfa']      = $v[1];
                   $city[$k]['udid']      = $v[4];
                   $city[$k]['model']     = $v[5];
                   $city[$k]['os']        = $v[6];
                   $city[$k]['ip']        = $v[7];
                   $city[$k]['add_time']  = $click_time;
                   $city[$k]['act_time']  = $active_time;
 
                   $i++;
               }
 
              // print_r($city);die;
               Db::name("check_udid")->insertAll($city);
           }else
           {
               echo $file->getError();
           }
       }
   } 

EasyAdmin雖然基於TP6,在使用的過程中我發現,它不需要自己寫以上方法,框架自帶一些寫好的上傳方法,直接使用即可,具體方法如下:

在使用的php中導入:

use jianyan\excel\Excel;

調用即可:

            $file = request()->file('file');
            ini_set('memory_limit','1024M');
            $data =  Excel::import($file);        

如果本文對你有所幫助,麻煩你點個贊,下一章講下如何自制搜索框並進行各種參數調整。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM