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个字节长度的数据报文,但是这并不能保证真正向内 ...
最新文章
- 以两台Linux主机在docker中实现mysql主主备份以用nginx实现mysql高可用
- spark任务shell运行_大数据系列:Spark的工作原理及架构
- 因为我想在博客园长呆,所以给博客园提一些改进建议
- Linux常用命令——chattr、lsattr
- cortex-m3 操作模式 寄存器组 异常类型 堆栈 中断
- 波兰表达式 构建 表达式树
- VB的KeyAscii
- Spring Security(三十六):12. Spring MVC Test Integration
- matlab空域内图像增强之灰度变换增强
- python字典快速一览
- linux数字版权管理,数字版权管理系统 DRM
- 青果教务系统API(Java版)
- Pandas合并表格的方法总结
- 软件架构-nginx详解上
- 使用CH341 I2C连接北醒TF系列I2C模式 Python例程
- c语言十全十美游戏规则,十全十美游戏
- UTF8编码的原理及白名单过滤utf8mb4(Caused by: java.sql.BatchUpdateException: Incorrect string value)
- mac 部署nexus私服库
- 什么是.NET?什么是.NET Framework?
- python长整型是什么_长整型long-PYTHON