EasyExcel的简单使用

  • 前言
  • Excel读
    • 1.实体类
    • 2.读监听器与测试类
    • 3.输出结果
  • Excel写
    • 1.实体类
    • 2.写入Excel的测试类
    • 3.输出结果
  • 填充Excel
    • 1.Excel模板
    • 2.测试类
    • 3.输出结果

前言

EasyExcel类是一套基于Java的开源Excel解析工具类,相较于传统的框架如Apache poi、jxl等更加快速、简洁,还可以解决大文件内存溢出问题,即能让使用者在不用考虑性能、内存的等因素的情况下,快速完成Excel的读(导入)、写(导出)等功能。

版本支持:
2+版本支持Java7&Java6
3+版本支持Java8

这里使用的EasyExcel版本为3.1.1,JDK版本为1.8.0_161,同时辅助使用lombok和fastjson以简化代码或转化为Jason数据。
Maven依赖配置:

<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>       //非必要<version>1.16.10</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId> //非必要<version>1.2.47</version></dependency>
</dependencies>

Excel读

样例内容:

1.实体类

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TextReadObject {@ExcelProperty(index = 0)private Integer studentId;@ExcelProperty(index = 1)private String studentName;@ExcelProperty(index = 2)private String institute;@ExcelProperty(index = 3)private Integer level_11;@ExcelProperty(index = 4)private Integer level_12;@ExcelProperty(index = 5)private Integer level_21;@ExcelProperty(index = 6)private Integer level_22;
}

其中注解@ExcelProperty可包含两个参数index和value,在简单表头(即表头只占用一行)中以下两条注解基本等价

@ExcelProperty(index = 0)
@ExcelProperty(value = “学号”)

而在复杂表头(即本例)中,需要使用index表示。
另外需要注意的是加入表头名字出现重复,会导致只有一个字段读取到数据,此外在读取操作时不建议index和value同时使用。综上所述,在已知excel表头内容的情况下使用参数index。

2.读监听器与测试类

四个监听器,这里使用前两个

名称 说明
AnalysisEventListener < T > 分析事件侦听器:接收解析的每条数据的返回。
SyncReadListener 同步读取侦听器。
AbstractIgnoreExceptionReadListener 抽象忽略异常读取侦听器。
ModelBuildEventListener 模型构建事件侦听器。

AnalysisEventListener < T >
所有已实现的接口:Listener、ReadListener
直接已知子类:SyncReadListener

返回值类型 方法 说明
boolean hasNext 验证是否有另一条数据,可以通过返回 false 来停止读取。
void invokeHead 分析第一行时触发调用函数。
void invokeHeadMap 以map的形式放回表头,覆盖当前方法以接收表头数据
void onException 任何一个监听器进行错误报告时,所有监听器都会收到此方法
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.Map;
import java.util.List;
import lombok.AllArgsConstructor;@AllArgsConstructor
public class DemoDataListener extends AnalysisEventListener<TextReadObject> {private List<TextReadObject> dataList;//读取表头的内容@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头->"+headMap);}//一行一行读取excel中的内容@Overridepublic void invoke(TextReadObject data, AnalysisContext context) {dataList.add(data);}//读取完成之后执行的方法@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {}
}

读取Excel的测试类:

