使用SpringMVC+Layui操作excel的导入导出

news2024/11/6 1:00:50

导入导出所需的maven依赖

 <!-- EasyPOI核心依赖 基于Apache POI 所以需要下面那两个Apache POI依赖 -->
<!--  作用:Excel 导入导出和数据校验-->
    <dependency>
      <groupId>cn.afterturn</groupId>
      <artifactId>easypoi-base</artifactId>
      <version>4.1.0</version> <!-- 请替换为实际使用的最新版本号 -->
    </dependency>

    <!-- 如果EasyPOI没有自带Apache POI依赖,或者您需要特定版本的Apache POI,可以添加以下依赖 -->
    <!-- Apache POI依赖 -->
    <!-- 作用:读写excel文件,操作excel表格-->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>5.2.3</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>5.2.3</version>
    </dependency>
    
<!--通常与 Apache POI 一起使用来处理 Excel 文件中的 XML 结构-->
    <dependency>
      <groupId>org.apache.xmlbeans</groupId>
      <artifactId>xmlbeans</artifactId>
      <version>5.1.1</version>
    </dependency>
    
<!--输出输入流 操作excel时需要用到-->
<!--作用:处理 Excel 文件的读写操作,如复制文件、读取文件内容到内存中、将内存中的数据写入文件等-->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.11.0</version> <!-- 使用最新的稳定版本 -->
    </dependency>

一,导出excel表格
1.1,controller控制层
把获取的数据解析为User类实例,之后进行数据校验,校验不通过返回给前端,校验通过则把User实例添加到List集合中 之后操作数据库进行插入操作

  @PostMapping(value = "/uuApplyUserInfo")
    public ApiResult importMonitor( MultipartFile file) throws Exception {
//       判断文件不能为空
        if (file == null) {
            return new ApiResult(400,"文件不能为空",null);
        }
//       导入excel文件的参数配置类
        ImportParams params = new ImportParams();
        params.setNeedVerify(true);//是否开启校验
        params.setHeadRows(1); //头行忽略的行数

            final ExcelImportService excelImportService = new ExcelImportService();
//          excelImportResult包含了导入操作的结果  将获取的数据解析为User类实例 params为导入excel文件的参数配置
//           执行Excel文件的导入操作
            ExcelImportResult excelImportResult = excelImportService.importExcelByIs(file.getInputStream(), User.class, params, false);
            //校验成功数据
            List<User> list = excelImportResult.getList();
//          通过暴力反射获取校验失败的数据
            final Field failCollection = ExcelImportService.class.getDeclaredField("failCollection");
            failCollection.setAccessible(true);
            //校验失败数据
            List<User> failList = (List) failCollection.get(excelImportService);

        if (list.size() == 0 && failList.size() == 0) {
            return new ApiResult(500,"导入失败,上传文件数据不能为空",null);
        }
        if (failList.size() > 0){
            return new ApiResult(500,"导入失败,上传文件数据与模板不一致",null);
        }
        //如果没有错误,可以存入数据库
        if (list.size() >= 0 && CollectionUtils.isEmpty(list)== false) {
            //批量插入sql语句
            userManageService.insertList(list);
        }else{
            return new ApiResult(500,"导入失败,上传文件数据不能为空",null);
        }

   return new ApiResult(200,"导入成功",null);
    }

1.2,实体类
使用@Excel注解让实体类的字段跟excel的字段名保持一致进行映射
@Excel(name = “用户名”)

package com.lwt.maven.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Max;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;

    @Excel(name = "用户名")
    private String uname;
    @Excel(name = "卡号")
    @NotEmpty(message = "卡号不能为空")
    private String card_number;
    @Excel(name = "手机号码")
    @Length(max = 11,message = "手机号不能超过11位")
    private String phone;
    @Excel(name = "余额")
    @Max(value = 99999999,message = "金额不能超过999999999")
    private BigDecimal balance;

    private String acutorimg;

    private String regitstime;

    private Integer page;

    private Integer limit;

    private String endTime;

    private String startTime;


}

