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. 环境变量设置及第三方模块安装
  2. Jenkins搭建.NET自动编译测试与发布环境
  3. 1.3 安装Oracle遇到的问题-yum更新配置
  4. 重磅公开!阿里语音识别模型端核心技术,让你“听”见未来
  5. C++不定长字符串比较合理且简单的解决方法
  6. Sublime Text 2 快捷键用法大全
  7. Bootstrap列表组
  8. php 写一个大富翁游戏,抽奖系列:如何用纯js做一个大富翁游戏
  9. 刚刚,自动驾驶路测国家规范出台:无人车即将开上更多实际道路
  10. 百度浏览器内核太低,浏览京东有问题
  11. 17、小写数字转大写数字
  12. U盘不能复制超过4G的文件解决方法
  13. Glide加载圆形图片并且带边框
  14. 微信H5页保存当前页面为图片踩坑
  15. 已知xyz yzz 532Java_已知 xyz+yzz=532 ,其中 x 、 y 、 z 为数字,编程求出 x 、 y 、 z 的值。_学小易找答案...
  16. [易飞]同一单据如何根据不同用户或组限定仓库(客户)
  17. CTF Alice与Bob
  18. 爱奇艺面向海量设备的边缘计算PAAS平台及应用实践
  19. 电脑饥荒服务器未响应,《饥荒》联机版常见问题及解决方法一览
  20. 多开分身苹果版_【苹果/安卓】影分身,我们每个人都会!

热门文章

  1. 下载淘宝主图视频方法
  2. 视频 服务器运行时失败,Windows Media Player服务器运行失败的解决办法讲解
  3. 股份有限公司的法律形式
  4. 了解抖音本地生活服务商:连接你与便捷生活的桥梁
  5. Debug调试程序的方法
  6. 【软考软件评测师】第十一章 软件工程之系统维护
  7. 圆柱、圆锥的侧面积和球的表面积公式推导(不用积分)
  8. 编译原理------语法分析器C/C++代码实现
  9. wxPython入门中文版 (Getting Started with wxPython)
  10. 港交所与投行洽谈潜在收购目标,涉及区块链领域