EasyExcel初了解

官网: https://easyexcel.opensource.alibaba.com/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M9DR8uSj-1658993899816)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1658917061315.png)]

什么是EasyExcel

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

EasyExcel的作用

简单来说就是既实现把excel的中的数据批量添加(写)到数据库中,也实现了把数据库中的数据导入(读)到excel中

EasyExcel的应用场景

我们通常可以看到很多应用程序有导出功能就是把查询到的数据导出成Excel文件,方便转发查看,同时有时候需要把Excel中的数据通过页面展示出来,就要添加到数据库,便于查询,在页面动态展示出来给用户.这就是EasyExcel这门技术的应用场景

EasyExcel的快速入门

写功能的实现

第一步: 创建一个maven项目导入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.0-beta2</version>
</dependency>
<!--        环境依赖 给实体类使用--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency>

第二步:创建一个实体类

注意: 实体类中的属性和excel中的表头的字段类型要保持一致,并且实体类中还要包含我们要添加到数据库中的一些需要设置的属性.

@Data    //lombok依赖的应用,省略一些需要重新或者生成的方法
public class DemoData {@ExcelProperty("字符串标题") //表头的名称private String string;@ExcelProperty("日期标题")  private Date date;@ExcelProperty("数字标题")private Double doubleDate;@ExcelIgnore  //不包含在excel中的字段,读出数据后封装额外字段private String igore;   // 之后保存在数据中
}

第三步: 创建一个测试类 , 在测试类中编写一个获得数据集合的方法,模拟从数据库中读出的数据

public class EasyDemo {//生成存放数据的方法 这个方法中定义好表中存放的数据
private List<DemoData> data() {//建立集合存放表中的字段List<DemoData> list = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleDate(0.56);list.add(data);}return list;
}
}

第四步: 在测试类中,编写写数据的代码,其实就一行代码

String  path = "E:\\study\\projection\\easyExcel\\esayexcel_demo";@Testpublic void writeSimple() {String fileName = path + "EasyTest.xlsx";/*** write()方法需要的 第一个参数是指定文件写出的路径.* 第二个参数就是定义的实体类的class文件,也就是要生成的excel的格式* sheet() 方法可以加参数,也可以不加,不加的话是默认的名字0,加的话使用参数的名字* doWrite()方法 参数是往表中添加的数据,参数也可以是lambda表达式,返回值为要添加的数据*/EasyExcel.write(fileName,DemoData.class).sheet("模板").doWrite(data());}

至此,写功能就完成了.可以执行代码,进行测试.

读功能的实现

读的话涉及到监听器,这个监听器类是读功能的核心,其中invoke方法又是监听器的核心

为了防止一下看见一大堆的代码,我第一步只是实现了把excel中的数据打印在控制台.以实现逐步理解

public class DemoDataListener extends AnalysisEventListener<DemoData> {private List<DemoData> list = new ArrayList<DemoData>();//DemoData 使用的格式// AnalysisContext 解析器,解析上下文的@Overridepublic void invoke(DemoData data, AnalysisContext context) {System.out.println("输出:" + JSON.toJSONString(data));list.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库}

然后在测试类中添加方法

@Test
public void read() {String fileName = path + "EasyTest.xlsx";// 加上继承了AnalysisEventListener类的监听器DemoDataListener excelListener = new DemoDataListener();EasyExcel.read(fileName,DemoData.class, excelListener).sheet().doRead();
}

这里已经是小小完成了把excel数据在控制台的打印了,后边就是更进一步的扩展了,有前边的小步骤,理解可能就不那么困难了

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去public class DemoDataListener implements ReadListener<DemoData> {/*** 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收*/
private static final int BATCH_COUNT = 100;
/*** 缓存的数据*/
private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
/*** 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。*/
private DemoDAO demoDAO;public DemoDataListener() {// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数demoDAO = new DemoDAO();
}/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来 就是Spring管理的我们创建的那个实体类** @param demoDAO*/
public DemoDataListener(DemoDAO demoDAO) {this.demoDAO = demoDAO;
}
/*** 这个每一条数据解析都会来调用** @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/
@Override
public void invoke(DemoData data, AnalysisContext context) {//注意这里的data就是每次解析出来的一行数据,封装在我们创建的实体类中cachedDataList.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (cachedDataList.size() >= BATCH_COUNT) {//使用方法把数据读到数据库中saveData(); //这里方法一般都写在service层中.完成数据的添加// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}
}/*** 所有数据解析完成了 都会来调用** @param context*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();log.info("所有数据解析完成!");
}/*** 加上存储数据库  这个方法一般是写在业务层中的*/
private void saveData() {log.info("{}条数据,开始存储数据库!", cachedDataList.size());demoDAO.save(cachedDataList);log.info("存储数据库成功!");
}
}

更多的扩展可以去官网进一步了解: https://easyexcel.opensource.alibaba.com/

初学总结.纯粹学习用,如果有不对的希望,可以有人及时指正 .>>>Thanks♪(・ω・)ノ>>>>

EasyExcel初了解相关推荐

