easy-excel

一文让你了解如何快速、优雅的实现导出Excel

半世苍凉 提交于 2021-02-19 20:51:12
前言: 春节假期刚刚过去,大家是不是已经开始了搬砖生活啦,嘻嘻 o(∩_∩)o ,可我还在休假中呢 ! 好啦,咱们言归正传,开始聊聊正文。做过后端管理系统的同学,大概率都会收到过实现 导出Excel 的功能需求,因为这个功能在后台管理系统中是个必备功能。 那大家是怎么实现这个功能的呢? 使用Apache提供POI组件实现; 使用现成的、简便的第三方工具库(避免重复造轮子) Hutool 工具库中的Excel工具类 EasyExcel 阿里开源的基于Java的简单、省内存的读写Excel工具库 接下来咱们来聊聊使用 Hutool、EasyExcel 工具库实现导出Excel。 使用第三方库实现导出Excel 业界有句话:不重复造轮子。 使用工具类可以减少日常繁琐的编码,减少重复的编码时间,提高开发效率。 作为程序员,应该多善于利用工具减少代码冗余,美化自己的代码。 使用 Hutool 工具库实现导出Excel: 1、首先添加依赖 在pom.xml中添加上依赖: <!--hutool 导出 Excel 工具组件--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.1.0</version> </dependency> <!--POI组件-->

10w行级别数据的Excel导入优化记录

为君一笑 提交于 2021-02-09 20:06:34
作者:后青春期的Keats www.cnblogs.com/keatsCoder/p/13217561.html 需求说明 项目中有一个 Excel 导入的需求:缴费记录导入 由实施 / 用户 将别的系统的数据填入我们系统中的 Excel 模板,应用将文件内容读取、校对、转换之后产生欠费数据、票据、票据详情并存储到数据库中。 在我接手之前可能由于之前导入的数据量并不多没有对效率有过高的追求。但是到了 4.0 版本,我预估导入时Excel 行数会是 10w+ 级别,而往数据库插入的数据量是大于 3n 的,也就是说 10w 行的 Excel,则至少向数据库插入 30w 行数据。 因此优化原来的导入代码是势在必行的。我逐步分析和优化了导入的代码,使之在百秒内完成(最终性能瓶颈在数据库的处理速度上,测试服务器 4g 内存不仅放了数据库,还放了很多微服务应用。处理能力不太行)。具体的过程如下,每一步都有列出影响性能的问题和解决的办法。 导入 Excel 的需求在系统中还是很常见的,我的优化办法可能不是最优的,欢迎读者在评论区留言交流提供更优的思路 一些细节 数据导入: 导入使用的模板由系统提供,格式是 xlsx (支持 65535+行数据) ,用户按照表头在对应列写入相应的数据 数据校验: 数据校验有两种: 字段长度、字段正则表达式校验等,内存内校验不存在外部数据交互。对性能影响较小

记一次使用 Lombok 翻车造成的事故!

僤鯓⒐⒋嵵緔 提交于 2021-02-02 11:59:41
来自:掘金,作者:liuxuzxx 链接:https://juejin.cn/post/6881432532332576781 序言 去年在项目当中引入了Lombok插件,着实解放了双手,代替了一些重复的简单工作(Getter,Setter,toString等方法的编写)。 但是,在使用的过程当中,也发现了一些坑,开始的时候并没有察觉到是Lombok的问题,后来跟踪了对应的其他组件的源码,才发现是Lombok的问题! Setter-Getter方法的坑 问题发现 我们在项目当中主要使用Lombok的Setter-Getter方法的注解,也就是组合注解@Data,但是在一次使用Mybatis插入数据的过程当中,出现了一个问题,问题描述如下: 我们有个实体类: @Data public class NMetaVerify{ private NMetaType nMetaType; private Long id; ....其他属性 } 当我们使用Mybatis插入数据的时候,发现,其他属性都能正常的插入,但是就是nMetaType属性在数据库一直是null. 解决 当我debug项目代码到调用Mybatis的插入SQL对应的方法的时候,我看到NMetaVerify对象的nMetaType属性还是有数据的,但是执行插入之后,数据库的nMetaType字段就是一直是null

封装了easyExcel的工具类,包含字段校验功能,使用validate校验注解即可

我的未来我决定 提交于 2020-12-28 22:38:51
package com.ciics.cscloud.xinsurance.social.utils.excel; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.util.StringUtils; import lombok.Data; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.util.CollectionUtils; import javax.validation.ConstraintViolation; import javax.validation

EasyExcel converter转换数据库映射关系

无人久伴 提交于 2020-12-18 13:47:18
项目中的需求:导出功能,且有些字段是需要通过数据库存储的数据字典来进行翻译转换。比如:企业类型,1=生产企业,2=配送企业,3=经营企业,等等。这些映射关系虽然变化频率很低,但也是动态存储在数据库中的。我们不希望将这些映射关系写死在Java代码中。 EasyExcel有个Converter功能,目前看来有两种实现方式: 一种是在@ExcelProperty注解中指定: @ExcelProperty(value = "创建时间",index = 5,converter = DateTimeConverter.class) private Date creTime; 一种是注册写处理器的方式,类似于: public static void export(HttpServletResponse response, List rowList,String fileName,Class clazz,String sheetName) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename*=utf

