Easyexcel写操作
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel
项目github地址:https://github.com/alibaba/easyexcel
官网地址:https://easyexcel.opensource.alibaba.com/docs/current/
先吐槽一下,官方文档写的太烂了,缺少依赖、逻辑不清晰、复制到idea很多跑起来报错
写Excel
- 准备工作
创建项目,在pom文件中添加以下依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!-- easyexcel 依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version></dependency></dependencies>
创建一个实体类,用于写入excel
@Data
public class Student implements Serializable {@ExcelProperty(value = {"学生编号"},order = 10)private Integer id;@ExcelProperty(value = {"学生姓名"},order = 2)private String name;@ExcelProperty(value = {"学生薪水"},order = 1)private Double salary;@ExcelProperty(value = {"学生生日"},order = 11)private Date birthday;
}
最简单的写入
//生成数据
public List<Student> getData() {List<Student> lists = new ArrayList<>();for(int i = 0; i <= 10; i++) {Student student = new Student();student.setId(i + 1);student.setName("李四" + i);student.setBirthday(new Date());student.setSalary(1500.00D);lists.add(student);}return lists;
}//最简单的写入
@Test
void contextLoads() {EasyExcel.write("学生信息表.xlsx", Student.class).sheet().doWrite(getData());
}
PS:一下方法都是有关最简单写入的具体方法解释,不感兴趣的可以跳过
write方法
代码解释:
EasyExcel.write
源码如下:两个重载的方法,接收文件名(含路径)或文件名和Excel头文件
,new 了一个ExcelWriterBuilder对象,将pathName或head写入excelWriterBuilder并返回
- pathName:文件名
- head:写入表格的class对象,如上方Student.class对象
public class EasyExcelFactory {/*** 构建一个Excel写对象** @return*/public static ExcelWriterBuilder write() {return new ExcelWriterBuilder();}/*** 构建一个Excel写对象** @param file 用来写出文件对象* * @return Excel writer builder*/public static ExcelWriterBuilder write(File file) {return write(file, null);}/*** 构建 Excel写对象** @param file* 用来写出的文件对象* @param head* 写出的数据类型的class对象* @return Excel writer builder*/public static ExcelWriterBuilder write(File file, Class head) {ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();excelWriterBuilder.file(file);if (head != null) {excelWriterBuilder.head(head);}return excelWriterBuilder;}/*** 构建Excel 写对象* * @param pathName* 写出的文件路径名* @return Excel writer builder*/public static ExcelWriterBuilder write(String pathName) {return write(pathName, null);}/*** 构建excel 写对象** @param pathName* 写出的文件路径名* @param head* 写出数据的数据类型的class对象* @return Excel writer builder*/public static ExcelWriterBuilder write(String pathName, Class head) {ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();excelWriterBuilder.file(pathName);if (head != null) {excelWriterBuilder.head(head);}return excelWriterBuilder;}/*** 构建excel写对象** @param outputStream* 写出的输出流对象* @return Excel writer builder*/public static ExcelWriterBuilder write(OutputStream outputStream) {return write(outputStream, null);}/*** 构建excel写对象** @param outputStream* 写出的输出流* @param head* 写出数据的数据类型的class对象* @return Excel writer builder*/public static ExcelWriterBuilder write(OutputStream outputStream, Class head) {ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();excelWriterBuilder.file(outputStream);if (head != null) {excelWriterBuilder.head(head);}return excelWriterBuilder;}
}
sheet()方法
@Test
void contextLoads() {EasyExcel.write("学生信息表.xlsx", Student.class).sheet().doWrite(getData());
}
sheet()方法代表要在excel那个sheet页写入数据,如果不指定,,默认写在第一个sheet页,默认sheet名:0
源码解释:所有重载的方法可归为一个方法,接收sheetNo(第几个sheet(Integer)),sheetName(sheet页名称(String)),返回ExcelWriterSheetBuilder
/*选中第一个sheet页写操作 sheet 页的值为 0*/public ExcelWriterSheetBuilder sheet() {return sheet(null, null);}/*选中 第一个的 sheet页sheet 页的名字 为 sheetNo*/ public ExcelWriterSheetBuilder sheet(Integer sheetNo) {return sheet(sheetNo, null);}/*选中第一个的 sheet页sheet 页的名字 为 sheetName*/ public ExcelWriterSheetBuilder sheet(String sheetName) {return sheet(null, sheetName);}/*选中第一个 sheet页sheet 页的名字 为 sheetNo 或者 sheetName*/public ExcelWriterSheetBuilder sheet(Integer sheetNo, String sheetName) {ExcelWriter excelWriter = build();ExcelWriterSheetBuilder excelWriterSheetBuilder = new ExcelWriterSheetBuilder(excelWriter);if (sheetNo != null) {excelWriterSheetBuilder.sheetNo(sheetNo);}if (sheetName != null) {excelWriterSheetBuilder.sheetName(sheetName);}return excelWriterSheetBuilder;
doWrite方法
源码如下:
public void doWrite(List data) {if (this.excelWriter == null) {throw new ExcelGenerateException("Must use 'EasyExcelFactory.write().sheet()' to call this method");} else {this.excelWriter.write(data, this.build());this.excelWriter.finish();}}
如上可见,doWrite方法只是简单判断了一下当前ExcelWriterSheetBuilder类是否为空,然后调用了write方法,再关闭excelWriter
我们在深入看一下write方法
public ExcelWriter write(List data, WriteSheet writeSheet) {return this.write(data, (WriteSheet)writeSheet, (WriteTable)null);
}public ExcelWriter write(List data, WriteSheet writeSheet, WriteTable writeTable) {this.excelBuilder.addContent(data, writeSheet, writeTable);return this;
}
本质上这两个方法属于一个方法,都是接收三个参数,返回ExcelWriter对象
- List data: 要写入的数据
- WriteSheet writeSheet: doWrite方法返回ExcelWriterSheetBuilder中的一个属性,存放了sheet信息
- writeTable: 存放table信息,暂不讨论
/** @deprecated */
@Deprecated
public ExcelWriter write(List data, Sheet sheet) {return this.write(data, (Sheet)sheet, (Table)null);
}/** @deprecated */
@Deprecated
public ExcelWriter write(List data, Sheet sheet, Table table) {WriteSheet writeSheet = null;if (sheet != null) {writeSheet = new WriteSheet();writeSheet.setSheetNo(sheet.getSheetNo() - 1);writeSheet.setSheetName(sheet.getSheetName());writeSheet.setClazz(sheet.getClazz());writeSheet.setHead(sheet.getHead());writeSheet.setTableStyle(sheet.getTableStyle());writeSheet.setRelativeHeadRowIndex(sheet.getStartRow());writeSheet.setColumnWidthMap(sheet.getColumnWidthMap());}return this.write(data, writeSheet, writeTable);
}
已过时方法,本质如上,根据return语句看,还是调用以上方法,
接着看一下addContent
public void addContent(List data, WriteSheet writeSheet) {this.addContent(data, writeSheet, (WriteTable)null);}public void addContent(List data, WriteSheet writeSheet, WriteTable writeTable) {try {this.context.currentSheet(writeSheet, WriteTypeEnum.ADD);this.context.currentTable(writeTable);if (this.excelWriteAddExecutor == null) {this.excelWriteAddExecutor = new ExcelWriteAddExecutor(this.context);}this.excelWriteAddExecutor.add(data);} catch (RuntimeException var5) {this.finishOnException();throw var5;} catch (Throwable var6) {this.finishOnException();throw new ExcelGenerateException(var6);}}
addContent接收了Excel原始数据,通过excelWriteAddExecutor.add写入,具体写入过程可看此方法
表头操作
属性注解
@Data
public class Student implements Serializable {@ExcelProperty(value = {"学生编号"},order = 10)@NumberFormat("#,###")private Integer id;@ExcelProperty(value = {"学生姓名"},order = 2)private String name;@ExcelProperty(value = {"学生薪水"},order = 1)@ExcelIgnoreprivate Double salary;@ExcelProperty(value = {"学生生日"},order = 11)@DateTimeFormat("yyyy-mm-dd")private Date birthday;
}
如上所见,我们在每个属性上加入了@ExcelProperty注解,表示当前属性是一个excel字段,easyexcel采用了注解的方式定义excel 表头字段,给我们开发带来了极大的便利。
ExcelProperty
index 指定写到第几列,默认根据成员变量排序。value
指定写入的名称,默认成员变量的名字,多个value
可以参照快速开始中的复杂头ExcelIgnore
默认所有字段都会写入excel,这个注解会忽略这个字段DateTimeFormat
日期转换,将Date
写到excel会调用这个注解。里面的value
参照java.text.SimpleDateFormat
NumberFormat
数字转换,用Number
写excel会调用这个注解。里面的value
参照java.text.DecimalFormat
ExcelIgnoreUnannotated
默认不加ExcelProperty
的注解的都会参与读写,加了不会参与
还有其他注解,地址都在:com.alibaba.excel.annotation
Easyexcel写操作相关推荐
- EasyExcel实现写操作
pom中引入xml相关依赖 <dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel - ...
- EasyExcel使用(读、写操作)
Java实现Excel的读写操作 EasyExcel使用(写.读操作) 1.1 导入依赖 1.2 EasyExcel实现写操作 1.2.1 写操作--创建实体 1.2.2 实现写操作具体代码 1.2. ...
- EasyExcel的基本操作(读操作,写操作)
一.EasyExcel的了解: 1.EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. 文档地址:https://alib ...
- springboot + EasyExcel 实现操作Excel文件
EasyExcel简介 EasyExcel特点 Java领域解析.生成Excel比较有名的框架有Apache poi.jxl等.但他们都存在一个严重的问题就是非常的耗内存.如果你的系统并发量不大的话可 ...
- Zookeeper整理(一)- 写操作产生事件,写操作与Watcher对应关系
写操作与事件对应关系 事件与Watcher对应关系.png 写操作与Watcher关系 转载于:https://www.cnblogs.com/claresun/p/4495037.html
- GD32的flash读、擦除、写操作
GD32的flash特征 1.在flash的前256K字节空间内,CPU执行指令零等待:在此范围外,CPU读取指令存在较长延时: 2.对于flash大于512KB(不包括等于512KB)的GD32F1 ...
- NoSQL生态系统——事务机制,行锁,LSM,缓存多次写操作,RWN
13.2.4 事务机制 NoSQL系统通常注重性能和扩展性,而非事务机制. 传统的SQL数据库的事务通常都是支持ACID的强事务机制.要保证数据的一致性,通常多个事务是不可能交叉执行的,这样就导致了可 ...
- TokuDB介绍——本质是分形树(一个叶子4MB)+缓存减少写操作
其性能特点见:http://www.cnblogs.com/billyxp/p/3567421.html TokuDB 是一个高性能.支持事务处理的 MySQL 和 MariaDB 的存储引擎.Tok ...
- Linux数据写操作改进
Linux的IO操作中数据的写函数int nwrite = write(int fd,void* buf ,int len)表示向fd文件描述符写入len个字节长度的数据报文,但是这并不能保证真正向内 ...
最新文章
- 环境变量设置及第三方模块安装
- Jenkins搭建.NET自动编译测试与发布环境
- 1.3 安装Oracle遇到的问题-yum更新配置
- 重磅公开!阿里语音识别模型端核心技术,让你“听”见未来
- C++不定长字符串比较合理且简单的解决方法
- Sublime Text 2 快捷键用法大全
- Bootstrap列表组
- php 写一个大富翁游戏,抽奖系列:如何用纯js做一个大富翁游戏
- 刚刚,自动驾驶路测国家规范出台:无人车即将开上更多实际道路
- 百度浏览器内核太低,浏览京东有问题
- 17、小写数字转大写数字
- U盘不能复制超过4G的文件解决方法
- Glide加载圆形图片并且带边框
- 微信H5页保存当前页面为图片踩坑
- 已知xyz yzz 532Java_已知 xyz+yzz=532 ,其中 x 、 y 、 z 为数字,编程求出 x 、 y 、 z 的值。_学小易找答案...
- [易飞]同一单据如何根据不同用户或组限定仓库(客户)
- CTF Alice与Bob
- 爱奇艺面向海量设备的边缘计算PAAS平台及应用实践
- 电脑饥荒服务器未响应,《饥荒》联机版常见问题及解决方法一览
- 多开分身苹果版_【苹果/安卓】影分身,我们每个人都会!