老莫的笔记本  
  
查看: 1056|回复: 0

laravel 上传的excel 批量上传,批量过滤 问题 ;

[复制链接]

664

主题

881

帖子

5167

积分

超级版主

Rank: 8Rank: 8

积分
5167
发表于 2020-8-5 17:28:24 | 显示全部楼层 |阅读模式
构思:

        1. 关于文件多少tab 页问题, 这个得是个循环;
       
        2. 关于如何 过滤到已经有的那些
       
                解决方案 1:
               
                        一条一条来吧 速度好像不行 太慢了 -.- ,先不管了  开始一条一条来
                       
                       
                解决方案 2:
               
                        建议每一页都这样操作
                       
                        2.2.1 提取出 所有的 注册号, 搞成个 一位数组 comArr ;
                        2.2.2 对数据库来个 in 查询=》查询的结果提出来[只拿出注册号字段即可 ,也搞成个一维数组 myArr];
                        2.2.3 循环 所有要添加的数据,内部循环 myArr ,剔除掉 注册号重复的数据, 然后开始批量存; [建议分页操作]


                        过滤操作:
                               
                                1.  过滤掉空的注册号
                                       
                                2.        过滤掉上传文件中重复的数据
                               
                                3.  将上传文件 搞成一维数组 进行操作 ,再通过跟数据库比对,过滤掉 数据库中已经存在的注册号
                               
                               