import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;public class ExcelImport {public static void simpleRead() {String fileName = "F:\\rdtext.xls";List<TextReadObject> dataList = new ArrayList<>();//每次会读取100条数据然后返回过来,直接调用使用数据就行EasyExcel.read(fileName, TextReadObject.class, new DemoDataListener(dataList)).sheet(0)//读取第一个sheet.headRowNumber(3) //跳过前三行表头内容,假如是简单表头则这句可省略.doRead();//若需要实现读取全部sheet,可以使用.doReadAll()代替.sheet(0).doRead()for (TextReadObject dl : dataList) {System.out.println(JSON.toJSONString(dl));}}public static void main(String[] args) { simpleRead(); }
}

SyncReadListener:
所有已实现的接口:Listener、ReadListener
直接已知父类:AnalysisEventListener < T >

返回值类型 方法 说明
void doAfterAllAnalysed 如果有什么操作在全部分析结束后执行
List < Object > getList
void invoke 当分析一行触发器调用函数
void setList (List < Object > list)
此处将监听器写到测试类内部
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.SyncReadListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class ExcelImportSync {public static void simpleRead() {String fileName = "F:\\text.xls";final List dataList = new ArrayList();EasyExcel.read(fileName, TextReadObject.class, new SyncReadListener() {@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头->"+headMap);}@Overridepublic void invoke(Object object, AnalysisContext context) {dataList.add(object);}}).sheet(0).headRowNumber(3).doRead();for (Object o : dataList) {TextReadObject TOB = (TextReadObject) o;System.out.println(JSON.toJSONString(TOB));}}public static void main(String[] args) { simpleRead(); }
}

相较于AnalysisEventListener < T >,SyncReadListener更加适合对多种实体类实施相同操作的情况,在定义监听器时没有指定具体的实体类。

3.输出结果

二者输出结果一样:

Excel写

1.实体类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ColumnWidth(15) //列宽,最大值为255
@HeadRowHeight(16) //表头行高
@ContentRowHeight(16) //数据行高
public class TextWriteObject {//复杂表头自动合并相同的内容@ExcelProperty(index = 0, value = {"学号", "学号", "学号"})private Integer studentId;@ExcelProperty(index = 1, value = {"姓名", "姓名", "姓名"})private String studentName;@ColumnWidth(25)//单独设置列宽@ExcelProperty(index = 2, value = {"学院", "学院", "学院"})private String institute;//复杂表头嵌套@ExcelProperty(index = 3, value = {"成绩", "第一学年", "第一学期"})private Integer level_11;@ExcelProperty(index = 4, value = {"成绩", "第一学年", "第二学期"})private Integer level_12;@ExcelProperty(index = 5, value = {"成绩", "第二学年", "第一学期"})private Integer level_21;@ExcelProperty(index = 6, value = {"成绩", "第二学年", "第二学期"})private Integer level_22;
}

此时在注解@ExcelProperty中可以同时使用参数index和value,用于同时指定位置和内容。

其他未使用注解:
@ContentStyle用于设置内容格式

参数 说明
dataFormat 日期格式
hidden 设置单元格使用此样式隐藏
locked 设置单元格使用此样式锁定
quotePrefix 在单元格前面增加`符号,数字或公式将以字符串形式展示
horizontalAlignment 设置是否水平居中
wrapped 设置文本是否应换行。将此标志设置为true通过在多行上显示使单元格中的所有内容可见
verticalAlignment 设置是否垂直居中
rotation 设置单元格中文本旋转角度。03版本的Excel旋转角度区间为-90°~90°,07版本的Excel旋转角度区间为0°-180°
indent 设置单元格中缩进文本的空格数
borderLeft 设置左边框的样式
borderRight 设置右边框样式
borderTop 设置上边框样式
borderBottom 设置下边框样式
leftBorderColor 设置左边框颜色
rightBorderColor 设置右边框颜色
topBorderColor 设置上边框颜色
bottomBorderColor 设置下边框颜色
fillPatternType 设置填充类型
fillBackgroundColor 设置背景色
fillForegroundColor 设置前景色
shrinkToFit 设置自动单元格自动大小

@ContentFontStyle用于设置单元格内容字体格式

参数 说明
fontName 字体名称
fontHeightInPoints 字体高度
italic 是否斜体
strikeout 是否设置删除水平线
color 字体颜色
typeOffset 偏移量
underline 下划线
bold 是否加粗
charset 编码格式

@HeadFontStyle用于定制标题字体格式

参数 说明
fontName 设置字体名称
fontHeightInPoints 设置字体高度
italic 设置字体是否斜体
strikeout 是否设置删除线
color 设置字体颜色
typeOffset 设置偏移量
underline 设置下划线
charset 设置字体编码
bold 设置字体是否加粗

@ExcelIgnore不将该字段转换成Excel

@ExcelIgnoreUnannotated没有注解的字段都不转换

2.写入Excel的测试类

import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.List;public class ExcelExport {public static void simpleWrite(){String fileName = "F:\\wttext.xls";List<TextWriteObject> dataList = new ArrayList<>();dataList.add(new TextWriteObject(2022101, "张三","生命科学院", 653, 602, 683, 707));dataList.add(new TextWriteObject(2022102, "李四","生命科学院", 568, 596, 611, 632));dataList.add(new TextWriteObject(2022103, "王五","生命科学院", 606, 673, 624, 653));dataList.add(new TextWriteObject(2022201, "赵六","语言文学院", 710, 722, 686, 703));EasyExcel.write(fileName, TextWriteObject.class).sheet(0).doWrite(dataList);}public static void main(String[] args) { simpleWrite(); }
}

3.输出结果

填充Excel

填充功能可以事先在Excel中设计好格式和排版,再在后台将需要导出的数据传入fill方法完成最终Excel文件。

1.Excel模板


此模板允许多条填充,以第一列为例,若为{studentId}则仅允许单条填充。
如果本来就有 {} ,用转义\{\}代替。

2.测试类

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import java.util.ArrayList;
import java.util.List;public class ExcelFill {public static void simpleFill(){List dataList = new ArrayList();dataList.add(new TextWriteObject(2022101, "张三","生命科学院", 653, 602, 683, 707));dataList.add(new TextWriteObject(2022102, "李四","生命科学院", 568, 596, 611, 632));dataList.add(new TextWriteObject(2022103, "王五","生命科学院", 606, 673, 624, 653));dataList.add(new TextWriteObject(2022201, "赵六","语言文学院", 710, 722, 686, 703));String writeFile = "F:\\filltext.xls";String templateFile = "F:\\template.xls";ExcelWriterBuilder writerBuilder = EasyExcel.write(writeFile, TextReadObject.class).withTemplate(templateFile);WriteSheet writeSheet = writerBuilder.sheet().build();ExcelWriter excelWriter = writerBuilder.build();//在填充玩多结果数据后,要强制换行,不然后续的单结果数据会发生覆盖现象FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();excelWriter.fill(dataList, fillConfig, writeSheet);excelWriter.finish();//调用finish方法,关闭文件流}public static void main(String[] args) { simpleFill(); }
}

3.输出结果

更详细的内容请参考官方文档:
https://easyexcel.opensource.alibaba.com/docs/current/

【java学习】EasyExcel的简单使用相关推荐

  1. Java学习:创建简单的名片管理系统

    创建简单的名片管理系统 一.创建名片实体类 二.创建名片管理类 1. 创建主菜单 2. 创建登录方法 3. 创建名片管理方法 5. 添加名片方法 6.创建保存名片方法 7.创建读取名片文件方法 8. ...

  2. Java使用EasyExcel导出简单、复杂excel,以及多个excel打包导出下载zip

    EasyExcel是一款阿里开源的一款非常优秀Excel导入导出工具,使用内存小,处理速度快,使用方便,正好最近项目中有用到多个excel导出下载的功能,便记录下 EasyExcel使用git地址:G ...

  3. Java学习记录之简单的图书管理系统(完善中)

    电子书管理系统 功能划分 最核心的功能 提供图书管理的服务 添加图书 查询 检索所有的图书 按已知检索图书信息 图书的删除 图书信息的更新 用户 用户的类型 管理员:图书的添加.更新.删除操作 普通用 ...

  4. JAVA学习之路-简单的城堡游戏(一)

    简单的文字城堡游戏(一) 最近在学习后台的一些功能,发现自己的基础不是很牢固,所以想写点小程序,巩固一下以前学的知识,融合一下. 之前在慕课上学的课程中就有一个这样的小程序,写一个简单的文字城堡游戏. ...

  5. Java学习之if-else简单方法小程序

    public class calc {public static void main(String[] args){int a = 1,b = 2,max;max = a>b ? a :b;Sy ...

  6. day_01_ java 学习

    day_01_ java 学习 一. 简单介绍 每天8小时,5年!成为行业专业! 循环,数组,面向对象. 编程就是入门难,就是要慢慢成长,慢慢培养自己学霸习惯! 少走弯路. 听课,必须准备,必须预习, ...

  7. java学习+JDK下载安装环境配置+IDEA安装下载简单使用

    JAVA学习1 写在前边的一些闲话: 首先就是编写java代码时该大写的没大写,以前没养成好习惯QAQ,大家不要学我,偷偷笑话我就好辽QAQ 我也是一边学一边更新,当做给自己的笔记,也希望能帮到需要的 ...

  8. Java学习苦旅(九)——原来顺序表可以这么简单呀

    本篇博客将详细讲解顺序表的相关知识. 文章目录 顺序表的概念 顺序表的实现 变量创建 打印顺序表 获取顺序表的(有效)长度 增加元素 判断pos位置的合法性 判断顺序表是否需要扩容 将顺序表中的已有数 ...

  9. 使用java解析和读取excel表格(EasyExcel的简单使用)

    ** 解析excel的工具 ** Apache POI.JXL.Alibaba EasyExcel等.其中Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文 ...

最新文章

  1. 正则表达式一些关键字使用
  2. 维吉尼亚密码(Vigenère Cipher)
  3. MASH结构相噪分析的simulink仿真
  4. MySQL-8.0.x 新特性之索引页合并
  5. ubuntu18安装mysql遇到的root密码问题
  6. POJ 3225 线段树+lazy标记
  7. selenium firefox驱动_Python3+selenium配置常见报错解决方案
  8. iOS自定义从底部弹上来的View
  9. 如何阻止分布式拒绝服务***
  10. 应用安全的重要性!再怎么强调都不过分的5大理由
  11. 2021-08-31Flink 中的核心概念和基础考察
  12. 免ROOT的计算机隐藏应用软件,AppHider隐藏应用
  13. CC2430基础——IAR的安装及配置
  14. 微软小冰之父李迪创业,沈向洋任执行董事,「红棉小冰」单飞
  15. 【hdu 6045】Is Derek lying?
  16. Mixed mode assembly is built against version 'v1.1.4322' of the runtime and...问题——C# DirectXSound
  17. java中各种O的含义(PO,DO,VO,TO,QO,BO,DAO,DTO,POJO)
  18. 02-leveldb入门
  19. 一个域名价值怎么看 域名估值的标准是什么
  20. 信息技术课计算机软件的微课,微课在信息技术课程上的有效应用策略研究

热门文章

  1. 对于阿里云轻量应用服务器的介绍?它的优点?值得购买吗?
  2. android选择文件夹api,Android获取文件夹api及对应存储地址整理
  3. (八十)第五章编程练习
  4. 2014-2-21 新增随便
  5. 教你百度网盘满速下载(官方功能)
  6. 小孩写字慢又丑,怎么治?来看这里
  7. 360 序列帧html生成工具,1.gif导出为序列帧
  8. 如何在iPhone 或iPad上使用标记在 PDF 上打字?
  9. [译]C# 7系列,Part 10: Spanlt;Tgt; and universal memory management Spanlt;Tgt;和统一内存管理
  10. java上位机通信协议实现