TP5导入Excel表格

/**
     * 批量导入
     */
    public function import()
    {
        $file = $this->request->request('file');
        if (!$file) {
            $this->error(__('Parameter %s can not be empty', 'file'));
        }
        $filePath = ROOT_PATH . DS . 'public' . DS . $file;
        if (!is_file($filePath)) {
            $this->error(__('No results were found'));
        }
        //实例化reader
        $ext = pathinfo($filePath, PATHINFO_EXTENSION);
        if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
            $this->error(__('Unknown data format'));
        }
        if ($ext === 'csv') {
            $file = fopen($filePath, 'r');
            $filePath = tempnam(sys_get_temp_dir(), 'import_csv');
            $fp = fopen($filePath, "w");
            $n = 0;
            while ($line = fgets($file)) {
                $line = rtrim($line, "\n\r\0");
                $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
                if ($encoding != 'utf-8') {
                    $line = mb_convert_encoding($line, 'utf-8', $encoding);
                }
                if ($n == 0 || preg_match('/^".*"$/', $line)) {
                    fwrite($fp, $line . "\n");
                } else {
                    fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");
                }
                $n++;
            }
            fclose($file) || fclose($fp);

            $reader = new Csv();
        } elseif ($ext === 'xls') {
            $reader = new Xls();
        } else {
            $reader = new Xlsx();
        }

        //导入文件首行类型,默认是注释,如果需要使用字段名称请使用name
        //$importHeadType = isset($this->importHeadType) ? $this->importHeadType : 'comment';
        //模板文件列名
        $listName = ['红人名称', '联系邮箱',  '性别', '年龄区间', '特征标签', '国家地区', '语言', '站点', '社交平台', '平台链接', '平台粉丝', '状态等级', '合作提出方', '是否合作', '创建时间', '创建人', '首次合作时间', '带货/素材', '合作类型', '洽谈合作费', '总销售额', '专属折扣', '注册邮箱'];
        try {
            if (!$PHPExcel = $reader->load($filePath)) {
                $this->error(__('Unknown data format'));
            }
            $currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表
            $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
            $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
            $maxColumnNumber = Coordinate::columnIndexFromString($allColumn);

            $fields = [];
            for ($currentRow = 1; $currentRow <= 1; $currentRow++) {
                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
                    $fields[] = $val;
                }
            }

            //模板文件不正确
            if ($listName !== $fields) {
                throw new Exception("模板文件不正确!!");
            }

            $data = [];
            for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
                    $cell = $currentSheet->getCellByColumnAndRow($currentColumn,$currentRow);
                    if($cell->getDataType()==DataType::TYPE_NUMERIC){
                        $cellstyleformat = $cell->getStyle($cell->getCoordinate())
                            ->getNumberFormat();

                        $formatcode = $cellstyleformat->getFormatCode();

                        if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode)) {
                            $val = DateChange::excelToTimestamp($val);
                            $num = 8*60*60;
                            $val = $val-$num;
                            $val = date('Y-m-d H:i:s',$val);
                        }
                    }
                    $data[$currentRow - 2][$currentColumn - 1] = is_null($val) ? '' : $val;
                }
            }
        } catch (Exception $exception) {
            $this->error($exception->getMessage());
        }

        if (!$data) {
            $this->error('未导入任何数据!!');
        }
        $email_is_only=$this->model->where('is_del',1)->column('email');
        $email_is_only = collection($email_is_only)->toArray();
        $reg_email_is_only=$this->model->where('is_del',1)->column('reg_email');
        $reg_email_is_only = collection($reg_email_is_only)->toArray();
        $discount_is_only=$this->model->where('is_del',1)->column('discount');
        $discount_is_only = collection($discount_is_only)->toArray();
        $old_data=$this->model->where('is_del',1)->field('celebrity_name,reg_email,site_id')->select();
        $old_data = collection($old_data)->toArray();
        $diff_data = [];
        foreach ($old_data as $vv){
            $diff_data[] = implode(',',$vv);
        }

        //批量添加产品
        foreach ($data as $k => $v) {

            if (empty($v[0])) {
                $this->error('导入失败!!,红人名称不能为空');
            }
            if (empty($v[1])) {
                $this->error('导入失败!!,联系邮箱不能为空');
            }
            if (empty($v[13])) {
                $this->error('导入失败!!,是否合作不能为空');
            }
            if (empty($v[15])) {
                $this->error('导入失败!!,创建人不能为空');
            }
            if (!isset($v[19])) {
                $this->error('导入失败!!,洽谈合作费不能为空');
            }
            if (!isset($v[22])) {
                $this->error('导入失败!!,注册邮箱不能为空');
            }
            $params[$k]['celebrity_name'] = $v[0];//红人名称
            $params[$k]['email'] = $v[1];//联系邮箱
            $params[$k]['sex'] = '男'==$v[2]?1:2;//性别
//            $params[$k]['age'] = $v[3];//年龄区间
//            $params[$k]['celebrity_tag'] = $v[4];//特征标签
//            $params[$k]['country_id'] = $v[5];//国家地区
//            $params[$k]['language'] = $v[6];//语言
//            $params[$k]['site_id'] = $v[7];//站点
//            $params[$k]['platform_id'] = $v[8];//社交平台
//            $params[$k]['link'] = $v[9];//平台链接
//            $params[$k]['fens'] = $v[10];//平台粉丝
//            $params[$k]['intention_level'] = $v[11];//状态等级
            $params[$k]['co_sponsor'] = '红人'==$v[12]?2:1;//合作提出方
            $params[$k]['is_cooperation'] = '是'==$v[13]?1:0;//是否合作
            $params[$k]['create_time'] = $v[14];//创建时间
            $params[$k]['create_person'] = $v[15];//创建人
            $params[$k]['cooperation_time'] = $v[16];//首次合作时间
//            $params[$k]['cooperation_goods'] = $v[17];//带货/素材素材
//            $params[$k]['cooperation_type'] = $v[18];//合作类型
            $params[$k]['cooperation_fee'] = $v[19];//洽谈合作费
            $params[$k]['total_sales'] = $v[20];//总销售额
            $params[$k]['discount'] = $v[21];//专属折扣
            $params[$k]['reg_email'] = $v[22];//注册邮箱

            if (in_array($params[$k]['email'],$email_is_only)){
                $num=$k+2;
                $this->error("联系邮箱:[".$params[$k]['email']."]已存在,请检查,第".$num.'行');
            }
            if (in_array($params[$k]['discount'],$discount_is_only)){
                $num=$k+2;
                $this->error("专属折扣:[".$params[$k]['discount']."]已存在,请检查,第".$num.'行');
            }
            if (in_array($params[$k]['reg_email'],$reg_email_is_only)){
                $num=$k+2;
                $this->error("注册邮箱:[".$params[$k]['reg_email']."]已存在,请检查,第".$num.'行');
            }

            switch (strtolower($v[7])) {
                case 'zeelool':
                    $params[$k]['site_id']  = 1;
                    break;
                case 'voogueme':
                    $params[$k]['site_id']  = 2;
                    break;
                case 'nihao':
                    $params[$k]['site_id']  = 3;
                    break;
                case 'meeloog':
                    $params[$k]['site_id']  = 4;
                    break;
                case 'wesee':
                    $params[$k]['site_id']  = 5;
                    break;
                case 'amazon':
                    $params[$k]['site_id']  = 6;
                    break;
                case 'zeelool_es':
                    $params[$k]['site_id']  = 7;
                    break;
                case 'zeelool_jp':
                    $params[$k]['site_id']  = 8;
                    break;
                case 'zeelool_de':
                    $params[$k]['site_id']  = 9;
                    break;
                default:
                    $this->error('导入失败!!,站点来源有误');
                    break;
            }
            //判断是否存在相同数据
            $in_data = $params[$k]['celebrity_name'].','.$params[$k]['reg_email'].','.$params[$k]['site_id'];

            if (in_array($in_data,$diff_data)){
                $num=$k+2;
                $this->error($v[7]."站的红人:".$params[$k]['celebrity_name']."注册邮箱:[".$params[$k]['reg_email']."]已存在,请检查,第".$num.'行');
            }

            switch (trim($v[3])) {
                case '25以下':
                    $params[$k]['age']  = 1;
                    break;
                case '25-35':
                    $params[$k]['age']  = 2;
                    break;
                case '35-45':
                    $params[$k]['age']  = 3;
                    break;
                case '45-55':
                    $params[$k]['age']  = 4;
                    break;
                case '55+':
                    $params[$k]['age']  = 5;
                    break;
                default:
                    $this->error('导入失败!!,年龄区间不符合');
                    break;
            }
            $tags = explode(',',trim($v[4]));
            $tmp_tag = [];
            switch ($tags) {
                case in_array('美妆', $tags):
                    $tmp_tag[] = "1";
                    break;
                case in_array('发型', $tags):
                    $tmp_tag[] = "2";
                    break;
                case in_array('美甲', $tags):
                    $tmp_tag[] = "3";
                    break;
                case in_array('生活', $tags):
                    $tmp_tag[] = "4";
                    break;
                case in_array('娱乐', $tags):
                    $tmp_tag[] = "5";
                    break;
                case in_array('假发', $tags):
                    $tmp_tag[] = "6";
                    break;
                case in_array('其他', $tags):
                    $tmp_tag[] = "7";
                    break;
                default:
                    $tmp_tag[] = "";
                    break;
            }
            $params[$k]['celebrity_tag'] = json_encode($tmp_tag);
            switch (trim($v[5])) {
                case '美国':
                    $params[$k]['country_id']  = 1;
                    break;
                case '英国':
                    $params[$k]['country_id']  = 2;
                    break;
                case '意大利':
                    $params[$k]['country_id']  = 3;
                    break;
                case '德国':
                    $params[$k]['country_id']  = 4;
                    break;
                case '西班牙':
                    $params[$k]['country_id']  = 5;
                    break;
                case '日本':
                    $params[$k]['country_id']  = 6;
                    break;
                case '其他':
                    $params[$k]['country_id']  = 7;
                    break;
                default:
                    $this->error('导入失败!!,国家地区不符合');
                    break;
            }
            switch (trim($v[6])) {
                case '英语':
                    $params[$k]['language']  = 1;
                    break;
                case '西语':
                    $params[$k]['language']  = 2;
                    break;
                case '德语':
                    $params[$k]['language']  = 3;
                    break;
                case '日语':
                    $params[$k]['language']  = 4;
                    break;
                case '中文':
                    $params[$k]['language']  = 5;
                    break;
                case '意大利语':
                    $params[$k]['language']  = 6;
                    break;
                case '法语':
                    $params[$k]['language']  = 7;
                    break;
                case '葡萄牙语':
                    $params[$k]['language']  = 8;
                    break;
                case '韩语':
                    $params[$k]['language']  = 9;
                    break;
                case '俄语':
                    $params[$k]['language']  = 10;
                    break;
                case '其他':
                    $params[$k]['language']  = 11;
                    break;
                default:
                    $this->error('导入失败!!,语言不符合');
                    break;
            }

            $plats = explode(',',trim($v[8]));
            $tmp_plat = [];
            switch ($plats) {
                case in_array('YTB', $plats):
                    $tmp_plat[] = 1;
                    break;
                case in_array('IG', $plats):
                    $tmp_plat[] = 2;
                    break;
                case in_array('FB', $plats):
                    $tmp_plat[] = 3;
                    break;
                case in_array('TT', $plats):
                    $tmp_plat[] = 4;
                    break;
                case in_array('其他', $plats):
                    $tmp_plat[] = 5;
                    break;
                default:
                    $tmp_plat[] = "";
                    break;
            }
            $params[$k]['platform_id'] = json_encode($tmp_plat);
            $params[$k]['link'] = json_encode(explode(',',trim($v[9])));
            $params[$k]['fens'] = json_encode(explode(',',trim($v[10])));
            switch ($v[11]) {
                case '意向':
                    $params[$k]['intention_level'] = 1;
                    break;
                case '沟通':
                    $params[$k]['intention_level']  = 2;
                    break;
                case '合作':
                    $params[$k]['intention_level']  = 3;
                    break;
                case '流失':
                    $params[$k]['intention_level']  = 4;
                    break;
                default:
                    $this->error('导入失败!!,意向等级为:高,中,低');
                    break;
            }
            //cooperation_goods
            $goodss = explode(',',trim($v[17]));
            $tmp_goods = [];
            switch ($goodss) {
                case in_array('带货', $goodss):
                    $tmp_goods[] = "1";
                    break;
                case in_array('素材', $goodss):
                    $tmp_goods[] = "2";
                    break;
                default:
                    $tmp_goods[] = "";
                    break;
            }
            $params[$k]['cooperation_goods'] = json_encode($tmp_goods);
            $co_types = explode(',',trim($v[18]));
            $tmp_co_type = [];
            switch ($co_types) {
                case in_array('图片', $co_types):
                    $tmp_co_type[] = "1";
                    break;
                case in_array('长视频', $co_types):
                    $tmp_co_type[] = "2";
                    break;
                case in_array('短视频', $co_types):
                    $tmp_co_type[] = "3";
                    break;
                case in_array('其他', $co_types):
                    $tmp_co_type[] = "4";
                    break;
                default:
                    $tmp_co_type[] = "";
                    break;
            }
            $params[$k]['cooperation_type'] = json_encode($tmp_co_type);

//            $params[$k]['create_user_id'] = session('admin.id');
//            $params[$k]['create_time'] = date('Y-m-d H:i:s', time());
        }

        $result = $this->model->allowField(true)->saveAll($params);
        if ($result) {
            $this->success('导入成功!!');
        } else {
            $this->error('导入失败!!');
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴钢剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值