Spring Boot使用EasyExcel导入导出Excel

news2024/11/26 18:24:42

一、导入依赖

 <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>easyexcel</artifactId>
       <version>2.1.6</version>
   </dependency>

二、实现导出excel操作

1、对我们需要导出的实体类上加上注解,如下:

@ExcelProperty("商品编号")
private Integer gid;
@ExcelProperty("商品名称")
private String gname;
@ExcelProperty("商品价格")
private Float gprice;
@ExcelProperty("商品购买数量")
private Integer buynum;
@ExcelProperty("商品库存")
private Integer gnum;
//导出图片格式如下(照片路径一定是要真实路径,不然会报错)
//@ExcelProperty(value = {"商品图片"},converter = StringImageConverter.class)
//忽略导入
//@ExcelIgnore
@ExcelProperty("商品图片")
private String gpic;

2、编写的具类--帮助我们来实现下载excel

public class DownExcel {
    public static void download(HttpServletResponse response, Class t, List list) throws IOException, IllegalAccessException,InstantiationException {
        response.setContentType("application/vnd.ms-excel");// 设置文本内省
        response.setCharacterEncoding("utf-8");// 设置字符编码
        response.setHeader("Content-disposition", "attachment;filename=demo.xlsx"); // 设置响应头
        EasyExcel.write(response.getOutputStream(), t).sheet("模板").doWrite(list); //用io流来写入数据
    }
}

3、编写控制器

//导出为Excel
@RequestMapping("/downloadexcel.do")
public void getExcel(HttpServletResponse response) throws IllegalAccessException, IOException, 
InstantiationException {
    List<SysUser> list = sysUserService.getAll();
    DownExcel.download(response,SysUser.class,list);
}

