layui批量导入excel功能(由前端处理数据)

参考了很多网站,东拼西凑,最终完成了,最关键的就是excel.js这个文件的添加,需要放到layui文件夹的外面一层,不需要用script引用这个文件。

HTML部分

<div id="{id}" class="layui-form-item {selected}" data-id="{id}" data-tag="{tag}" data-index="{index}">
    <label class="layui-form-label" style="width: {labelWidth}px;display:{isLabel}">{label}:</label>
    <div class="layui-input-block" style="margin-left:0px;float: left;">
        <div class="layui-upload">
            <button type="button" class="layui-btn {_disabledClass}" id="uploadPgb" {disabled}>导入</button>
        </div>
    </div>
</div>

<script type="text/html" id="LAY-excel-export-ans">
    {{# layui.each(d.data, function(index, item){ }}
    <blockquote class="layui-elem-quote">{{d.files[index].name}}</blockquote>
    <div class="layui-tab layui-tab-brief" lay-filter="test_tab">
        <ul class="layui-tab-title">
            {{# var i=0; }}
            {{# layui.each(item, function(sheetname, content) { }}
            {{# if(i==0){ }}
            <li class="layui-this">{{=sheetname}}</li>
            {{# }else{ }}
            <li>{{=sheetname}}</li>
            {{# } }}
            {{# i++; }}
            {{# }); }}
        </ul>
        <div class="layui-tab-content">
            {{# var j=0; }}
            {{# layui.each(item, function(sheetname, content) { }}
            {{# if(j==0){ }}
            <div class="layui-tab-item layui-show">
                {{# }else{ }}
                <div class="layui-tab-item">
                    {{# } }}
                    {{# j++; }}
                    <table class="layui-table" lay-skin="row" lay-size="lg">
                        {{# layui.each(content, function(index, value) { }}
                        <tr>
                            {{# layui.each(value, function(key, val) { }}
                            <td>{{=val}}</td>
                            {{# });}}
                        </tr>
                        {{# });}}
                    </table>
                    <!-- <pre class="layui-code">{{JSON.stringify(content, null, 2)}}</pre> -->
                </div>
                {{# }); }}
            </div>
        </div>
        {{# }) }}
</script>

JS部分

layui.use(['jquery', 'layer', 'upload', 'excel', 'laytpl', 'element', 'code'], function () {

    var $ = layui.jquery;

    var layer = layui.layer;

    var upload = layui.upload;

    var excel = layui.excel;

    var laytpl = layui.laytpl;

    var element = layui.element;



    $(function () {

        $("#uploadPgb").click(function () {

            var htmlContent = '<div style="width:100%;height:100%;text-align: center;">'

            htmlContent += '<div class="layui-upload-drag" id="importData" >';

            htmlContent += '<input multiple="multiple" type="file" style="cursor:pointer;opacity: 0.0; position: absolute; top: 0; left: 0; bottom: 0; right: 0; width: 100%; height:100%;">';

            htmlContent += '<i class="layui-icon"></i>';

            htmlContent += '<p id="filename">点击选择文件,或将文件拖拽到此处,支持多文件导入</p>';

            htmlContent += '</div>';

            htmlContent += '<div ">';

            htmlContent += '<button id="downloadFiles" class="layui-btn" style="margin-top:10px;margin-bottom:10px;">下载模板</button>';

            htmlContent += '</div>';

            htmlContent += '</div>';

            layer.open({

                type: 1

                , offset: "auto"

                , id: 'layer_importData'

                , title: '导入'

                , area: '400px'

                , content: htmlContent    //需要打开的模板

                , btnAlign: 'c' //按钮居中

                , shade: 0 //不显示遮罩

                , success: function (layero, index) {

                    // 监听上传文件的事件

                    $('#importData').change(function (e) {

                        var files = e.target.files;

                        uploadExcel(files);

                    });



                    //下载模板



                }

            });

        })



    });



    function uploadExcel(files) {

        try {

            excel.importExcel(files, {

                // 读取数据的同时梳理数据

                fields: {

                    'collection_point': 'A'

                    , 'pass': 'B'

                    , 'jump_out': 'C'

                    , 'input': 'D'

                }

            }, function (data) {

                // 还可以再进行数据梳理

                /* data = excel.filterImportData(data, {

                    'collection_point': 'A'

                    , 'pass': 'B'

                    , 'jump_out': 'C'

                    , 'input': 'D'

                */

                console.log("data", data, "files", files);

                layer.open({

                    title: '文件转换结果',

                    area: ['60%', '90%'],

                    btn: ['导入', '关闭'],

                    content: laytpl($('#LAY-excel-export-ans').html()).render({ data: data, files: files }),

                    success: function (data) {

                    },

                    yes: function (index, layero) {

                        var sLayer = layer.load();

                        // 设置文件名

                        // var filenames = "";

                        // for(var i=0;i<files.length;i++){

                        //     if(i===0){

                        //         filenames += files[i].name;

                        //     }else{

                        //         filenames += ","+files[i].name;

                        //     }

                        // }

                        // $("#filename").text(filenames);

                        var flag=true;

                        //批量导入

                        for (var key in data) {

                            var import_data=data[key];

                            $.ajax({

                                url: sessionStorage.getItem('httpUrlPrefix') + '/algorithm/process/execute',

                                data:import_data,

                                headers: { "Content-Type": "application/json;charset=utf-8" },

                                async: false,

                                type: 'post',

                                success: function (result) {

                                    console.log("success", result);

                                },

                                error: function (result) {

                                    console.log("error", result);

                                    flag = false;

                                }

                            });

                        }

                        layer.close(index);

                        layer.close(index-1);

                        layer.close(sLayer);

                        if(flag){

                            layer.msg('导入成功!', { icon: 1 });

                        }else{

                            layer.msg('导入失败!', { icon: 2 });

                        }

                        

                    },

                    cancel: function (index, layero) {



                    }

                });

            });

        } catch (e) {

            layer.alert(e.message);

        }

    }

})

效果图

 

 

 

数据梳理这块我还没有搞懂原理,正在研究中,有问题欢迎指正。

好的,我可以为您提供一些相关的参考资料。 首先,您需要在前端页面中创建一个上传文件的表单,代码如下: ```html <form class="layui-form" action="" method="post" enctype="multipart/form-data"> <div class="layui-form-item"> <div class="layui-upload"> <button type="button" class="layui-btn layui-btn-normal" id="btnUpload">上传Excel文件</button> <input type="file" name="file" id="file" style="display:none"> </div> </div> </form> ``` 然后,在前端页面中引入Layui和jQuery库,并使用Layui的上传插件实现文件上传,代码如下: ```javascript layui.use(['upload'], function () { var upload = layui.upload; //执行实例 var uploadInst = upload.render({ elem: '#btnUpload' //绑定元素 , url: '/index.php/index/upload' //上传接口 , accept: 'file' , exts: 'xls|xlsx' , done: function (res) { if (res.code == 0) { layer.msg('上传成功'); //成功后重新加载数据 loadData(); } else { layer.msg('上传失败:' + res.msg); } } , error: function () { //请求异常回调 layer.msg('上传失败'); } }); }); ``` 接下来,在后端使用ThinkPHP框架解析Excel文件,并将数据批量插入数据库中,代码如下: ```php public function upload() { //获取上传文件 $file = request()->file('file'); if ($file) { //移动文件到服务器临时目录 $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads'); if ($info) { //解析Excel文件 vendor('phpoffice.phpexcel.Classes.PHPExcel'); $objPHPExcel = \PHPExcel_IOFactory::load($info->getPathname()); $sheet = $objPHPExcel->getSheet(0); $highestRow = $sheet->getHighestRow(); //获取总行数 $highestColumn = $sheet->getHighestColumn(); //获取总列数 //批量插入数据 $data = []; $time = time(); for ($i = 2; $i <= $highestRow; $i++) { $row = $sheet->rangeToArray('A' . $i . ':' . $highestColumn . $i, NULL, TRUE, FALSE); $data[] = [ 'username' => $row[0][0], 'email' => $row[0][1], 'create_time' => $time, ]; } Db::name('user')->insertAll($data); //返回JSON数据 return json([ 'code' => 0, 'msg' => '上传成功', ]); } else { //上传失败 return json([ 'code' => 1, 'msg' => $file->getError(), ]); } } else { //未选择文件 return json([ 'code' => 1, 'msg' => '请选择上传文件', ]); } } ``` 最后,在前端页面中使用jQuery的ajax请求上传文件,并刷新数据显示。代码如下: ```javascript //重新加载数据 function loadData() { $.ajax({ url: '/index.php/index/index', dataType: 'json', success: function (res) { var html = ''; layui.each(res.data, function (index, item) { html += '<tr>'; html += '<td>' + item.id + '</td>'; html += '<td>' + item.username + '</td>'; html += '<td>' + item.email + '</td>'; html += '</tr>'; }); $('#data').html(html); } }); } //上传文件 $('#btnUpload').click(function () { var formData = new FormData($('form')[0]); $.ajax({ url: '/index.php/index/upload', type: 'post', data: formData, cache: false, contentType: false, processData: false, dataType: 'json', success: function (res) { if (res.code == 0) { layer.msg('上传成功'); //成功后重新加载数据 loadData(); } else { layer.msg('上传失败:' + res.msg); } }, error: function () { //请求异常回调 layer.msg('上传失败'); } }); }); ``` 以上就是一个基于Layui和ThinkPHP的批量导入Excel文件的实现示例,希望能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值