excel批量導入規則驗證


/**
     * excel導入
     */
    public function excelimport()
    {
        $eid = I('get.eid','','htmlspecialchars');

        //判斷是否選擇了要上傳的表格
        if (empty($_FILES['file'])) {
            $this->ajaxReturn(['code' => 3010,'msg' => '您未選擇表格']);
        }

        //獲取表格的大小,限制上傳表格的大小5M
        $file_size = $_FILES['file']['size'];
        if ($file_size>5*1024*1024) {
            $this->ajaxReturn(['code' => 3010,'msg' => '導入失敗,上傳的表格不能超過5M的大小']);
        }

        //限制上傳表格類型
        $file_type = $_FILES['file']['type'];
        //application/vnd.ms-excel  為xls文件類型
        if ($file_type!='application/vnd.ms-excel') {
            $this->ajaxReturn(['code' => 3010,'msg' => '導入失敗,只能上傳excel2003的xls格式!']);
        }

        if(is_uploaded_file($_FILES['file']['tmp_name']))
        {
            Vendor('phpexcel.PHPExcel');
            Vendor('phpexcel.PHPExcel.IOFactory');
            Vendor('phpexcel.PHPExcel.Reader.Excel5');
            //以上三步加載phpExcel的類

            $objReader = \PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format
            //接收存在緩存中的excel表格
            $filename = $_FILES['file']['tmp_name'];
            $objPHPExcel = $objReader->load($filename); //$filename可以是上傳的表格,或者是指定的表格
            $sheet = $objPHPExcel->getSheet(0);
            $highestRow = $sheet->getHighestRow(); // 取得總行數

            //循環讀取excel表格,讀取一條,插入一條
            for($j=2;$j<=$highestRow;$j++)
            {
                $a = $objPHPExcel->getActiveSheet()->getCell("A".$j)->getValue();//獲取me_id的值
                M('','',DBConfig::$MYSQL_MAMI_JS_MASTER)->table('js_enterprisesales_medicinalprice')->add([
                    'e_id' => $eid,
                    'me_id' => $a,
                    'medicinal_price' => 0
                ]);
            }
            $this->ajaxReturn(['code' => 1,'msg' => '導入成功!']);
        }
    }

    /**
     * 批量導入數據
     */
    public function medicineImport()
    {
        $tmp_name = $_FILES['file']['tmp_name'];
        $exts = explode('.',$_FILES['file']['name']);
        $url = APP_PATH."Runtime/Cache/".time().rand(10000,99999).'.'.$exts[1];
        if(move_uploaded_file($tmp_name,$url) ){
            $result = $this->dataImport($url,$exts[1]);
            if($result['code'] == -1){
                $this->ajaxError($result['msg']);
            }
            unlink($url);
            $this->ajaxSuccess('導入成功');
        }else{
            $this->ajaxError('上傳失敗');
        }
    }

    private function dataImport($filename, $exts = 'xls')
    {
        set_time_limit(0);
        ini_set('memory_limit','1024M');
        ini_set('max_execution_time',0);
        //導入PHPExcel類庫,因為PHPExcel沒有用命名空間,只能inport導入
        vendor('PHPExcel.PHPExcel');
        //創建PHPExcel對象,注意,不能少了
        $PHPExcel = new \PHPExcel();
        if ($exts == 'xls') {
            Vendor('phpexcel.PHPExcel.Reader.Excel5');
            $PHPReader = new \PHPExcel_Reader_Excel5();
        } else if ($exts == 'xlsx') {
            Vendor('phpexcel.PHPExcel.Reader.Excel2007');
            $PHPReader = new \PHPExcel_Reader_Excel2007();
        }
        //載入文件
        $PHPExcel = $PHPReader->load($filename);
        //獲取表中的第一個工作表,如果要獲取第二個,把0改為1,依次類推
        $currentSheet = $PHPExcel->getSheet(0);
        //獲取總列數
        $allColumn = $currentSheet->getHighestColumn();
        //獲取總行數
        $allRow = $currentSheet->getHighestRow();
        $Arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ'];
        $totalNum = array_search($allColumn,$Arr);
        //循環獲取表中的數據,$currentRow表示當前行,從哪行開始讀取數據,索引值從0開始
        for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
            //從哪列開始,A表示第一列
            for ($currentColumn = 0; $currentColumn <= $totalNum; $currentColumn++) {
                //數據坐標
                $address = $Arr[$currentColumn] . $currentRow;
                //讀取到的數據,保存到數組$data中
                $cell = (string)$currentSheet->getCell($address)->getValue();
                $data[$currentRow - 1][$Arr[$currentColumn]] = $cell;
            }
        }
        //驗證表格中數據的完整性與格式的准確性
        $message = $this->checkExcelData($data);
        if($message['code'] == -1){
            return $message;
        }
        //寫入數據庫操作
        //$res = $this->insertData($data);
    }

    /**
     * 驗證表格中數據的完整性與准確性
     * @param $data
     * @return mixed
     */
    private function checkExcelData($data){
        $message['code'] = 0;
        $message['msg'] = "失敗";
        //驗證數據規則
        if(!empty($data)){
            foreach($data as $mk=>$mv){
                //驗證商品名稱,長度不能超過50個長度
                if(iconv_strlen($mv['A'],"UTF-8") >49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."的商品名稱不能超過50個長度";
                    break;
                }

                //驗證拼音縮寫長度,不能超過50個長度
                if(iconv_strlen($mv['B'],"UTF-8") > 49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的商品名首字母縮寫不能超過50個長度";
                    break;
                }

                //驗證葯品通用名不能為空
                if(empty($mv['C'])){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的通用名不能為空";
                    break;
                }

                //驗證葯品通用名長度,不能超過50個長度
                if(iconv_strlen($mv['C'],"UTF-8") > 49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的通用名不能超過50個長度";
                    break;
                }

                //驗證葯品通用名首字母縮寫長度,不能超過50個長度
                if(iconv_strlen($mv['D'],"UTF-8") > 49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的通用名首字母縮寫不能超過50個長度";
                    break;
                }

                //驗證葯品處方完整度
                if(empty($mv['E'])){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的處方信息不完整";
                    break;
                }

                //驗證葯品類別長度
                if(iconv_strlen($mv['F'],"UTF-8") > 49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的類別不能超過50個長度";
                    break;
                }

                //驗證葯品性狀長度,不能超過50個長度
                if(iconv_strlen($mv['H'],"UTF-8") > 49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的性狀不能超過50個長度";
                    break;
                }

                //驗證葯品性狀長度,不能超過50個長度
                if(iconv_strlen($mv['N'],"UTF-8") > 49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."的葯品企業長度不能超過50個長度";
                    break;
                }

                //驗證葯品企業簡稱,不能超過50個長度
                if(iconv_strlen($mv['O'],"UTF-8") > 49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的企業簡稱不能超過50個長度";
                    break;
                }

                //驗證葯品參考價格必須是數字類型,且不能為空
                if(!preg_match('/^[1-9]\d*(.\d{1,2})?$|^0(.\d{1,2})?$/', $mv['P'])){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的參考價格必須是數字格式";
                    break;
                }

                //驗證葯品的參考活動價格,長度不能超過50個長度
                if(!empty($mv['Q']) && !preg_match('/^[1-9]\d*(.\d{1,2})?$|^0(.\d{1,2})?$/', $mv['Q']) ){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的參考活動價格必須是數字格式";
                    break;
                }

                //驗證葯品的批准文號,長度不能超過50個長度
                if(iconv_strlen($mv['R'],"UTF-8") > 49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的批准文號不能超過50個長度";
                    break;
                }

                //驗證葯品條形碼長度,長度不能超過50個長度
                if(iconv_strlen($mv['S'],"UTF-8") > 49){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的條形碼不能超過50個長度";
                    break;
                }

                //驗證葯品推薦用葯天數,必須是數字格式
                if(!empty($mv['U']) && !preg_match('/^[1-9]\d*?$/', $mv['U'])){
                    $message['code'] = -1;
                    $message['msg'] = $mv['C']."葯品的用葯天數必須為數字格式";
                    break;
                }
            }
        }else{
            $message['code'] = -1;
            $message['msg'] = "表格格式或者數據有問題,請檢查表格";
        }
        return $message;
    }

1、在在驗證字符串長度的時候,一開始使用的strlen進行計算的,后來發現所用到的都是中文字符串;所以利用icon_strlen()方法進行統計中文字符串的長度;並使用參考價格格式進行驗證;

2、整個步驟的流程就是先將excel中的表格數據全部取出來,放入一個數組里面,然后將這個數據里面的數據進行格式驗證;簡化的話,可以在去除數組的時候,就可以驗證數據的准確性;這樣可以減少很大的一個循環!這個留着后面再優化!

3、將數據的信息取出來以后,然后遍歷循環,一個個字段進行數據驗證,這個驗證是根據后台服務器字段進行規則驗證的;

4、最后將數組的信息循環插入遍歷數組;


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com