4、直接访问接口或用postman(http://localhost:8080/userctrl/downloadexcel.do)下载excel,excel如图所示:

三、实现导入excel操作

1、在mybatis的mapper里面添加一个接口(保存集合,实现批量导入)

int saveAll(List<SysUser> sysUsers);

xml如图所示:

<insert id="saveAll" parameterType="java.util.List">
    insert into sys_user (name,nick_name,avatar,password,salt,email,mobile,status,dept_id,create_by,create_time,last_update_by,last_update_time)
    values
    <foreach collection="list" item="item" index="index" separator=",">
        (
            #{item.name},
            #{item.nickName},
            #{item.avatar},
            #{item.password},
            #{item.salt},
            #{item.email},
            #{item.mobile},
            #{item.status},
            #{item.deptId},
            #{item.createBy},
            #{item.createTime},
            #{item.lastUpdateBy},
            #{item.lastUpdateTime}
        )
    </foreach>
  </insert>

2、创建service和service实现类,如下:

void saveList(List<SysUser> list);
@Override
public void saveList(List<SysUser> list) {
    sysUserMapper.saveAll(list);
}

3、导入数据的时候需要对这个进行监听,所以也需要写一个工具类,来帮忙我们处理这些数据,代码如图:

// 有个很重要的点 ExcelListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class ExcelListener extends AnalysisEventListener<SysUser> {

    private List<SysUser> list = new ArrayList<>();
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;

    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private SysUserService sysUserService;

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     */
    public ExcelListener(SysUserService sysUserService) {
        this.sysUserService = sysUserService;
    }


    /**
     * 这个每一条数据解析都会来调用
     */
    @Override
    public void invoke(SysUser goods, AnalysisContext analysisContext) {
        System.out.println("解析到一条数据:========================"+goods.toString());
        // 数据存储到datas,供批量处理,或后续自己业务逻辑处理。
        list.add(goods);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if(list.size() >= BATCH_COUNT){
            saveData();
            // 存储完成清理datas
            list.clear();
        }

    }

    /**
     * 所有数据解析完成了 都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();//确保所有数据都能入库
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        System.out.println("=============================="+list.size()+"条数据,开始存储到数据库");
        sysUserService.saveList(list);
    }

}

4、控制器添加导入操作代码

//导入Excel
@RequestMapping("/importexcel.do")
@ResponseBody
public String importexcel(@RequestParam(value = "excelFile") MultipartFile file) throws IOException{
    EasyExcel.read(file.getInputStream(), SysUser.class, new ExcelListener(sysUserService)).sheet().doRead();
    return "success";
}

5、使用页面导入或者使用postman调用(http://localhost:8080/userctrl/importexcel.do)

    <h2>
        <form action="../userctrl/importexcel.do" method="post" enctype="multipart/form-data">
            导入Excel:<input type="file" name="excelFile" accept=".xls,.xlsx">
            <input type="submit" value="提交">
        </form>
    </h2>

6、提交后数据库数据增加,如图所示:

 资源下载:https://download.csdn.net/download/qq_37284798/87274449

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

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

相关文章

(二)字符函数和字符串函数详细讲解和模拟实现(优化)

✨✨✨✨✨✨✨✨✨&#x1f4d7;字符串查找函数&#xff1a;1.strstr函数2.strtok函数&#x1f4d4;错误信息报告函数&#xff1a;1.strerror函数&#x1f4d3;内存操作函数1.memcpy函数2.memmove函数3.memset函数4.memcmp函数❤️字符函数讲解&#x1f4d2;字符分类函数&…

Spring Cloud Alibaba整合Sentinel,使用nacos持久化流控规则

一、引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifac…

小程序开发有什么快捷、低成本的方法?

2022年1月17日&#xff0c;阿拉丁研究院在《2021 年度小程序互联网发展白皮书》中提到&#xff0c;微信小程序开发者突破 300 万&#xff0c;DAU 超过 4.5 亿&#xff0c;正成为人们生活的 “标配”。 作为用户&#xff0c;我们几乎时时刻刻都享受着互联网带来的便利&#xff…

JMeter5.5入门到实战:HTTP+TCP+响应断言+自定义拓展+返回值获取

前言 众所周知JMeter是业内公认的性能测试工具&#xff0c;功能十分强大且易于拓展&#xff0c;但是入门有一定门槛&#xff0c;需要明白一些基本概念。本文使用了HTTP取样器、TCP取样器、响应断言、JSON提取器等组件&#xff0c;对公司现存的登录流程进行了测试。公司的产品包…

Java中hashmap底层Hash冲突是什么?以及如何解决Hash冲突 【杭州多测师_王sir】【杭州多测师】...

一、hashMap的底层实现hashmap的底层结构在jdk1.7之前是数组链表&#xff0c;但是在jdk1.8以后&#xff0c;其变成了数组链表红黑树&#xff0c;这个操作会加快在链表时候的查询速度。当链表的长度大于8 的时候&#xff0c;链表就会变为红黑树&#xff0c;而当长度小于6的时候&…

培训机构的存在对 IT 行业产生了哪些影响

这个标题我一看&#xff0c;应该就会引发一波口水、键盘要遭罪啦。。。做为从业十余年&#xff0c;培训行业从事也已经快7年了。 在正厚软件从一开始到今天。从讲师到教学和团队的协作、校区运营&#xff0c;从行业小白到对整体机构的运营和团队&#xff0c;有些许经验谈下个人…

测试4年裸辞失业,面试17k的测试岗被按在地上摩擦,结局让我崩溃大哭....

作为IT行业的大热岗位——软件测试&#xff0c;只要你付出了&#xff0c;就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的&#xff0c;但放眼望去&#xff0c;哪个工作不是这样的呢&#xff1f;会有哪家公司愿意养一些闲人呢&#xff1f;…

FKM规范在非焊接构件中的静强度评估方法介绍(上篇)

导读&#xff1a;FKM &#xff08;《Analytical Strength Assessment of Components in Mechanical Engineering》&#xff09;规范是德国机械工程研究委员会根据机械产品在实际工程中的应用情况&#xff0c;统计出的针对由钢、铸铁及铝材料制成构件的静强度及疲劳强度的评估规…

C++模板(第二版)笔记之第六章:移动语义和 enable_if

文章目录一、完美转发&#xff08;Perfect Forwarding&#xff09;二、特殊成员函数模板&#xff1a;构造函数三、 通过 std::enable_if<>禁用模板四、 使用 enable_if<>1.不能通过使用 enable_if<>来禁用 copy/move 构造函数以及赋值构造函数五、使用 conce…

0124 双指针 Day13

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数在数组的前半部分&#xff0c;所有偶数在数组的后半部分。 示例&#xff1a; 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a…

net基于asp.net的计算机网络课程题库系统-计算机毕业设计

项目介绍 计算机网络课程题库系统是针对目前计算机网络课程试题的实际需求,从实际工作出发,对过去的计算机网络课程试题平台存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结…

操作系统_线程安全问题

文章目录1.线程安全问题举例2.为什么会有线程安全问题3.如何解决线程安全问题1.从原子性入手解决线程安全问题2.synchronized的使用方法3.java标准库中的线程安全类4.死锁问题举例2.死锁的必要条件1.线程安全问题举例 看代码: class Count {int i 0;public void add(){i;} }…

Sklearn机器学习与Plotly可视化强强联合

在学习sklearn(机器学习)过程中&#xff0c;模型原理可谓是枯燥无味&#xff0c;加上大多数模型训练过程也是不可见的&#xff0c;这使得很多小伙伴们望而却步&#xff0c;当然也有很多学者试图通过各种方式以可视化模型学习及预测过程&#xff0c;但大多数是复杂且不美观的。 …

Windows后台运行并启动Frpc客户端界面

Windows后台运行并启动Frpc客户端界面 frp搭建内网穿透可以看我另外一篇 1.frps服务端配置 [common] bind_port 3000 vhost_http_port 4000 vhost_https_port 5000authentication_method token authenticate_new_work_conns true token 5ae9394f-32d8-4a58-b6ed-e9f36…

【微服务技术05】Ribbon负载均衡

【微服务技术05】Ribbon负载均衡 案例代码&#xff1a;https://gitee.com/pikachu2333/spring-cloud-hexuan 之前配置好了eureka注册中心&#xff0c;使用RestTemplate调用地址为&#xff1a;http://eureka-user-service/user/1&#xff0c;配置了LoadBalanced负载均衡注解 但…

使用RTP包荷载AAC码流数据

目录 一. 前言 二. RTP协议介绍 三. AAC介绍 1. AAC格式 2. ADTS 四. RTP与AAC的结合 五. 代码实战 六. 效果展示 一. 前言 音视频通话中我们通常使用 RTP 协议包荷载音视频码率数据&#xff0c;例如麦克风采集输入数据后编码成帧&#xff0c;再将帧数据放入 RTP 协议包…

B站:以SLO为核心的可用性观测与质量运营

UGeek大咖说是优维科技为技术爱好者研讨云原生技术演进趋势而创办的系列活动&#xff0c;邀请一线互联网大厂的核心骨干主讲&#xff0c;分享原厂实践。本年度主题为可观测&#xff0c;我们希望通过一场场有趣、有料、有深度的活动&#xff0c;让运维圈的小伙伴聚集在一起&…

Java知识点--反射(上)

Java知识点--反射&#xff08;上&#xff09;&#x1f356;一、为什么需要反射1️⃣在特定情境中传统方法的不足2️⃣为了不修改原码引出反射&#x1f357;二、反射机制1️⃣Java反射机制2️⃣Java 反射机制原理示意图3️⃣Java 反射机制可以完成4️⃣反射相关的主要类5️⃣反射…

java计算机毕业设计ssm在线学习资源管理系统t4ko5(附源码、数据库)

java计算机毕业设计ssm在线学习资源管理系统t4ko5&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java丹徒高级中学校车预约9poqj

大四计算机专业的同学们即将面临大学4年的最后一次考验--毕业设计。通过完成毕业设计来对过去4年的大学学习生活做一个总结&#xff0c;也是检验我们学习成果的一种方式&#xff0c;毕业设计作品也是我们将来面试找工作的一个敲门砖。 选题前先看看自己掌握哪些技术点、擅长哪…