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

分类:

技术点:

相关文章:

  • 2021-07-27
  • 2021-12-01
  • 2022-01-19
  • 2021-11-23
  • 2021-11-12
  • 2021-12-01
猜你喜欢
  • 2022-02-19
  • 2022-12-23
  • 2021-11-23
  • 2021-10-28
  • 2021-11-12
  • 2021-12-03
  • 2021-11-22
相关资源
相似解决方案