博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
excel批量导入规则验证
阅读量:6941 次
发布时间:2019-06-27

本文共 8683 字,大约阅读时间需要 28 分钟。

/**     * 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、最后将数组的信息循环插入遍历数组;

转载于:https://www.cnblogs.com/wzlol/p/10413095.html

你可能感兴趣的文章
进程 线程通信方式(转载)
查看>>
python 从小白开始 - 字符串操作(不可修改)
查看>>
微信小程序 app.json 配置
查看>>
ROCKETMQ——2主2从集群部署
查看>>
横向纵向菜单制作 Jquery
查看>>
Android SDK更新以及ADT更新出现问题的解决办法
查看>>
海量数据:判断一棵树是否为另一棵树的子树
查看>>
Android中Application类用法(转)
查看>>
Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射
查看>>
【struts2】struts2中的流接收与流发送
查看>>
【VMCloud云平台】SCSM(十)服务请求到资源落地
查看>>
Maven组件通过命令上传本地和私有仓库
查看>>
Java编程时间格式与数据库中时间格式转化
查看>>
PhpGACL手册(一)
查看>>
DB2中如何快速定位锁等待语句
查看>>
Exchange server 2003迁移到2010后,手动更新地址列表,提示OAB Versions无效
查看>>
xmanager连接RedHat出错:/usr/X11R6/bin/xterm: No such file or directory
查看>>
我是做SEO的
查看>>
Powershell管理系列(一)Active Direcrtory管理:用户管理
查看>>
使用PsList查看Windows上Oracle的线程等信息
查看>>