EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目,在尽可能节约内存的情况下支持读写百M的Excel。
这里只是EasyExcel的简单导入和导出操作,更多复杂的场景可以参考Easy Excel
1.引入依赖
1 2 3 4 5 6
| <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> </dependency>
|
2.文件导入
2.1 基本导入
文件内容如下:
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
| @Test public void test(){ File file = new File("src/main/resources/template/test.xlsx"); List<Object> sheet = EasyExcel.read(file).sheet(0).doReadSync(); for (Object row : sheet) { log.info(row.toString()); } }
@Test public void test2(){ InputStream inputStream = EasyExcelTest.class.getClassLoader().getResourceAsStream("template/test.xlsx"); List<Object> sheet = EasyExcel.read(inputStream).sheet(0).doReadSync(); for (Object row : sheet) { log.info(row.toString()); } }
|
执行结果:
可以看到读取结果的类型是一个**List<Map<Integer,String>>,所以也可以直接用这个代替List<Object>。但需要注意的是,在Excel中,需要将格式设定为文本,否则在遇到比如日期格式**的单元格时无法接收会报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Test public void test3(){ File file = new File("src/main/resources/template/test.xlsx"); List<Map<Integer,String>> sheet = EasyExcel.read(file).sheet(0).doReadSync(); for (Map row : sheet) { log.info("昵称:{}\t性别:{}\t邮箱:{}\t生日:{}\t积分:{}", row.get(0),row.get(1),row.get(2),row.get(3),row.get(4)); } }
|
2.2 模型映射导入
创建对应的模型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.format.DateTimeFormat; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;
@Data @AllArgsConstructor @NoArgsConstructor public class UserInfoModel { private String name; private String gender; private String email; private Date birthday; private Integer score; }
|
使用方法
和上面的方法区别在于多了一个.head(UserInfoModel.clss),并且返回值用List<UserInfoModel>接收
而在获取的单元格的时候就可以直接row.getXxx();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Test public void test3(){ File file = new File("src/main/resources/template/test.xlsx"); List<UserInfoModel> sheet = EasyExcel.read(file).head(UserInfoModel.class).sheet(0).doReadSync(); for (UserInfoModel row : sheet) { log.info("昵称:{}\t性别:{}\t邮箱:{}\t生日:{}\t积分:{}", row.getName(), row.getGender(), row.getEmail(), row.getBirthday(), row.getScore()); } }
|
常用注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| @Data @AllArgsConstructor @NoArgsConstructor public class UserInfoModel { @ExcelProperty(value = "昵称",index = 0) private String name; @ExcelProperty("性别") private String gender; @ExcelProperty("邮箱") private String email; @ExcelProperty("生日") @DateTimeFormat(value = "yyyy-MM-dd") private Date birthday; @ExcelProperty("积分") private Integer score; }
|
3.文件导出
3.1 基本导出
最基本的导出可以用List<List<Object>>、List<Map<Integer,Object>>或List<Object>
即每一行可以是List、Map 或 对象
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 47
| private final String PATH = "src/main/resources/template/test2.xlsx";
@Test public void test4(){ List<Object> list1 = Arrays.asList(1,2,3); List<Object> list2 = Arrays.asList("到拉萨机","收集大量","看到");
List<List<Object>> list = Arrays.asList(list1,list2); EasyExcel.write(PATH) .sheet("导出1") .doWrite(list); }
@Test public void test5(){ Map<Integer,Object> map1 = new HashMap<>(); map1.put(0,1); map1.put(1,2); map1.put(2,3); Map<Integer,Object> map2 = new HashMap<>(); map2.put(0,"郭德纲"); map2.put(1,"郭德纲"); map2.put(2,"郭德纲");
List<Map<Integer,Object>> list = Arrays.asList(map1,map2); EasyExcel.write(PATH) .sheet("导出2") .doWrite(list); }
@Test public void test6(){ UserInfoModel user1 = new UserInfoModel(); user1.setName("郭德纲"); user1.setGender("男"); UserInfoModel user2 = new UserInfoModel(); user2.setName("玉泉山"); user2.setGender("男");
List<Object> list = Arrays.asList(user1,user2); EasyExcel.write(PATH) .sheet("导出3") .doWrite(list); }
|
3.2 模型映射导出
模型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Data @AllArgsConstructor @NoArgsConstructor @Builder public class User { @ExcelProperty("名字") private String name; @ExcelProperty("年龄") private Integer age; @ExcelProperty("生日") @DateTimeFormat("yyyy年MM月dd日") private Date birthDay; }
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Slf4j public class ExcelTest { private final String PATH ="src/main/resources/test.xlsx"; @Test public void test1(){ User user1 = User.builder() .name("刘国泰") .age(12) .birthDay(new Date()) .money(BigDecimal.valueOf(12.34)) .build();
List<Object> list = Arrays.asList(user1); EasyExcel.write(PATH) .sheet("导出4") .head(User.class) .doWrite(list); } }
|
结果
4.模板填充
4.1 填充对象
首先需要准备一个模板,然后在需要填充的地方写上占位符,比如**{name}**,然后执行时就会根据name,将对应的值填充进去
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
| private final String PATH ="src/main/resources/test.xlsx";
@Test public void test2(){ File template = new File("src/main/resources/template.xlsx"); Map<String,Object> map = new HashMap<>(); map.put("name","王建国"); map.put("age",18); map.put("birthDay",new Date()); map.put("money",BigDecimal.valueOf(1888.88)); EasyExcel.write(PATH) .withTemplate(template) .sheet() .doFill(map);
}
@Test public void test3(){ File template = new File("src/main/resources/template.xlsx"); User user = User.builder() .name("王建国") .age(55) .birthDay(new Date()) .money(BigDecimal.valueOf(2888.88)) .build(); EasyExcel.write(PATH) .withTemplate(template) .sheet() .doFill(user);
}
|
结果:
4.2 填充列表
批量填充的模板中,参数与填充单个对象的写法不同,需要在填充对应的键名前加一个点。比如**{.name}**
代码上和填充对象几乎没有区别,唯一的区别在于传入的填充参数是一个List
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
| @Test public void test4(){ File template = new File("src/main/resources/template.xlsx"); User user1 = User.builder() .name("王建国") .age(55) .birthDay(new Date()) .money(BigDecimal.valueOf(2888.88)) .build(); User user2 = User.builder() .name("川建国") .age(65) .birthDay(new Date()) .money(BigDecimal.valueOf(888888.88)) .build(); List<User> list = Arrays.asList(user1,user2);
EasyExcel.write(PATH) .withTemplate(template) .sheet() .doFill(list);
}
|
结果:
4.3 组合填充
在某些场景下,可能既需要填充单个的值,也需要一次性填充多条数据,这种情况下就需要使用组合填充
在这种场景下,模板可以像下面这样写
代码:
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
|
private final String PATH ="src/main/resources/test.xlsx"; @Test public void test5(){ File template = new File("src/main/resources/template2.xlsx"); try( ExcelWriter writer = EasyExcel.write(PATH).withTemplate(template).build() ){ WriteSheet sheet = EasyExcel.writerSheet().build();
Map map = new HashMap<>(); map.put("newCount",123); writer.fill(map,sheet);
User user1 = User.builder() .name("王建国") .age(55) .birthDay(new Date()) .money(BigDecimal.valueOf(2888.88)) .build(); User user2 = User.builder() .name("川建国") .age(65) .birthDay(new Date()) .money(BigDecimal.valueOf(888881.88)) .build(); List list = Arrays.asList(user1,user2); writer.fill(list,sheet); }
}
|
结果: