史上最全EasyExcel

一、EasyExcel介绍

1、数据导入:减轻录入工作量

2、数据导出:统计信息归档

3、数据传输:异构系统之间数据传输

二、EasyExcel特点

  • Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
  • EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
  • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

文档地址:https://alibaba-easyexcel.github.io/index.html

github地址:https://github.com/alibaba/easyexcel

三,具体的读写操作

1.准备工作

导入依赖

 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency>

创建与表格对应的实体类


@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {@ExcelProperty(value = "学生id")private Integer id;@ExcelProperty(value = "学生姓名")private String name;@ExcelProperty(value = "学生年龄")private Integer age;
}

2.写操作


public class WriteExcel {public static void main(String[] args) {//准备文件路径String fileName="D:/destory/test/easyexcel.xls";//写出文件EasyExcel.write(fileName, Student.class).sheet("easyexcel").doWrite(data());}private static List<Student> data(){ArrayList<Student> list = new ArrayList<>();for (int i = 0; i < 10; i++) {Student student = new Student(i, "董德" + 1, 22 + i);list.add(student);}return  list;}
}

3.读操作

3.1改造实体类

给实体的每一个属性加上索引,对应xls表里面的具体列


@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {@ExcelProperty(value = "学生id",index = 0)private Integer id;@ExcelProperty(value = "学生姓名",index = 1)private String name;@ExcelProperty(value = "学生年龄",index = 2)private Integer age;
}

3.2创建监听器


public class EasyExcelLinster extends AnalysisEventListener<Student> {List<Student> list=  new ArrayList<Student>();//一行一行的去读取里面的数据@Overridepublic void invoke(Student student, AnalysisContext analysisContext) {System.out.println(student);list.add(student);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}

3.3读取


public class ReadExcel {public static void main(String[] args) {//准备文件路径String fileName="D:/destory/test/easyexcel.xls";EasyExcel.read(fileName, Student.class, new ExcelListener()).sheet().doRead();}
}

四,实现导出/导入

文件的导入导出也就意味着是文件的下载和批量上传功能,

4.1导出具体实现

导出:需要将数据库里面的文件以附件的形式下载到本地电脑,需要参数为respoonse对象,返回值类型为void

4.1.1后端

controller相关操作,将逻辑交由service去做

@ApiOperation("导出")@GetMapping("/exportData")public void exportData(HttpServletResponse response){dictService.exportData(response);}

service

