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写操作相关推荐

  1. EasyExcel实现写操作

    pom中引入xml相关依赖 <dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel - ...

  2. EasyExcel使用(读、写操作)

    Java实现Excel的读写操作 EasyExcel使用(写.读操作) 1.1 导入依赖 1.2 EasyExcel实现写操作 1.2.1 写操作--创建实体 1.2.2 实现写操作具体代码 1.2. ...

  3. EasyExcel的基本操作(读操作,写操作)

    一.EasyExcel的了解: 1.EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. 文档地址:https://alib ...

  4. springboot + EasyExcel 实现操作Excel文件

    EasyExcel简介 EasyExcel特点 Java领域解析.生成Excel比较有名的框架有Apache poi.jxl等.但他们都存在一个严重的问题就是非常的耗内存.如果你的系统并发量不大的话可 ...

  5. Zookeeper整理(一)- 写操作产生事件,写操作与Watcher对应关系

    写操作与事件对应关系 事件与Watcher对应关系.png 写操作与Watcher关系 转载于:https://www.cnblogs.com/claresun/p/4495037.html

  6. GD32的flash读、擦除、写操作

    GD32的flash特征 1.在flash的前256K字节空间内,CPU执行指令零等待:在此范围外,CPU读取指令存在较长延时: 2.对于flash大于512KB(不包括等于512KB)的GD32F1 ...

  7. NoSQL生态系统——事务机制,行锁,LSM,缓存多次写操作,RWN

    13.2.4 事务机制 NoSQL系统通常注重性能和扩展性,而非事务机制. 传统的SQL数据库的事务通常都是支持ACID的强事务机制.要保证数据的一致性,通常多个事务是不可能交叉执行的,这样就导致了可 ...

  8. TokuDB介绍——本质是分形树(一个叶子4MB)+缓存减少写操作

    其性能特点见:http://www.cnblogs.com/billyxp/p/3567421.html TokuDB 是一个高性能.支持事务处理的 MySQL 和 MariaDB 的存储引擎.Tok ...

  9. Linux数据写操作改进

    Linux的IO操作中数据的写函数int nwrite = write(int fd,void* buf ,int len)表示向fd文件描述符写入len个字节长度的数据报文,但是这并不能保证真正向内 ...

最新文章

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

热门文章

  1. 数据流图(DFD)的概念
  2. python安装annoy
  3. Python课程设计:汽车销售管理系统
  4. 5、数据库的基本知识
  5. OpenHarmony编译构建系统详解,从零搭建windows下开发环境,巨方便!
  6. 重磅!百度网盘新规发布:将收回已获得的免费空间!网友炸裂了
  7. 根文件系统及Busybox详解之一
  8. Let's Make a Deal(检验智商的概率游戏)
  9. 多功能电力仪表在物联网的应用
  10. 网易视频云:用Nginx搭建flv,mp4,hls流媒体服务