1.3,前端页面
使用Layui的组件进行文件上传

   <button type="button" class="layui-btn" id="test1">
          <i class="layui-icon">&#xe67c;</i>上传EXCEL
    </button>
     	//执行实例
        var uploadInst = upload.render({
            elem: '#test1',//绑定元素
            accept: 'file',
            url: 'http://localhost:8080/bank_maven_war_exploded/usermanage/uuApplyUserInfo', //上传接口
            // 选择文件后回调
            choose: function (obj) {
                console.log(obj);

            }
            , done: function (res) {
                //上传完毕回调
                layer.msg(res.message)

            }
            , error: function (res) {
                //请求异常回调
                layer.msg(res.message)
            }
        });

1.4,sql语句
将excel表格的数据获取到list之后循环打印获取值(separator:每次循环结束后拼接上去)

    <insert id="insertList">
        insert into user(`uname`,`card_number`,`phone`,`balance`) values
        <foreach collection="list" item="user" separator=",">
          (#{user.uname},#{user.card_number},#{user.phone},#{user.balance})
        </foreach>
    </insert>

二,Excel文件导出
1.1,controller控制层
创建了一个工作簿并生成了一个excel表格(Users),然后添加表头和表数据并设置列宽,之后把工作簿通过输出流输出给response.getOutputStream()(前端),需注意的是要设置响应头的响应类型为excel文件和响应的模式为下载excel表格

        @GetMapping("/exportList")
    public void exportList(HttpServletResponse response,User u) throws IOException {
             response.setCharacterEncoding("UTF-8");
//            设置响应的类型为excel文件
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//            设置浏览器的响应模式:为文件下载
            response.setHeader("Content-Disposition", "attachment; filename=users.xlsx");
        // 创建一个新的工作簿
        Workbook workbook = new XSSFWorkbook();

        // 创建一个新的工作表(Users)
        Sheet sheet = workbook.createSheet("Users");

        // 创建表头行 (在工作表sheet中添加第一行)
        Row headerRow = sheet.createRow(0);
//        表头行数据
        String[] columns = {"编号","用户名", "手机号码", "卡号","余额","头像地址","注册时间"};
        for (int i = 0; i < columns.length; i++) {
//            在第一行中创建单元格并赋值数据
            Cell cell = headerRow.createCell(i);
//            在单元格赋值
            cell.setCellValue(columns[i]);
        }

        // 获取数据库用户表数据
            List<User> users = userManageService.queryList(u);
        // 填充数据行
        int rowNum = 1;
        for (User user : users) {
//            有一个对象就创建一行并添加数据
            Row row = sheet.createRow(rowNum++);
//            在此行的第一个单元格中添加数据 以此类推...
            row.createCell(0).setCellValue(user.getId());
            row.createCell(1).setCellValue(user.getUname());
            row.createCell(2).setCellValue(user.getPhone());
            row.createCell(3).setCellValue(user.getCard_number());
            row.createCell(4).setCellValue((String.valueOf(user.getBalance())));
            row.createCell(5).setCellValue(user.getAcutorimg());
            row.createCell(6).setCellValue(user.getRegitstime());
        }

        // 设置列宽
        for (int i = 0; i < columns.length; i++) {
            sheet.autoSizeColumn(i);
        }
//            将excel表格流(输入流)写入到响应体中
            workbook.write(response.getOutputStream());


        // 关闭工作簿
        try {
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

1.2,sql语句
根据查询的结果而导入excel文件

    <select id="queryAll" resultType="com.lwt.maven.entity.User">
        select * from user where 1=1
        <include refid="query"></include>
    </select>

   <sql id="query">
        <if test="uname != null and uname != ''">
            AND uname like CONCAT('%', #{uname}, '%')
        </if>
        <if test="card_number != null and card_number != ''">
            AND card_number like CONCAT('%', #{card_number}, '%')
        </if>
        <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
            AND regitstime BETWEEN #{startTime} AND #{endTime}
        </if>
        <if test="phone != null and phone != ''">
            AND phone like CONCAT('%', #{phone}, '%')
        </if>
    </sql>

1.3,前端页面

 <button type="button" class="layui-btn" id="exprotList">导出excel</button>
$("#exprotList").on("click",function(){
     window.location.href="http://localhost:8080/bank_maven_war_exploded/usermanage/exportList?uname="+$("#input_name_one").val()+"&startTime="+startTime+"&endTime="+endTime+"&phone="+$("#input_name_two").val()+"&card_number="+$("#input_name_three").val()
})
       

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数列分块入门

本期是数列分块入门。其中的大部分题目来自hzwer在LOJ上提供的数列分块入门系列。 Blog:here (其实是对之前分块的 blog 的整理补充) sto hzwer orz %%% [转载] ---------------------------------------------------------------------------------…

基于SpringBoot+Gpt个人健康管家管理系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

苍穹外卖day-01

后端环境搭建 创建git仓库 提交代码 创建gitee远程仓库 开始连接远程仓库 运行sql文件&#xff0c;创建数据库。这里选取的可视化工具是navicat 编译一下项目 运行项目 登录的账号和密码在数据库中的emploee表中 退出前端界面登录后再重新登录&#xff0c;可以从后台清晰看到前…

【Docker故障处理】Ubuntu系统下tab键无法补全问题解决

【Docker故障处理】Ubuntu系统下tab键无法补全问题解决 一、环境介绍1.1 本地环境规划1.2 本次实践说明二、故障现象三、故障分析3.1 可能的原因3.2 排错思路四、故障处理4.1 安装bash-completion4.2 下载补全脚本4.3 配置永久生效五、测试tab键补全六、总结一、环境介绍 1.1 …

若依框架-添加测试类-最新

1、在【ruoyi-admin】的pom.xml下添加依赖 <!-- 单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId><scope>test</scope></dependency><dependency>…

CSS基础概念:什么是 CSS ? CSS 的组成

什么是 CSS&#xff1f; CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种用于控制网页外观的样式表语言。通过定义样式规则&#xff0c;CSS 可以指定 HTML 页面中各个元素的显示方式&#xff0c;包括颜色、布局、字体、间距等。 与 HTML 专注…

解密RFID技术提升应急消防管理效率的过程

一、部署RFID消防应急解决策略的具体步骤 &#xff08;1&#xff09;需求探讨与战略规划阶段 深入探究&#xff1a;全面、深刻地理解消防领域在资源分配、人员跟踪、应急救援等方面的实际需求。与消防机构紧密合作&#xff0c;共同确定RFID技术的应用提升和具体实施范围。 细…

国内短剧源码短剧系统搭建小程序部署H5、APP打造短剧平台

​在当今的互联网时代&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;受到了越来越多用户的喜爱。为了提供更好的用户体验和满足用户需求&#xff0c;一个好的短剧系统需要具备多元化的功能和优质的界面设计。 本文将介绍国内短剧源码短剧系统搭建小程序部署H5、APP所需的…

使用docker安装zlmediakit服务(zlm)

zlmediakit安装 zlmediakit安装需要依赖环境和系统配置&#xff0c;所以采用docker的方式来安装不容易出错。 docker pull拉取镜像(最新) docker pull zlmediakit/zlmediakit:master然后先运行起来 sudo docker run -d -p 1935:1935 -p 80:80 -p 8554:554 -p 10000:10000 -p …

qt QDragEnterEvent详解

1、概述 QDragEnterEvent是Qt框架中用于处理拖放进入事件的一个类。当用户将一个拖拽对象&#xff08;如文件、文本或其他数据&#xff09;拖动到支持拖放操作的窗口部件&#xff08;widget&#xff09;上时&#xff0c;系统会触发QDragEnterEvent事件。这个类允许开发者在拖拽…

HarmonyOS Next星河版笔记--界面开发(3)

属性 1.1.设计资源-svg图标 需求&#xff1a;界面中展示图标→可以使用的svg图标(任意放大缩小不失真、可以改变颜色) 使用方式&#xff1a; ①设计师提供&#xff1a;基于项目的图标&#xff0c;拷贝到项目目录使用 Image($r(app.media.ic_dianpu)) .width(40) fillColor…

查找连表的倒数第k个节点

居安思危 何解&#xff1f; 1、假如有1、2、3三个节点&#xff0c;找倒数第二个&#xff0c;实际是整数第几个&#xff1f; 3-21 2 &#xff1a; 及 length - k 1 ,所以先遍历找节点长度&#xff0c;在遍历找所需节点 // 今天这不是力扣的var findNode function(head , k){…

陪玩系统源码APP中的语音聊天直播房间有哪些功能?

陪玩系统源码APP通常采用Springboot、MybatisPlus和MySQL等后端技术栈来构建后端服务。这些技术提供了强大的数据处理能力和灵活的扩展性&#xff0c;能够满足高并发、低延迟的业务需求。 陪玩系统源码线上线下家政游戏陪玩前端开发框架如uniapp&#xff08;针对Web和小程序&am…

【python】OpenCV—findContours(4.3)

文章目录 1、功能描述2、代码实现3、完整代码4、结果展示5、涉及到的库函数5.1、cv2.Canny5.2 cv2.boxPoints 6、参考 1、功能描述 找出图片中的轮廓&#xff0c;拟合轮廓外接椭圆和外接矩阵 2、代码实现 导入必要的库&#xff0c;固定好随机种子 import cv2 as cv import …

介绍目标检测中mAP50和mAP50-95的区别

在目标检测任务中&#xff0c;mAP&#xff08;mean Average Precision&#xff09;是一个常用的性能评估指标&#xff0c;用于衡量模型在不同类别和不同IoU&#xff08;Intersection over Union&#xff09;阈值下的平均精度。mAP50和mAP50-95是mAP的两个特定版本&#xff0c;它…

三维测量与建模笔记 - 2.2 射影几何

教程中H矩阵写的有问题&#xff0c;上图中H矩阵应该是&#xff08;n1) x (m1) 共点不变性,下图中黄色方块标记的点&#xff0c;在射影变换前后&#xff0c;虽然直线的形状有所变化&#xff0c;但仍然相交于同一个点。 共线不变性&#xff0c;下图黄色标记的两个点&#xff0c;在…

【设计模式】策略模式定义及其实现代码示例

文章目录 一、策略模式1.1 策略模式的定义1.2 策略模式的参与者1.3 策略模式的优点1.4 策略模式的缺点1.5 策略模式的使用场景 二、策略模式简单实现2.1 案例描述2.2 实现代码 三、策略模式的代码优化3.1 优化思路3.2 抽象策略接口3.3 上下文3.4 具体策略实现类3.5 测试 参考资…

nuPlan最新SOTA,香港科技大学发布基于学习决策范围内的规划PlanScope

nuPlan最新SOTA&#xff0c;香港科技大学发布基于学习决策范围内的规划PlanScope Abstract 在自动驾驶的背景下&#xff0c;基于学习的方法在规划模块的开发中表现出了很大的潜力。在规划模块的训练过程中&#xff0c;直接最小化专家驾驶日志与规划输出之间的差异是一种广泛采…

String字符串 Random数字运算

Java API String 在使用String类进行字符串操作之前需要对String类进行初始化,在Java中可以通过以下两种方式对String类进行初始化 (1) 使用字符串常量 直接初始化一个String对象,具体代码如下 这是比较简化的写法 String a "abd"; (2) 使用String类的构造方法…

【Maven】——基础入门,插件安装、配置和简单使用,Maven如何设置国内源

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a; 一&#xff1a;Maven插件的安装 1&#xff1a;环境准备 2&#xff1a;创建项目 二…