 @Overridepublic void exportData(HttpServletResponse response) {try {//设置相关参数response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("数据字典", "UTF-8");response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");//获取文件List<Dict> list = this.baseMapper.selectList(null);//转换文件ArrayList<DictEeVo> dictEeVos = new ArrayList<>();for (Dict dict : list) {DictEeVo dictEeVo = new DictEeVo();//转换BeanUtils.copyProperties(dict, dictEeVo);//添加dictEeVos.add(dictEeVo);}//写出EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("数据字典").doWrite(dictEeVos);} catch (Exception e) {e.printStackTrace();}}

4.1.2前端

window.open("http://localhost:8202/admin/cmn/dict/exportData")

里面写实际的url地址

前端的操作,非常简单,只需要我们添加单击按钮以及在事件里面操作即可

<div class="el-toolbar"><div class="el-toolbar-body" style="justify-content: flex-start;"><el-button type="text" @click="exportData"><i class="fa fa-plus"/> 导出</el-button></div>
</div>
exportData() {window.open("http://localhost:8202/admin/cmn/dict/exportData")
},

4.2导入具体实现

导入:需要将本地文件插入到数据库,参数:multiparefile,返回值:"成功or失败"

4.2.1后端

使用excel进行导入需要监听器的配合,使用监听器对读取的文件进行操作

监听器:用来读取文件,并将数据插入数据库


@Component
public class DictHandler extends AnalysisEventListener<DictEeVo> {@Autowiredprivate  DictMapper dictMapper;//一行一行的读取excel里面的内容@Overridepublic void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {//转换对象Dict dict = new Dict();BeanUtils.copyProperties(dictEeVo,dict);//设置默认逻辑删除值dict.setIsDeleted(0);//写入数据库dictMapper.insert(dict);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}

controller读取文件

@ApiOperation("导入")@PostMapping("/importData")public R importData(MultipartFile file){//读取文件try {EasyExcel.read(file.getInputStream(), DictEeVo.class, dictHandler).sheet().doRead();return  R.ok().message("导入成功");} catch (IOException e) {e.printStackTrace();return  R.error().message("导入失败");}}

结合swanger测试发现文件可以成功导入到数据库,开始前端的开发

4.2.2前端

加入按钮以及上传的弹框

 <div class="app-container"><!-- 上传与下载的按钮 --><div class="el-toolbar"><div class="el-toolbar-body" style="justify-content: flex-start;"><el-button type="text" @click="exportData"><i class="fa fa-plus"/> 导出</el-button><el-button type="text" @click="importData"><i class="fa fa-plus"/> 导入</el-button></div>
<!-- 上传文件的弹框 -->
<el-dialog title="导入" :visible.sync="dialogImportVisible" width="480px"><el-form label-position="right" label-width="170px"><el-form-item label="文件"><el-upload:multiple="false":on-success="onUploadSuccess":action="base_url"class="upload-demo"><el-button size="small" type="primary">点击上传</el-button><div slot="tip" class="el-upload__tip">只能上传xls文件,且不超过500kb</div></el-upload></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="dialogImportVisible = false">取消</el-button></div>
</el-dialog>

点击上传按钮事件以及上传成功事件

//导入文件importData(){this.dialogImportVisible=true},onUploadSuccess(response, file, fileList){//debuggerif(response.success){//成功this.$message.success(response.message);//弹框消失this.dialogImportVisible=false//刷新列表this.getAllDict(1)}

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

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

相关文章

以后要做GIS开发的话是学GIS专业还是学计算机专业好一些?

GIS开发其实严格来说分为前后端以及底层开发。不同的方向&#xff0c;代表了不同的开发语言。 所以大家首先要了解自己具体要做的岗位类型是什么&#xff0c;其次才是选择专业侧重点。 但是严格来说&#xff0c;选择某个专业&#xff0c;到就业方向这个过程&#xff0c;并不是…

el-table样式错乱解决方案

bug&#xff1a; 图片的椭圆框住的地方&#xff0c;在页面放大缩小之后就对不齐了。 原因&#xff1a; 主要原因是当你对页面放大缩小的时候&#xff0c;页面进行了重构&#xff0c;页面的宽高及样式进行了变化&#xff0c;但是在这个更新的过程中&#xff0c;table的反应并没…

Redis: Redis介绍

文章目录 一、redis介绍二、通用的命令三、数据结构1、字符串类型&#xff08;String&#xff09;&#xff08;1&#xff09;介绍&#xff08;2&#xff09;常用命令&#xff08;3&#xff09;数据结构 2、列表&#xff08;List&#xff09;&#xff08;1&#xff09;介绍&…

python实操之网络爬虫介绍

一、什么是网络爬虫 网络爬虫&#xff0c;也可以叫做网络数据采集更容易理解。它是指通过编程向网络服务器&#xff08;web&#xff09;请求数据&#xff08;HTML表单&#xff09;&#xff0c;然后解析HTML&#xff0c;提取出自己想要的数据。 它包括了根据url获取HTML数据、解…

R.swift SwiftGen 资源使用指南

R.swift 和 SwiftGen 资源转换使用指南 R.swift &#xff08;原始代码会打包到项目&#xff1f;&#xff09; Pod platform :ios, 12.0 target LBtest do# Comment the next line if you dont want to use dynamic frameworksuse_frameworks!pod R.swift # pod SwiftGen, ~&g…

(二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真

一、创建工作空间 mkdir catkin_ws cd catkin_ws mkdir src cd src 二、下载wpr_simulation源码 git clone https://github.com/6-robot/wpr_simulation.git 三、编译 ~/catkin_make 目录下catkin_makesource devel/setup.bash 四、运行 roslaunch wpr_simulation wpb_s…

java小项目:简单的收入明细记事本,超级简单(不涉及数据库,通过字符串来记录)

一、效果 二、代码 2.1 Acount类 package com.demo1;public class Acount {public static void main(String[] args) {String details "收支\t账户金额\t收支金额\t说 明\n"; //通过字符串来记录收入明细int balance 10000;boolean loopFlag true;//控制循…

2023.1.19 关于 Redis 事务详解

目录 Redis 事务对比 MySQL 事务 MySQL 事务 Redis 事务 Redis 事务原子性解释 Redis 事务详解 执行流程 典型使用场景 Redis 事务命令 WATCH 的使用 WATCH 实现原理 总结 阅读下文之前建议点击下方链接了解 MySQL 事务详解 MySQL 事务详解 Redis 事务对比 MySQL 事…

[陇剑杯 2021]jwt

[陇剑杯 2021]jwt 题目做法及思路解析&#xff08;个人分享&#xff09; 问一&#xff1a;昨天&#xff0c;单位流量系统捕获了黑客攻击流量&#xff0c;请您分析流量后进行回答&#xff1a; 该网站使用了______认证方式。&#xff08;如有字母请全部使用小写&#xff09…

C++ 设计模式之备忘录模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是备忘录模式 &#xff08;第17种模式&#xff09; 备忘录模式&#xff08;Meme…

【C语言】- 设置控制台标题、编码、文字颜色、大小和字体

【C语言】- 设置控制台标题、编码、文字颜色、大小和字体 文章目录 【C语言】- 设置控制台标题、编码、文字颜色、大小和字体1 - 设置控制台标题2 - 设置控制台编码3 - 设置控制台字体和大小参考链接 1 - 设置控制台标题 因为要用到 Windows API&#xff0c;所以需要包含头文件…

UI组件在线预览,程序员直呼“不要太方便~”

一、介绍 以往大家如果想查看组件的使用效果&#xff0c;需要打开DevEco Studio构建工程。现在为了便于大家高效开发&#xff0c;文档上线了JS UI组件在线预览功能&#xff0c;无需本地构建工程&#xff0c;在线即可修改组件样式等参数、一键预览编译效果。程序员直呼&#xff…

可视化k8s页面(Kubepi)

Kubepi是一个简单高效的k8s集群图形化管理工具&#xff0c;方便日常管理K8S集群&#xff0c;高效快速的查询日志定位问题的工具 随便在哪个节点部署&#xff0c;我这里在主节点部署 docker pull kubeoperator/kubepi-server docker run --privileged -itd --restartunless-st…

RabbitMQ-生产者可靠性

一、生产者重连 1、概念 由于网络波动导致客户端无法连接上MQ&#xff0c;这是可以开启MQ的失败后重连机制。 注意&#xff1a; 是连接失败的重试&#xff0c;而不是消息发送失败后的重试。 2、开启配置 spring:rabbitmq:template:retry:enabled: true # 是否启用重试机制ma…

【RabbitMQ】RabbitMQ安装与使用详解以及Spring集成

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《RabbitMQ实战》。&#x1f3af;&#x1f3af; &am…

java实现红黑树

红黑树 红黑树是一种自平衡二叉查找树&#xff0c;其中每个节点都有一个颜色属性&#xff0c;颜色为红色或黑色。它的特性保证了树在插入和删除操作后仍然保持大致的平衡&#xff0c;使得查找操作能够在对数时间内完成。以下是红黑树的一些基本性质&#xff1a; 每个节点是红…

面试题16.15.珠玑妙算

前言 这两天突然发现力扣上还是有我能写出来的题的&#xff0c;虽说都是简单级别的&#xff08;以及一道中等的题&#xff09;&#xff0c;但是能写出来力扣真的太开心了&#xff0c;&#xff08;大佬把我这段话当个玩笑就行了&#xff09;&#xff0c;于是乎&#xff0c;我觉…

C#,入门教程(21)——命名空间(namespace)与程序结构的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(20)——列表&#xff08;List&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124094382 编写软件&#xff08;大软件称为系统&#xff09;与盖大楼一个道理。 假设咱们现在需要盖一座名为“天梯大厦”的…

kubernetes工作负载-DamonSet

一、DemonSet的介绍 1、什么是DemonSet DaemonSet 控制器是用来保证在所有节点上运行一个 Pod 的副本当有节点加入集群时&#xff0c; 也会为他们新增一个 Pod。 当有节点从集群移除时&#xff0c;这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 简而言之…

进入docker容器,vi: command not found

问题描述&#xff1a; 进入docker容器&#xff0c;查看文件执行vim 命令&#xff0c;报错 vim: command not found。搜索解决方案&#xff0c;说执行一下 apt-get install vim命令&#xff0c;然后又报错 Unable to locate package vim。 解决&#xff1a; 1.执行 npt-get up…