EasyExcel--Excel工具

和自甴很熟 提交于 2020-12-05 05:22:38
特点 一看就懂的excel操作工具 demo gitee地址 https://gitee.com/ichiva/easy-excel-demo.git 主要依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.5</version> </dependency> 编写测试用例 实体类 @Data public class Student { //设置excel表头名称和顺序 @ExcelProperty(value="学生编号",index=1) private Integer sno; @ExcelProperty(value="学生姓名",index=0) private String sname; } 编写监听器 public class ExcelListener extends AnalysisEventListener<Student> { //一行一行读取excel内容 @Override public void invoke(Student data, AnalysisContext analysisContext) { System.out.println("*****" + data); } //读取表头内容 @Override

EasyExcel简介

生来就可爱ヽ(ⅴ<●) 提交于 2020-12-01 10:23:00
一 Excel导入导出的应用场景 1 数据导入 减轻录入工作量 2 数据导出 统计信息归档 3 数据传输 异构系统之间数据传输 二 EasyExcel简介 1 官方网站 https://github.com/alibaba/easyexcel 快速开始: https://www.yuque.com/easyexcel/doc/easyexcel 2 EasyExcel特点 Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。 EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。 EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener) 三 写实战 1 创建一个普通的maven项目 项目名:alibaba_easyexcel 2 pom中引入xml相关依赖 <dependencies> <!-- easyexcel --> <dependency> <groupId>com

EasyExcel java实现excel简单读写操作(快速上手,复制粘贴即可)

强颜欢笑 提交于 2020-11-23 20:36:49
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。 一、导入maven坐标 Lombok可选,不导入的话需要手动写getter、setter、tostring <!-- easyexcel--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version> </dependency> <!--xls--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version> 1.18.16</version> <

easyExcel一对多模板导出合并

不羁的心 提交于 2020-11-06 17:55:42
最近的项目做导出,说是简单的项目,就选了easyExcel,没想到后来做了一对多复杂导出。看了一下api发现复杂的填充Excel也只是没有一对多的填充。看到easyPOI导出可以一对多导出,引入项目,调了一天,最后发现只能一在前,多在后才能正常点合并单元格,但是模板被改了(不知道是不是因为同时引入easyExcel和easyPOI导致的冲突,我复原到原来的一对一导出,模板还是被改了,后来取消引入easyPOI才正常)。后来百度了一下easyExcel一对多导出的,都没有找到比较仔细的步骤,后来发现了可以easyExcel可以自定义合并单元格,于是就开始写了。可能比较low。但是还是记录一下,说不定能帮上谁的忙。 图一是导出结果,图二是导出模板 图一 图二 先说说思路,这是一次模板填充导出。导出的时候填充的List对象是没有子类的对象List<ResetStatiExportDto> exportDtos,我们从数据库获取的(这里我用for循环填充就好了)一对多的对象是包含子类集合的List集合List<ResetStatiDto> statiDtos。下面是步骤: 一、我们拿到statiDtos后,先转成exportDtos作为填充Excel的数据。 二、自定义合并单元格策略,合并的列已经固定好,合并的行从statiDtos获取,如果有子类集合

10w行级别数据的Excel导入优化记录

旧时模样 提交于 2020-10-16 08:52:21
需求说明 项目中有一个 Excel 导入的需求:缴费记录导入 由实施 / 用户 将别的系统的数据填入我们系统中的 Excel 模板,应用将文件内容读取、校对、转换之后产生欠费数据、票据、票据详情并存储到数据库中。 在我接手之前可能由于之前导入的数据量并不多没有对效率有过高的追求。但是到了 4.0 版本,我预估导入时Excel 行数会是 10w+ 级别,而往数据库插入的数据量是大于 3n 的,也就是说 10w 行的 Excel,则至少向数据库插入 30w 行数据。因此优化原来的导入代码是势在必行的。我逐步分析和优化了导入的代码,使之在百秒内完成(最终性能瓶颈在数据库的处理速度上,测试服务器 4g 内存不仅放了数据库,还放了很多微服务应用。处理能力不太行)。具体的过程如下,每一步都有列出影响性能的问题和解决的办法。 导入 Excel 的需求在系统中还是很常见的,我的优化办法可能不是最优的,欢迎读者在评论区留言交流提供更优的思路 声明:本文首发于博客园,作者:后青春期的Keats;地址: https://www.cnblogs.com/keatsCoder/ 转载请注明,谢谢! 一些细节 数据导入:导入使用的模板由系统提供,格式是 xlsx (支持 65535+行数据) ,用户按照表头在对应列写入相应的数据 数据校验:数据校验有两种: 字段长度、字段正则表达式校验等