TP6 上传excel并解析入库

10 篇文章 0 订阅
3 篇文章 0 订阅

tp6 接收excel文件,并解析成数组入库,多sheet读取,自动进行字符编码转换

客户端

这里用的是layui,这个与服务端的解析数据无关系的

<div class="layui-fluid">
    <div class="layui-row layui-col-space15"  id="app">
        <div class="layui-col-md12" v-cloak="">
            <div class="layui-card">
                <div class="layui-card-body">
                    <div class="layui-form-item">
                        <div class="layui-form-item parent-menu">                       
                            注意事项:<label for="" class="label-danger">数据无价,谨慎操作</label><br>
                            <ul>
                                <li>1、请严格遵守示例模板格式(97-2003 工作簿),即 .xls 扩展名。</li>
                                <li>2、请耐心等到后台处理结果,如果长时间未响应,请联系管理员进行排查。</li>
                                <li>3、数据表中严禁出现制表符、换行符等特殊符号。</li>
                                <li>4、导入程序具有一定的容错能力,但仍请规范数据。</li>
                                <li>5、继续上传,即表示您已充分了解其风险,并为其负责。</li>
                                <li>6、选择文件后,程序将自动上传至服务器,并进行解析。</li>
                            </ul>
                            <input class="layui-upload-file" type="file" accept="undefined" name="file">

                        </div>
                    </div>
                    <div class="layui-form-item">
                        <button type="button" class="layui-btn layui-btn-danger" id="seleceFile">
                            <i class="layui-icon"></i>选择文档
                        </button>
                        <a href="{__PUBLIC_PATH}uploads/routine/template/orders_template.xls" download="订单示例模板">
                        <button type="button" class="layui-btn layui-btn-normal">查看示例</button></a>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="{__ADMIN_PATH}js/layuiList.js"></script>
<script type="application/javascript">
    layui.use(['jquery', 'layer', 'upload'], function () {
        var $ = layui.jquery;
        var layer = layui.layer;
        var upload = layui.upload;
        //文件上传
        upload.render({
            elem: '#seleceFile'
            , url: 'import_upload'//上传接口
            , accept: 'file'
            , acceptMime: ""
            , auto: true
            , multiple: true
            , bindAction: '#importBtn'
            , data: { }
            , done: function (res) {
                //上传完毕回调
                if (res.code == 0) {
                    layer.msg(res.msg);
                    layer.closeAll();
                } else {
                    //其它异常code弹信息
                    layer.msg(res.msg);
                }
            }
            , error: function () {
                //请求异常回调
            },
            complete:function () {
                //结束的回调
            }
        })
    });
</script>

服务端

    /** 提交位置 */
    public function import_upload()
    {
        $fileArr = request()->file('file'); //接收文件
        $file = $_FILES['file']; //得到传输的数据
        $type = $file["type"]; //获得图片的类型
// $rdate = date("Ymd", time()); //获得时间
        /**
         * 判断接收文件是否为空
         */
        if ($fileArr == null) {
            return $this->failed('不被允许的请求');
        }
        /**
         * 截取上传文件名后缀
         * 将文件名以.分割为数组
         * 用PHP end函数取数组最后一个
         * 即可得到上传文件后缀 $temp = explode(".", $_FILES["file"]["name"]);
         * 判断上传文件是否合法
         * 判断截取上传文件名是否为
         */
        $temp = explode(".", $file["name"]);
        $extension = end($temp);
        /* 这里限定版本 */
        if (in_array($extension, array("xlsx"))) {
            return $this->failed('不被允许的版本');
        }
        /* 这里限定文档 */
        if (!in_array($extension, array("xls"))) {
            return $this->failed('不被允许的文档');
        }
        /**
         * 调用disk方法
         * 此时根目录为/public/storage 系统默认路径
         * 再把文件移动至uploads下的img文件夹里
         * 文件名用data
         */
        $saveName = \think\facade\Filesystem::disk('public')->putFile("document", $fileArr, 'data');
        //$data["name"] = $file["name"];
        $result = self::analysisExcel(str_replace(['\\'], '/', $saveName));//这里返回的是多维数组
        $result = self::analysisData($result);
        return $result ? (Json::successful('导入成功!')) : (Json::failed('导入失败!'));
    }

    public function analysisExcel($path)
    {
        $datas = [];
        $colus = ['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'];
        //存储的位置
        $file = public_path() . '/public/uploads/' . $path;    
        $objPHPExcel = \PHPExcel_IOFactory::load($file);
        //获取表名,一维数组,值是表名。如:array('sheet1', 'sheet2', 'sheet3')
        $nameArr = $objPHPExcel->getsheetnames();                
        //获取表的数量
        $sheetCount = $objPHPExcel->getSheetCount();
        //循环读取每一张表
        for ($index = 0; $index < $sheetCount; $index++) {
            //设置当前要读取的表
            $objPHPExcel->setActiveSheetIndex($index);
            $sheet = $objPHPExcel->getSheet($index);        //excel中的第一张sheet
            $highestRow = $sheet->getHighestRow();        // 取得总行数
            $highestColumn = $sheet->getHighestColumn();   // 取得总列数
            $lastColumn = array_search($highestColumn, $colus);   // 取得总列数
            $data = [];
            //这里的$i 决定从哪一行开始读取,我这里是从第二行开始,即索引为1
            for ($i = 1; $i < $highestRow; $i++) {
                $row = [];
                for ($c = 0; $c <= $lastColumn; $c++) {
                    //读取单元格数据,暂存到表中//暂存需要保存到数据库中的数据
                    $row[] = mb_convert_encoding(str_replace('-','/',$objPHPExcel->getActiveSheet()->getCell($colus[$c] . ($i+1))->getValue()),'UTF-8');//这里进行了转编码操作
                }
                $data[] = $row;
            }
            $datas[] = $data;
        }
        //getCell的参数示例,读取A1单元格的内容
        // echo $objPHPExcel->getActiveSheet()->getCell('A1')->getValue();
        return json_decode(json_encode($datas),true);//可以直接用下一行代码替代
        //return $datas;
    }

    public function analysisData($data){
        //$data 表格中的全部sheet数据,$sheet一个sheet的数据集
        foreach ($data as $sheet){
            //$sheet表格中的一个sheet,$row一行数据
            foreach ($sheet as $row){
                file_put_contents('log.log',json_encode($row)."\n",8);//输出到文档查看
                //这里做你想要做的事情,这里拿到的是sheet的二维数组之中的一行数据
            }
        }
        return bool;//依据你的业务
    }

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值