引入依赖
1 2 3 4 5 6
| <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;
public class Test {
public static void main(String[] args) { 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.add(head0); head.add(head1); head.add(head2); List<List<Object>> datalist = new ArrayList<>(); 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); } 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;
@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;
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;
@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;
@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;
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.TRUE
、BooleanEnum.FALSE
、BooleanEnum.DEFAULT
,默认是FALSE)
在类名上使用时是全局设置,在字段上使用是单独设置那一列(此时类名上的相同注解对这个字段无效,也就是说,字段的注解优先)
1 2
| @HeadFontStyle(fontName = "宋体") @ContentFontStyle(fontName = "等线")
|