引入依赖

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.5</version>
</dependency>

实现过程

一般数据插入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
* @author LeDao
* @company
* @create 2021-06-21 12:38
*/
public class Test {

public static void main(String[] args) {
//生成的excel表名和路径(这里是我的桌面路径)
String fileName = "C:\\Users\\LeDao\\Desktop\\测试.xlsx";
//插入列名
List<List<String>> head = new ArrayList<>();
//第一个列名
List<String> head0 = new ArrayList<>();
head0.add("姓名");
//第二个列名
List<String> head1 = new ArrayList<>();
head1.add("年龄");
//第三个列名
List<String> head2 = new ArrayList<>();
head2.add("生日");
//添加到head中
head.add(head0);
head.add(head1);
head.add(head2);
//要插入数据
List<List<Object>> datalist = new ArrayList<>();
//插入10条数据
for (int i = 0; i < 10; i++) {
List<Object> data = new ArrayList<>();
data.add("张三" + i);
data.add(11);
data.add(new Date());
datalist.add(data);
}
//开始生成excel表
EasyExcel.write(fileName).head(head).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet().doWrite(datalist);
}
}

使用对象

自定义列名

实体类的字段上使用@ExcelProperty注解,例如:@ExcelProperty(value = "编号")

Link实体类代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package entity;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
* @author LeDao
* @company
* @create 2021-07-20 8:22
*/
@Data
public class Link {

/**
* 编号
*/
@ExcelProperty(value = "编号")
private Integer id;

/**
* 链接名称
*/
@ExcelProperty(value = "链接名称")
private String linkName;

/**
* 链接地址
*/
@ExcelProperty(value = "链接地址")
private String linkUrl;
}

测试类代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import entity.Link;

import java.util.ArrayList;
import java.util.List;

/**
* @author LeDao
* @company
* @create 2021-06-21 12:38
*/
public class Test {

public static void main(String[] args) {
String fileName = "C:\\Users\\LeDao\\Desktop\\测试.xlsx";
List<Link> linkList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Link link = new Link();
link.setId(i);
link.setLinkName("LeDao的博客" + i);
link.setLinkUrl("https://blog.zoutl.cn");
linkList.add(link);
}
EasyExcel.write(fileName, Link.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet().doWrite(linkList);
}
}
忽略字段

在要忽略的实体类字段上使用@ExcelIgnore注解,下面代码中的id已被忽略,不会写到Excel表中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package entity;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
* @author LeDao
* @company
* @create 2021-07-20 8:22
*/
@Data
public class Link {

/**
* 编号
*/
@ExcelIgnore
private Integer id;

/**
* 链接名称
*/
@ExcelProperty(value = "链接名称")
private String linkName;

/**
* 链接地址
*/
@ExcelProperty(value = "链接地址")
private String linkUrl;
}
写入指定的列

在实体类的字段上使用 @ExcelProperty 注解,并使用 index 参数,第一列为 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package entity;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
* @author LeDao
* @company
* @create 2021-07-20 8:22
*/
@Data
public class Link {

/**
* 编号
*/
@ExcelProperty(value = "编号", index = 1)
private Integer id;

/**
* 链接名称
*/
@ExcelProperty(value = "链接名称", index = 0)
private String linkName;

/**
* 链接地址
*/
@ExcelProperty(value = "链接地址", index = 2)
private String linkUrl;
}
在模板后追加数据

下面的代码是直接在测试.xlsx的基础上追加数据,然后生成了测试2.xlsx,不要在EasyExcel.write()方法中传入对象,不然又会生成新的表头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import com.alibaba.excel.EasyExcel;
import entity.Link;

import java.util.ArrayList;
import java.util.List;

/**
* @author LeDao
* @company
* @create 2021-06-21 12:38
*/
public class Test {

public static void main(String[] args) {
String templateName = "C:\\Users\\LeDao\\Desktop\\测试.xlsx";
String fileName = "C:\\Users\\LeDao\\Desktop\\测试2.xlsx";
List<Link> linkList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Link link = new Link();
link.setId(i);
link.setLinkName("LeDao的博客" + i);
link.setLinkUrl("https://blog.zoutl.cn");
linkList.add(link);
}
//只传文件路径,不传对象,如果传了对象又会生成新的表头
EasyExcel.write(fileName).withTemplate(templateName).sheet().doWrite(linkList);
}
}
实现列名和内容居中

@HeadStyle是设置列名,@ContentStyle是设置内容,在类名上使用时是全局设置,在字段上使用是单独设置那一列(此时类名上的相同注解对这个字段无效,也就是说,字段的注解优先)

1
2
@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)

居中、左侧对齐、右侧对齐的设置如下:

代码 说明
HorizontalAlignmentEnum.CENTER 居中
HorizontalAlignmentEnum.LEFT 左侧对齐
HorizontalAlignmentEnum.RIGHT 右侧对齐
设置列名和内容的字体

@HeadFontStyle是设置列名,@ContentFontStyle是设置内容,fontName参数是设置字体(值是字体名称),bold参数是设置粗体(值有三个:BooleanEnum.TRUEBooleanEnum.FALSEBooleanEnum.DEFAULT,默认是FALSE)

在类名上使用时是全局设置,在字段上使用是单独设置那一列(此时类名上的相同注解对这个字段无效,也就是说,字段的注解优先)

1
2
@HeadFontStyle(fontName = "宋体")
@ContentFontStyle(fontName = "等线")