  1. EasyExcel 实践与源码梳理

    目录 1. 写在最前 1.1 EasyExcel版本 1.2 初探源码 2. 表头实体类 MyUser 3. 最简单的导出Excel文件 4. 源码demo: 4.1 读Excel 1. 最简单的读 ...

  2. EasyExcel生成带下拉列表或二级级联列表的Excel模版+自定义校验导入数据(附仓库)

    EasyExcel生成带下拉列表或二级级联列表的Excel模版+自定义校验导入数据(附仓库) 目录 EasyExcel生成带下拉列表或二级级联列表的Excel模版+自定义校验导入数据(附仓库) 仓库 ...

  3. 枚举中文转数字并easyexcel导入(读取Read)数据至数据库,用监听器解决导入关联多表的问题

    以下内容皆为本人学习过程中的所学的知识,全根据自己所学思路来写的. 大致流程如下: 一.创建实体类,注意有一个是导入的模板实体模型类(CustomManageAndCustomerInformatio ...

  4. python教学反思_Python第3课if教学反思:准备充分承上启下,优化内容模式初显

    5月6日,大陈完成了和初中生一起学Python第3课的5个班教学,本节课教学设计请见我之前发布的:初中生学Python第3课,学习条件控制if语句,这样设计靠谱吗? 本节课在设计之初就吸取了第2课教学 ...

  5. easyexcel生成excel_阿里JAVA解析Excel工具easyexcel

    java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...

  6. easyexcel怎么设置表头宽度_easyexcel 自动设置列宽

    com.alibaba easyexcel 2.1.4 导出controller层代码 @RequestMapping("/download") public void downl ...

  7. 苹果电脑安装python3密码_mac系统安装Python3初体验

    前沿 对于iOS开发不要随便拆卸系统自带的Python,因为有很多 library 还是使用 Python2.7. 1 安装Xcode 1.1 App Store 搜索Xcode 并安装 1.2 安装 ...

  8. MapReduce编程初体验

    需求:在给定的文本文件中统计输出每一个单词出现的总次数 第一步: 准备一个aaa.txt文本文档 第二步: 在文本文档中随便写入一些测试数据,这里我写入的是 hello,world,hadoop he ...

  9. 《父亲家书》选:给初为人师的儿子

    文飞:    离家已二十九天了,可能是年纪大了的缘故,不要说你妈妈,就连我也想念你了!为不影响你工作,我坚持不够一个月"决"不给你去信.这不到期了,就按时给你去信.    你上次来 ...

最新文章

  1. 简单介绍python3判断IP地址的方法
  2. spring框架学习(三)
  3. 关于Window的快捷方式,图标缓存的清理
  4. 易语言利用服务器更新,易语言使用FTP服务器更新软件案例
  5. Spring使用AspectJ开发AOP
  6. 精品 IDEA 插件大汇总!值得收藏
  7. 代替httpclient JAVA_除了HttpClient,Java还有什么类似HttpClient的技术
  8. 【论文写作】精品课程教学网站中用户管理如何写
  9. mysql数据库表字段使用DESC等关键字报错及解决方法
  10. 语言 泰克示波器程序_示波器再升级,EMI测试不求人
  11. 时间序列经济python_(13)Python初入坑之时间序列基础内容
  12. [Python3]利用tkinter为数独计算器编写GUI
  13. 凭据管理器解决Incorrect username or password ( access token )
  14. 如何提取matlab中某一行一列的数据
  15. 原来微信“对方正在输入”在这种情况下才显示
  16. ps cc下载地址及破解教程
  17. oracle 如何查看监听,[转载]查看oracle监听器的状态及打开监听器服务
  18. 【C语言零基础全套课件】
  19. 分层和分段用什么符号_分段符号该怎么用
  20. 30题前端工程开发师面试题

热门文章

  1. 高潮再次来袭:马云,东哥两位电商大佬,强行助攻 996
  2. JS实现刷新_重新加载页面
  3. win10重置进度条不动了_Windows10系统重置时卡死的处理方法
  4. maximal-rectangle
  5. 实验室家具系列之通风柜
  6. 【电脑办公软件】万彩办公大师教程丨TextDiff文本比较工具
  7. Ubuntu完全教程,让你成为Ubuntu高手!
  8. 读书:找到锚点,然后把自己给钉死
  9. Google Play评论抓取
  10. 第五人格深渊金币每周更新时间