TP6框架--EasyAdmin学习笔记:Excel表单导入数据库

这是我写的学习EasyAdmin的第四章,这一章我给大家分享下Excel表单导入数据库的全流程需要怎么处理并提供案例

首先给大家看下这个功能的原理,下面是PHP连接打印机的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
public function uplExcel(Request $request)
{
    if (!empty($_FILES['excel']['name'])) {
        $fileName = $_FILES['excel']['name'];    //得到文件全名
        $dotArray = explode('.', $fileName);    //把文件名安.区分,拆分成数组
        $type = end($dotArray);
 
        if ($type != "xls" && $type != "xlsx") {
            $ret['res'] = "0";
            $ret['msg'] = "不是Excel文件,请重新上传!";
            return json_encode($ret);
        }
 
        //取数组最后一个元素,得到文件类型
        $uploaddir = "../uploads2/" . date("Y-m-d") . '/';//设置文件保存目录 注意包含
        if (!file_exists($uploaddir)) {
            mkdir($uploaddir, 0777, true);
        }
 
        $path = $uploaddir . md5(uniqid(rand())) . '.' . $type; //产生随机文件名
        //$path = "images/".$fileName; //客户端上传的文件名;
        //下面必须是tmp_name 因为是从临时文件夹中移动
        move_uploaded_file($_FILES['excel']['tmp_name'], $path); //从服务器临时文件拷贝到相应的文件夹下
 
        $file_path = $path;
        if (!file_exists($path)) {
            $ret['res'] = "0";
            $ret['msg'] = "上传文件丢失!" . $_FILES['excel']['error'];
            return json_encode($ret);
        }
 
        //文件的扩展名
        $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
        if ($ext == 'xlsx') {
            $objReader = \PHPExcel_IOFactory::createReader('Excel2007');
            $objPHPExcel = $objReader->load($file_path, 'utf-8');
        } elseif ($ext == 'xls') {
            $objReader = \PHPExcel_IOFactory::createReader('Excel5');
            $objPHPExcel = $objReader->load($file_path, 'utf-8');
        }
 
        $sheet = $objPHPExcel->getSheet(0);
        $highestRow = $sheet->getHighestRow(); // 取得总行数
        $highestColumn = $sheet->getHighestColumn(); // 取得总列数
        $ar = array();
        $i = 0;
        $importRows = 0;
        for ($j = 2; $j <= $highestRow; $j++) {
            $importRows++;
 
            $realName = (string)$objPHPExcel->getActiveSheet()->getCell("A$j")->getValue();//需要导入的realName
            $phone = (string)$objPHPExcel->getActiveSheet()->getCell("B$j")->getValue();   //需要导入的phone
            $company = (string)$objPHPExcel->getActiveSheet()->getCell("C$j")->getValue(); //需要导入的company
            $job = (string)$objPHPExcel->getActiveSheet()->getCell("D$j")->getValue();     //需要导入的job
            $email = (string)$objPHPExcel->getActiveSheet()->getCell("E$j")->getValue();   //需要导入的email
            $ret['mdata'] = $this->addMemb($phone, $realName, $company, $job, $email);//这里就是我的数据库添加操作定义的一个方法啦,对应替换为自己的
 
            if ($ret['mdata'] && !is_Bool($ret['mdata'])) {
                $ar[$i] = $ret['mdata'];
                $i++;
            }
        }
        if ($i > 0) {
            $ret['res'] = "0";
            $ret['errNum'] = $i;
            $ret['allNum'] = $importRows;
            $ret['sucNum'] = $importRows - $i;
            $ret['mdata'] = $ar;
            $ret['msg'] = "导入完毕!";
            return json_encode($ret);
        }
        $ret['res'] = "1";
        $ret['allNum'] = $importRows;
        $ret['errNum'] = 0;
        $ret['sucNum'] = $importRows;
        $ret['mdata'] = "导入成功!";
        return json_encode($ret);
    } else {
        $ret['res'] = "0";
        $ret['msg'] = "上传文件失败!";
        return json_encode($ret);
    }
}  

大家可以看到,正常的Excel导入流程分为上传+解析+数据处理+录入四部,整体的流程是调用对应的接口和插件,而使用TP框架,会直接帮我们绕过上传流程,我们使用PHPEXCEL插件直接到解析,具体代码如下:

下载PHPExcel放到vendor下,并在后台接口中导入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public function save(){
       if(request() -> isPost())
       {
           vendor("PHPExcel.PHPExcel");
           $objPHPExcel =new \PHPExcel();
  
           //var_dump($objPHPExcel);die;
           //获取表单上传文件
           $file = request()->file('excel');
           //print_r($file);die;
           $info = $file->validate(['ext' => 'xlsx'])->move(ROOT_PATH . 'public/file');  //上传验证后缀名,以及上传之后移动的地址 
  
           if($info)
           {
  
               $exclePath = $info->getSaveName();  //获取文件名
               $file_name = ROOT_PATH . 'public/file/' . DS . $exclePath;//上传文件的地址
               $objReader =\PHPExcel_IOFactory::createReader("Excel2007");
               $obj_PHPExcel =$objReader->load($file_name, $encode = 'utf-8');  //加载文件内容,编码utf-8
               $excel_array=$obj_PHPExcel->getSheet(0)->toArray();   //转换为数组格式
  
               //print_r($excel_array);die;
               array_shift($excel_array);  //删除第一个数组(标题);
               $city = [];
               $i=0;
               foreach($excel_array as $k=>$v) {
  
                   $click_time  = strtotime($v[2]);//点击时间转为时间戳
                   $active_time = strtotime($v[2]);//激活时间转为时间戳
                   $city[$k]['adid']      = $v[0];
                   $city[$k]['idfa']      = $v[1];
                   $city[$k]['udid']      = $v[4];
                   $city[$k]['model']     = $v[5];
                   $city[$k]['os']        = $v[6];
                   $city[$k]['ip']        = $v[7];
                   $city[$k]['add_time']  = $click_time;
                   $city[$k]['act_time']  = $active_time;
  
                   $i++;
               }
  
              // print_r($city);die;
               Db::name("check_udid")->insertAll($city);
           }else
           {
               echo $file->getError();
           }
       }
   } 

EasyAdmin虽然基于TP6,在使用的过程中我发现,它不需要自己写以上方法,框架自带一些写好的上传方法,直接使用即可,具体方法如下:

在使用的php中导入:

1
use jianyan\excel\Excel;

调用即可:

1
2
3
$file = request()->file('file');
ini_set('memory_limit','1024M');
$data =  Excel::import($file);

如果本文对你有所帮助,麻烦你点个赞,下一章讲下如何自制搜索框并进行各种参数调整。

posted @   林恒  阅读(1154)  评论(0编辑  收藏  举报
编辑推荐:
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
欢迎阅读『TP6框架--EasyAdmin学习笔记:Excel表单导入数据库』
点击右上角即可分享
微信分享提示