tp6 实现excel 导入功能

在项目根目录安装

composer require phpoffice/phpspreadsheet

我们看一下郊果图,如下

点击导入excel表格数据

 出现弹窗选择文件,控制台打开输出文档内容

前端layui代码

<form id="uploadForm" class="form-horizontal"  enctype="multipart/form-data">
    <input type="file" name="file" class="file" multiple="multiple" required="">
    <button type="button" id="upload" class="btn btn-xs btn-purple">
      <span class="ace-icon fa fa-cloud-upload icon-on-right bigger-110"></span>上传文件
  </button>
</form>
layui.use(['form','layer'],function () {

    $("#input_excel_data").click(function () {
        // console.log('点击导入了');
        // layer.msg('点击导入了');
        layer.open({
            type: 1,
            area: ["500px", "360px"],
            title: "导入excel文件",
            content:$("#file_upload_div"),
        });



    });

    $("#upload_file").click(function () {
        //上传文档
        // var data = new  FormData;
        // data.append('file',my_file);
        // data.append('name',my_file.name);
        var formData = new FormData($('#uploadForm')[0]);
        $.ajax({
            'type':'post',
            'url':'user/input_excel_data',
            contentType:false,
            processData:false,
            'data':formData,
            success:function (data) {
                console.log(data);
                layer.msg('导入成功');
            }
        });

    })
});

整个laui页面文件如下

{extend name="public/layout"}
{block name="content"}
<div class="layui-col-md12">
    <div class="layui-card">
        <div class="layui-card-header">
          <!-- <button class="layui-btn" onclick="xadmin.open('添加用户组','{:admin_url('admin_user/add')}')">添加管理员</button> -->
            <form id="uploadForm" class="form-horizontal"  enctype="multipart/form-data">
                <div id="file_upload_div" style="display: none" class="text-center">
                <input type="file" name="file" class="file" multiple="multiple" required="">
<!--                <button type="button" id="upload_file" class="btn btn-xs btn-purple">-->
<!--                      <span class="ace-icon fa fa-cloud-upload icon-on-right bigger-110"></span>上传文件-->
<!--                      </button>-->
                    <button type="button"  class="layui-btn mt-2" id="upload_file">开始上传</button>
                </div>
            </form>

      </div>

        <div class="layui-card-header" style="height:auto">
            <form class="layui-form layui-col-space5" id="main-form" >


                <div class="layui-inline layui-show-xs-block">
                    {if isset($params['nickname']) && !empty($params['nickname'])}
                    <input type="text" name="nickname" placeholder="用户名" value="{$params['nickname']}" autocomplete="off"
                           class="layui-input">
                    {else /}
                    <input type="text" name="nickname" placeholder="用户名" value="" autocomplete="off"
                           class="layui-input">
                    {/if}
                </div>
                <div class="layui-inline layui-show-xs-block">
                    {if isset($params['phone'])}
                    <input type="text" name="phone" placeholder="手机号" value="{$params['phone']}" autocomplete="off"
                           class="layui-input">
                    {else/}
                    <input type="text" name="phone" placeholder="手机号" value="" autocomplete="off"
                           class="layui-input">
                    {/if}
                </div>

                <div class="layui-inline layui-show-xs-block">
                    <select name="enable">
                        <option value="">状态</option>
                        {if isset($params['enable'])}
                        <option value="1" {eq name="$params['enable']" value='1'}selected{/eq}>正常</option>
                        <option value="2" {eq name="$params['enable']" value='2'}selected{/eq}>禁用</option>
                        {else/}
                        <option value="1">正常</option>
                        <option value="2">禁用</option>
                        {/if}
                    </select>
                </div>

                <div class="layui-inline layui-show-xs-block">
                    <button class="layui-btn" lay-submit="" lay-filter="search"><i
                            class="layui-icon">&#xe615;</i></button>
                    <button class="layui-btn" type="button" lay-submit=""
                            onclick="location.href = location.pathname">重置
                    </button>
                    <button class="layui-btn" type="button" lay-submit="" onclick="location.reload()">刷新</button>
                    <button class="layui-btn" type="button" lay-submit="" id="input_excel_data">导入excel表格数据</button>
                </div>

            </form>
        </div>


        <div class="layui-card-body ">
            <table class="layui-table layui-form">
              <thead>
                <tr>
                  <!-- <th>
                    <input type="checkbox" name=""  lay-skin="primary">
                  </th> -->
                  <th>头像</th>
                  <th>手机号</th>
                  <th>昵称</th>
                  <th>性别</th>
                  <th>状态</th>
                  <th>创建时间</th>
                  <th>操作</th></tr>
              </thead>
              <tbody>
                {volist name="datalist" id="vo"}
                <tr>
                  <!-- <td>
                    <input type="checkbox" name=""  lay-skin="primary"> 
                  </td> -->
                  <td>
                      <img style="width: 50px;height: 50px" src="{$vo['avatar']}" alt="">
                  </td>
                  <td>{$vo['phone']}</td>
                  <td>{$vo['nickname']}</td>
                  <td>{$vo['sex']}</td>
                  <td>{$vo['enable']}</td>
                  <td>{$vo['create_time']}</td>
                  <td class="td-manage">
                      <button  onclick="xadmin.open(this.innerText,this.dataset.url)" data-url="{:admin_url('user/edit',['id'=>$vo['id']])}" type="button" class="layui-btn">编辑</button>
                      <button data-url="{:admin_url('user/del',['id'=>$vo['id']])}" type="button" class="layui-btn layui-btn-danger delete-btn">删除</button>
                  </td>
                </tr>
                {/volist}
              </tbody>
            </table>
        </div>
        <div class="layui-card-body ">
            {$datalist->render()|raw}
        </div>



    </div>