实际代码:

  1.     /**
  2.      *  类别        注册号        商标        注册日期[格式为2020-02-02]        使用商品        商品组别        法律状态[不可以超出徐峰的code 范围]        下证情况[有证、无证]  备注       
  3.      *  参数     [ file => excel文件 ]
  4.      *  
  5.      *  访问路由: http://www.newadmin.com/comeExcel  
  6.      *
  7.      */
  8.     public function comeExcel(Request $request)
  9.     {
  10.         if (!$request->hasFile('file')) {
  11.             return [
  12.                 'code' => 1,
  13.                 'message' => '未检索到上传文件'
  14.             ];
  15.         }
  16.         // 解决问题
  17.         // 1.  把文件上传到 本系统
  18.         $file = $request->file('file');

  19.         //原文件名
  20.         // $originalName = $file->getClientOriginalName();

  21.         // 保存随机
  22.         $file->getClientSize();

  23.         //扩展名
  24.         $ext = $file->getClientOriginalExtension();
  25.      
  26.         // 这段代码是用来处理导入时报的一个读取XML过大的错误
  27.         Settings::setLibXmlLoaderOptions(LIBXML_COMPACT | LIBXML_PARSEHUGE);
  28.         // 设置内存无限制
  29.         ini_set('memory_limit', -1);

  30.         $newName = 'is'.date('Y-m-d').time().'.'.$ext;
  31.         // 存放到本地
  32.         $path=$file->move('./uploads/excel/', $newName);

  33.         $filePath = './uploads/excel/'.$newName;
  34.      
  35.         $array = Excel::toArray(new CmsSellTrademarkImport, $filePath);

  36.         // return $array;

  37.         // 拿到徐峰的编码值
  38.         $stateCurrentArr = config('xufengcode.stateCurrentArr');
  39.         $tradeCodeArr = config('xufengcode.tradeCodeArr');


  40.         // 去掉 各个tab 页的分级 搞成一个最大的
  41.         $newBaseArr = array();
  42.         // 将$array 搞成一套维数组
  43.         foreach ($array as $k => $v) {
  44.             // var_dump(count($v));

  45.             // 去掉各个tab 页头部的标记信息,先去掉一行
  46.             array_splice($v, 0, 1);

  47.             foreach ($v as $ak=>$av) {

  48.                 // 如果注册号不为空 [过滤掉空导入 ]
  49.                 if (!empty($av[1])) {
  50.                     
  51.                     // 在这里 对数据进行处理 这里是判断大类
  52.                     if ($av[0]<0 || $av[0]>45) {
  53.                         downjson(1, '上传文件数据异常,请认真检查[格式判定错误]');
  54.                     }
  55.                     if (empty($av[2])) {
  56.                         downjson(1, '上传文件数据异常,请认真检查[商标名不能为空]');
  57.                     }
  58.                     // 匹配日期 [ 不按照 要求 匹配的 完全是 ]
  59.                     if (preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/', $av[3])) {
  60.                         $av[3] = $av[3];
  61.                     } else {
  62.                         $av[3] = null;
  63.                     }
  64.                     // 过滤当前数值 将中文 换成数字
  65.                     $av[6] = array_search( $av[6], $stateCurrentArr);
  66.                     $av[7] = array_search( $av[7], $tradeCodeArr);
  67.                   
  68.                     //  搞这个的目的 就是拆分一级 成为单一的一个数组 方便操作
  69.                     $newBaseArr[] =  $av;
  70.                 }
  71.             }
  72.         }

  73.         // 数组去重[去掉文件中相同的 商标]
  74.         array_unique($newBaseArr, SORT_REGULAR);

  75.         $comArr=array();

  76.         // 每一条 进行操作
  77.         foreach ($newBaseArr as $k => $v) {

  78.             // 1. 拿到所有注册号 下标 1 的时候,这是注册号所在的位置
  79.             $comArr[] = $v[1];
  80.         }

  81.         // laravel 的in 查询
  82.         $myArr = CmsSellTrademark::whereIn('tmNumberText', $comArr)->select('id', 'tmNumberText')->get()->toArray();

  83.         // dd(count( $myArr) );

  84.         // 循环数据库内的值  筛选出数据库中已有的值 【这两个循环 位置颠倒 效果不一样】  
  85.         foreach ($myArr as $n => $m) {
  86.             // 再循环每一条 进行操作
  87.             foreach ($newBaseArr as $k => $v) {
  88.             // var_dump($k); 事实证明 如果截取掉一部分,不影响 循环本身的长度  似乎这个$value 已经被分配了一个 临时的值

  89.                 if ($v[1] == $m['tmNumberText']) {
  90.                     array_splice($newBaseArr, $k, 1);
  91.                 }
  92.             }
  93.         }
  94.         // 去重失败
  95.         // dd( count( $newBaseArr ));
  96.         $intoNewBaseArr = count($newBaseArr);
  97.         if($intoNewBaseArr == 0){
  98.             return [
  99.                 'code' => 1,
  100.                 'message' => '请避免重复导入'
  101.             ];
  102.         }

  103.         
  104.         /*
  105.         修改键值 [
  106.             ctype => 国际分类
  107.             tmNumberText => 申请号
  108.             tmNameText => 商品名称
  109.             registerDate => 注册日期    [格式必须为2020-02-02 ]
  110.             stateCurrent => 商标状态     需要转化[此出得到的值newBaseArr 是转化后的] ,
  111.             tradeCode=> 0、无证 ,1 有证    需要转化[此出得到的值newBaseArr 是转化后的] ,
  112.         ]
  113.         */
  114.         $kname = array('ctype', 'tmNumberText', 'tmNameText', 'registerDate','tmGoodsName','likegroup','stateCurrent','tradeCode','remarks');

  115.         // 调用公共方法 foo  拼凑处json 数据
  116.         array_walk($newBaseArr, 'foo', $kname);
  117.             
  118.         // 处理 并存入数据库 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  119.         // 拆开了再存[ 一次性插入过大就凉凉 所以拆开 每次500条 ]
  120.         $t = array_chunk($newBaseArr, 100);

  121.         foreach ($t as $v) {
  122.             CmsSellTrademark::insert($v);
  123.         }
  124.         

  125.         downjson(0, "导入成功",$intoNewBaseArr);
  126.         
  127.         //  返回的数据 被数据库过滤掉了
  128.         // return $newBaseArr;
  129.     }
  130. }
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表