一、注解
使用注解很简单,只要在对应的实体类上面加上注解即可。
ExcelProperty
用于匹配excel和实体类的匹配,参数如下:
名称 | 默认值 | 描述 |
value | 空 | 用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头 |
order | Integer.MAX_VALUE | 优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序 |
index | -1 | 优先级高于value和order,会根据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书写即可 |
roundingMode | RoundingMode.HALF_UP | 格式化的时候设置舍入模式 |
二、参数
概念介绍
WriteWorkbook 可以理解成一个excel
WriteSheet 理解成一个excel里面的一个表单
WriteTable 一个表单里面如果有多个实际用的表格,则可以用WriteTable
通用参数
WriteWorkbook,WriteSheet ,WriteTable都会有的参数,如果为空,默认使用上级。
名称 | 默认值 | 描述 |
converter | 空 | 默认加载了很多转换器,这里可以加入不支持的字段 |
writeHandler | 空 | 写的处理器。可以实现WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入excel的不同阶段会调用 |
relativeHeadRowIndex | 0 | 写入到excel和上面空开几行 |
head | 空 | 与clazz二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用class |
clazz | 空 | 与head二选一。读取文件的头对应的class,也可以使用注解。如果两个都不指定,则会读取全部数据 |
autoTrim | true | 会对头、读取数据等进行自动trim |
use1904windowing | false | excel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始 |
useScientificFormat | false | 数字转文本的时候在较大的数值的是否是否采用科学计数法 |
needHead | true | 是否需要写入头到excel |
useDefaultStyle | true | 是否使用默认的样式 |
automaticMergeHead | true | 自动合并头,头中相同的字段上下左右都会去尝试匹配 |
excludeColumnIndexes | 空 | 需要排除对象中的index的数据 |
excludeColumnFieldNames | 空 | 需要排除对象中的字段的数据 |
includeColumnIndexes | 空 | 只要导出对象中的index的数据 |
includeColumnFieldNames | 空 | 只要导出对象中的字段的数据 |
WriteWorkbook
提示
设置方法如下,找不到参数的看下通用参数里面是否存在。
EasyExcel.write(fileName, DemoData.class)
// 在 write 方法之后, 在 sheet方法之前都是设置WriteWorkbook的参数
.sheet("模板")
.doWrite(() -> {
// 分页查询数据
return data();
});
名称 | 默认值 | 描述 |
excelType | 空 | 当前excel的类型,支持XLS、XLSX、CSV |
outputStream | 空 | 与file二选一。写入文件的流 |
file | 空 | 与outputStream二选一。写入的文件 |
templateInputStream | 空 | 模板的文件流 |
templateFile | 空 | 模板文件 |
charset | Charset#defaultCharset | 只有csv文件有用,写入文件的时候使用的编码 |
autoCloseStream | true | 自动关闭写入的流。 |
password | 空 | 读取文件的密码 |
inMemory | false | 是否在内存处理,默认会生成临时文件以节约内存。内存模式效率会更好,但是容易OOM |
writeExcelOnException | false | 写入过程中抛出异常了,是否尝试把数据写入到excel |
WriteSheet
提示
设置方法如下,找不到参数的看下通用参数里面是否存在。
EasyExcel.write(fileName, DemoData.class)
.sheet("模板")
// 在 sheet 方法之后, 在 doWrite方法之前都是设置WriteSheet的参数
.doWrite(() -> {
// 分页查询数据
return data();
});
名称 | 默认值 | 描述 |
sheetNo | 0 | 需要写入的编码 |
sheetName | 空 | 需要些的Sheet名称,默认同sheetNo |
WriteTable
提示
设置方法如下,找不到参数的看下通用参数里面是否存在。
EasyExcel.write(fileName, DemoData.class)
.sheet("模板")
.table()
// 在 table 方法之后, 在 doWrite方法之前都是设置WriteTable的参数
.doWrite(() -> {
// 分页查询数据
return data();
});
名称 | 默认值 | 描述 |
tableNo | 0 | 需要写入的编码 |
三、开发说明
1、最简单的写
excel示例

最简单的写的对象
@Getter
@Setter
@EqualsAndHashCode
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String ignore;
}
代码
/**
* 最简单的写
* <p>
* 1. 创建excel对应的实体对象 参照{@link DemoData}
* <p>
* 2. 直接写即可
*/
@Test
public void simpleWrite() {
// 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
// 写法1 JDK8+
// since: 3.0.0-beta1
String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, DemoData.class)
.sheet("模板")
.doWrite(() -> {
// 分页查询数据
return data();
});
// 写法2
fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
// 写法3
fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet);
}
}
2、根据参数只导出指定列
excel示例

代码
/**
* 根据参数只导出指定列
* <p>
* 1. 创建excel对应的实体对象 参照{@link DemoData}
* <p>
* 2. 根据自己或者排除自己需要的列
* <p>
* 3. 直接写即可
*
* @since 2.1.1
*/
@Test
public void excludeOrIncludeWrite() {
String fileName = TestFileUtil.getPath() + "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";
// 这里需要注意 在使用ExcelProperty注解的使用,如果想不空列则需要加入order字段,而不是index,order会忽略空列,然后继续往后,而index,不会忽略空列,在第几列就是第几列。
// 根据用户传入字段 假设我们要忽略 date
Set<String> excludeColumnFiledNames = new HashSet<String>();
excludeColumnFiledNames.add("date");
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板")
.doWrite(data());
fileName = TestFileUtil.getPath() + "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";
// 根据用户传入字段 假设我们只要导出 date
Set<String> includeColumnFiledNames = new HashSet<String>();
includeColumnFiledNames.add("date");
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板")
.doWrite(data());
}