</div>



{/block}

{block name="foot"}
<script>
(function(){
      $('.layui-table').on('click','.delete-btn',function(){
        var obj = this;
        layer.confirm('确认要删除吗?',function(index){
              //发异步删除数据
              console.log(obj.dataset)
              
              var index = layer.load()
              $.ajax({
                'type':'post',
                'url':obj.dataset.url,
                success:function(data){
                  layer.close(index)
                  layer.alert(data.msg||'服务器出现错误',{icon:data.err_code === 200?6:5,end:function(){
                    if(data.err_code === 200){
                      $($(obj).parents('tr')[0]).remove();
                    }
                  }});
                }
              })
        });
      });
})();

//不添加这个,无法显示下拉列表
layui.use("form", function () {

})
layui.use(['form','layer'],function () {

    $("#input_excel_data").click(function () {
        // console.log('点击导入了');
        // layer.msg('点击导入了');
        layer.open({
            type: 1,
            area: ["500px", "360px"],
            title: "导入excel文件",
            content:$("#file_upload_div"),
        });



    });

    $("#upload_file").click(function () {
        //上传文档
        // var data = new  FormData;
        // data.append('file',my_file);
        // data.append('name',my_file.name);
        var formData = new FormData($('#uploadForm')[0]);
        $.ajax({
            'type':'post',
            'url':'user/input_excel_data',
            contentType:false,
            processData:false,
            'data':formData,
            success:function (data) {
                console.log(data);
                // layer.msg('导入成功');
                layer.alert(data.msg,{icon:data.err_code === 200?6:5,end:function(){
                        if(data.err_code === 200){
                            // 获得frame索引
                            var index = parent.layer.getFrameIndex(window.name);
                            //关闭当前frame
                            parent.layer.close(index);
                            parent.location.reload();
                        }
                    }});
            },
            error:function(){
                layer.close(index);
                layer.alert("服务器出现错误")
            }

        });

    })
});


</script>
{/block}

接下来我们看一看Tp6后台的代码 

这是控制器代码,需要在控制器中添加引入

use PhpOffice\PhpSpreadsheet\IOFactory;

   /**
     * 导入excel文档数据
     * @return \think\response\Json
     */
    function input_excel_data(){
        $file = request()->file('file');
        if (!$file) {
            print_r('请选择需要导入的文件');die;
        }

        // 加载文件
        $spreadsheet = IOFactory::load($file->getRealPath());
        $sheet = $spreadsheet->getActiveSheet();

        // 处理文件数据
        $data = [];
        foreach ($sheet->getRowIterator() as $row) {
            $rowIndex = $row->getRowIndex();
            // 不读取第一行 标题
            if ($rowIndex == 1) {
                continue;
            }
            $cellIterator = $row->getCellIterator();
            $row = [];
            foreach ($cellIterator as $cell) {
                $row[] = $cell->getValue();
            }
            $data[] = $row;
        }

        // 数据入库处理


        print_r($data);die;

        return success_json('导入数据');
    }

需要添加路由

//上传文档,导入excel文档数据
Route::post('productImport', 'ProductOrder/importExcel');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/45563.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

7.25 Qt

制作一个登陆界面 login.pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on …

如何高效地查询IP归属地

高效识别IP归属地是网络安全领域中的一项重要工作。准确地识别IP的归属地不仅可以帮助网络管理员追踪和定位潜在的网络攻击者&#xff0c;还可以用于网络流量分析、地理定位服务等方面。 以下将介绍几种高效识别IP归属地的方法。 使用IP归属地数据库 IP归属地数据库是一种存储…

Clion开发STM32之W5500系列(综合实验)

说明 此为w5500模块的综合实验测试模块,包含dhcp、dns、ntp以上三个模块的驱动参考之前的文章&#xff0c;本篇不做说明.使用的开发芯片 stm32f103vet6系列,外设接口使用的spi2 实验内容: 通过dhcp动态获取ip,通过dns解析NTP服务域名的ip通过NTP服务ip获取时间 w5500配置驱…

国密SSL优势及应用场景

国密SSL的优势主要有以下几点&#xff1a; 更高的安全性&#xff1a;国密算法采用的是国家密码管理局推荐的算法&#xff0c;相对于传统的SSL协议更加安全。 更好的性能&#xff1a;国密算法是国家密码管理局推荐的算法&#xff0c;其加密效率与密钥长度相比传统算法更高。 更…

