【PHP】使用phpoffice/phpspreadsheet导入数据

phpexcel 已被废弃,建议我们用phpspreadsheet

由于PHPExcel已经被废弃在PHP7.2中已经无法获取更新,官方重新开了一个新包phpspreadsheet
注意:这里使用的是tp6框架做测试

第一步:使用composer在根项目下安装phpspreadsheet
安装命令:composer require phpoffice/phpspreadsheet
安装成功后,会在vendor目录下成一个目录:phpoffice
在这里插入图片描述第二步:后端代码处理
注意:**顶部引入第三方类库

引入:use \PhpOffice\PhpSpreadsheet\IOFactory;
在这里插入图片描述
代码处理*

 public function import()
    {
        header("content-type:text/html;charset=utf-8");
        if (request()->isPost()) {
            //上传excel文件
            $files = request()->file();
            //将文件保存到public/uploads目录下面
            try {
                validate(['image' => 'fileSize:1048576|fileExt:xls'])->check($files);
                $savename = [];
                foreach ($files as $file) {
                    $savename[] = \think\facade\Filesystem::disk('public')->putFile('uploads', $file, 'md5');
                }

            } catch (think\exception\ValidateException $e) {
                return json(['status' => '1', 'message' => $e->getMessage()]);
            }
            //获取文件路径
            $filePath = ROOT_PATH() . '/public/' . $savename[0];
            halt($filePath);
            $spreadsheet = IOFactory::load($filePath);
            $sheetData = $spreadsheet->getActiveSheet()->toArray(true, true, true, true, true);
            $row_num = count($sheetData);

            $now_time = time();
            $import_data = []; //数组形式获取表格数据
            //从第二行开始做for循环
            for ($i = 2; $i <= $row_num; $i++) {
                $bank_deal_no = $sheetData[$i]['A'];
                $account_name = $sheetData[$i]['B'];
                $bank_card = $sheetData[$i]['C'];
                $deal_money = $sheetData[$i]['D'];
                $deal_time = $sheetData[$i]['E'];

                if (!empty($bank_deal_no) && !empty($account_name) && !empty($bank_card) && !empty($deal_money) && !empty($deal_time)) {
                    $import_data[$i]['bank_deal_no'] = $bank_deal_no;
                    $import_data[$i]['account_name'] = $account_name;
                    $import_data[$i]['bank_card'] = $bank_card;
                    $import_data[$i]['deal_money'] = $deal_money;
                    $import_data[$i]['deal_time'] = $deal_time;
                    $import_data[$i]['create_time'] = $now_time;
                    $import_data[$i]['update_time'] = $now_time;
                }
            }

            sort($import_data);

            if (empty($import_data)) {
                return json(['status' => '1', 'message' => '数据解析失败']);
            }

            $total_num = count($import_data);
            if ($total_num > 100) {
                return json(['status' => '1', 'message' => '数据超出限制,最多100条']);
            }
            //以下代码根据你的需求处理,这里只做演示

            //校验是否重复:交易流水号
            $data_array = array_column($import_data, 'bank_deal_no');
            $data_ids = implode(',', $data_array);
            $result_data = Db::name('user_bank_bill')
                ->field('bank_deal_no')
                ->where('bank_deal_no', 'in', $data_ids)
                ->select()
                ->toArray();

            $error_message = '';
            if (!empty($result_data)) {
                $result_data_array = array_column($result_data, 'bank_deal_no');
                $result_data_ids = implode(',', $result_data_array);
                $error_message = '以下流水号有重复,已筛选出: ' . $result_data_ids;
                foreach ($import_data as $key => $value) {
                    if (in_array($value['bank_deal_no'], $result_data_array)) {
                        unset($import_data[$key]);
                    }
                }
            }


            if (!empty($import_data)) {
                //将数据保存到数据库
                $res = Db::name('user_bank_bill')->insertAll($import_data);
                if ($res) {
                    return json(['status' => '2', 'message' => '操作成功', 'result' => $error_message]);
                } else {
                    return json(['status' => '1', 'message' => '提交失败,请刷新重试']);
                }
            }

            return json(['status' => '2', 'message' => '数据错误', 'result' => $error_message]);
        } else {
            return json(['status' => '2', 'message' => '请求方式错误']);

        }


    }

到此导入数据就完成了,可根据实际需求优化代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值