跳到主要内容
版本:3.1.x-4.x.x

写Excel

注解

使用注解很简单,只要在对应的实体类上面加上注解即可。

ExcelProperty

用于匹配excel和实体类的匹配,参数如下:

名称默认值描述
value用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头
orderInteger.MAX_VALUE优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序
index-1优先级高于valueorder,会根据index直接指定到excel中具体的哪一列
converter自动选择指定当前字段用什么转换器,默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext<T>) 方法即可

ExcelIgnore

默认所有字段都会和excel去匹配,加了这个注解会忽略该字段

ExcelIgnoreUnannotated

默认不管加不加ExcelProperty的注解的所有字段都会参与读写,加了ExcelIgnoreUnannotated注解以后,不加ExcelProperty注解的字段就不会参与

DateTimeFormat

日期转换,用String去接收excel日期格式的数据会调用这个注解,参数如下:

名称默认值描述
value参照java.text.SimpleDateFormat书写即可
use1904windowing自动选择excel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始

NumberFormat

数字转换,用String去接收excel数字格式的数据会调用这个注解。

名称默认值描述
value参照java.text.DecimalFormat书写即可
roundingModeRoundingMode.HALF_UP格式化的时候设置舍入模式

参数

概念介绍

  • WriteWorkbook 可以理解成一个excel
  • WriteSheet 理解成一个excel里面的一个表单
  • WriteTable 一个表单里面如果有多个实际用的表格,则可以用WriteTable

通用参数

WriteWorkbook,WriteSheet ,WriteTable都会有的参数,如果为空,默认使用上级。

名称默认值描述
converter默认加载了很多转换器,这里可以加入不支持的字段
writeHandler写的处理器。可以实现WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入excel的不同阶段会调用
relativeHeadRowIndex0写入到excel和上面空开几行
headclazz二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用class
clazzhead二选一。读取文件的头对应的class,也可以使用注解。如果两个都不指定,则会读取全部数据
autoTrimtrue会对头、读取数据等进行自动trim
use1904windowingfalseexcel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始
useScientificFormatfalse数字转文本的时候在较大的数值的是否是否采用科学计数法
needHeadtrue是否需要写入头到excel
useDefaultStyletrue是否使用默认的样式
automaticMergeHeadtrue自动合并头,头中相同的字段上下左右都会去尝试匹配
excludeColumnIndexes需要排除对象中的index的数据
excludeColumnFieldNames需要排除对象中的字段的数据
includeColumnIndexes只要导出对象中的index的数据
includeColumnFieldNames只要导出对象中的字段的数据
orderByIncludeColumnfalse@since 3.3.0 在使用了参数includeColumnFieldNames 或者 includeColumnIndexes的时候,会根据传入集合的顺序排序
filedCacheLocationTHREAD_LOCAL@since 3.3.0 解析class的field会有缓存,以前全局放到Map里面,3.3.0 以后默认放到ThreadLocal ,也就是说每次读写都会重新解析class,可以反射修改class的注解,并发场景不会相互影响。
THREAD_LOCAL:默认,每次读写都会缓存,但是不是同一次不会影响
MEMORY:放到全局的内存里面,理论上性能会更好,但是无法通过反射、排除等方法修改导出的对象
NONE:不缓存,性能会变差,涉及到读的同时要写,而且还要反射、排除等方法去修改对象的情况下可以考虑使用。

WriteWorkbook

提示

设置方法如下,找不到参数的看下通用参数里面是否存在。

 EasyExcel.write(fileName, DemoData.class)
// 在 write 方法之后, 在 sheet方法之前都是设置WriteWorkbook的参数
.sheet("模板")
.doWrite(() -> {
// 分页查询数据
return data();
});
名称默认值描述
excelType当前excel的类型,支持XLS、XLSX、CSV
outputStreamfile二选一。写入文件的流
fileoutputStream二选一。写入的文件
templateInputStream模板的文件流
templateFile模板文件
charsetCharset#defaultCharset只有csv文件有用,写入文件的时候使用的编码
autoCloseStreamtrue自动关闭写入的流。
password读取文件的密码
inMemoryfalse是否在内存处理,默认会生成临时文件以节约内存。内存模式效率会更好,但是容易OOM
writeExcelOnExceptionfalse写入过程中抛出异常了,是否尝试把数据写入到excel

WriteSheet

提示

设置方法如下,找不到参数的看下通用参数里面是否存在。

 EasyExcel.write(fileName, DemoData.class)
.sheet("模板")
// 在 sheet 方法之后, 在 doWrite方法之前都是设置WriteSheet的参数
.doWrite(() -> {
// 分页查询数据
return data();
});
名称默认值描述
sheetNo0需要写入的编码
sheetName需要写的Sheet名称,默认同sheetNo

WriteTable

提示

设置方法如下,找不到参数的看下通用参数里面是否存在。

        EasyExcel.write(fileName, DemoData.class)
.sheet("模板")
.table()
// 在 table 方法之后, 在 doWrite方法之前都是设置WriteTable的参数
.doWrite(() -> {
// 分页查询数据
return data();
});
名称默认值描述
tableNo0需要写入的编码