微服务架构演变

微服务架构筑基 软件架构演进 软件架构的发展经历了从单体结构、垂直架构、SOA架构到微服务架构的过程. 什么是微服务&#xff1f;&#xff1f; Spring Cloud Netfilx Spring Cloud Alibaba service Mesh 架构的发展&#xff1a;基于某一种因素 技术是服务于业务的 业务又是…

Vue mixin 混入

可以复用的组件&#xff0c;我们一般会抽离&#xff0c;写成公共的模块。 可以复用的方法&#xff0c;我们一般会抽离&#xff0c;写成公共的函数。 那么 在 Vue 中&#xff0c;如果 某几个组件实例 VueComponent 中、或者 整个 Vue 项目中 都存在相同的配置&#xff0c;那就…

数据结构(二)

目录 Trie树 并查集 堆 Trie树 作用:用来高效地存储和查找字符串集合的数据结构 基本形式: 模板代码如下: #include<iostream> using namespace std;const int N 100010;//idx代表当前用到哪个下标 //既是根节点&#xff0c;又是空节点 //cnt存储的是以当前点结尾的…

Mac 系统钥匙串证书不受信任

Mac 系统钥匙串证书不受信任 解决办法 通过尝试安装 Apple PKI 的 Worldwide Developer Relations - G4 (Expiring 12/10/2030 00:00:00 UTC) 解决该异常问题 以上便是此次分享的全部内容&#xff0c;希望能对大家有所帮助!

移动端商品详情页设计

效果图 代码如下 页面设计 <div class"container"><!--商品详情 start--><van-image class"goods-item-image" :src"goods.goodsHeadImg"></van-image><div class"goods-price">&#xffe5;<span&…

【VUE】npm打包报错 Syntax Error: Error: Cannot find module ‘imagemin-gifsicle‘

一. Syntax Error: Error: Cannot find module ‘imagemin-gifsicle’ npm run build 报错&#xff0c;报错如下 原因 这个错误消息显示缺少了 imagemin-gifsicle 模块&#xff0c;而它是 image-webpack-loader 的依赖项&#xff0c;导致构建失败。解决 &#xff08;1&#xf…

安全—01day

文章目录 1. 编码1.1 ASCLL编码1.2 URL编码1.3 Unicode编码1.4 HTML编码1.5 Base64编码 2. form表单2.1 php接收form表单2.2 python接收form表单 1. 编码 1.1 ASCLL编码 ASCII 是基于拉丁字母的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他西欧语言。它是最通用的…

电容触摸屏(TP)的工艺结构

液晶显示屏(LCM),触摸屏(TP) “GG、GP、GF”这是结构分类&#xff0c;第一个字母表面材质&#xff08;又称为上层&#xff09;&#xff0c;第二个字母是触摸屏的材质&#xff08;又称为下层&#xff09;&#xff0c;两者贴合在一起。 G玻璃&#xff0c;FFILM&#xff0c;“”贴…

Stable Diffusion - 扩展 SegmentAnything 和 GroundingDINO 实例分割算法 插件的配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131918652 Paper and GitHub&#xff1a; Segment Anything: SAM - Segment Anything GitHub: https://github.com/facebookresearch/s…

蓝桥杯专题-真题版含答案-【牌型种数】【煤球数目】【寒假作业】【奖券数目】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

MySQL 数据库约束

目录 一、数据库约束 1、约束类型 二、NULL 约束 三、unique 约束 四、default 约束 五、primary key 约束 自增主键 六、foreign key 外键约束 七、check 约束 一、数据库约束 我们使用数据库来存储数据&#xff0c;一般是希望这里存储的数据是靠谱的&#xff0c;…

There has been an error.Error running C:\WINDOWS\System32\icacls

目前网上有两种有效的解决方案&#xff1a; windows用户名含中文的创建一个新用户&#xff0c;链接 安装其他版本的PostgreSQL(可优先考虑&#xff0c;我使用该方法解决的问题)&#xff0c;链接

java项目之人才公寓管理系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的人才公寓管理系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

【产品实习评审】对于高校跑腿的任务模型和价格模型设计比较到位

大家好&#xff0c;本篇文章分享【校招VIP】商业在线实习项目“跑个腿”第一期需求发布模块产品同学的脑图周最佳作品&#xff0c;该同学来自江苏师范大学社会学专业。 本项目亮点&#xff1a; 1 跑腿需求发布模块—构建项目数据模型&#xff0c;包括时效、常用地址和联系 2…

卤味行业数据分析报告

在一个炎热的夏日午后&#xff0c;热气蒸腾的城市街头弥漫着一股令人垂涎欲滴的香气。这股香气源自一家招牌醒目的卤味小吃摊位&#xff0c;摊主技巧娴熟地将各式美味的食材浸泡在独特的卤汁中。这里没有花哨的招牌&#xff0c;却吸引了无数食客的目光和嘴巴。 卤制食品在中国烹…