阿里巴巴easyExcel依赖:
<!--阿里巴巴easyExcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
首先我们做文件导入:
1.我们创建一个简单的excel文件:
2. 我们创建一个对象UserDto
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {
@ExcelProperty(value = "编号")
private Long id;
@ExcelProperty(value = "姓名")
private String username;
@ExcelProperty(value = "密码")
private String password;
@ExcelProperty(value = "手机号码")
private String phone;
}
3. 我们创建一个监听器
/**
* 这是自定义的监听器
*/
@Component
public class ExcelListen implements ReadListener<UserDto> {
private ArrayList<UserDto> oldList = new ArrayList<>();
private ArrayList<UserDto> newList = new ArrayList<>();
/**
* 每读一行触发一次
* @param userDto
* @param analysisContext
*/
@Override
public void invoke(UserDto userDto, AnalysisContext analysisContext) {
// 每读一行就给集合里面插入一次
oldList.add(userDto);
}
/**
* 全部读完以后触发一次
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
newList.clear();
newList.addAll(oldList);
oldList.clear();
}
/**
* 将读取到的list返回
* @return
*/
public ArrayList getList(){
return newList;
}
}
监听器里面我们实现了阿里的ReadListener接口,实现了两个方法,一个是每读一行触发一次,第二个是在读取完以后触发一次,我们可以根据业务需求来进行编写。 我这里只是做一个简单的示例,将读取的内容写了一个方法并返回。
4.接下来就是我们正式的接口,导入文件接口编写
/**
* 文件导入
* @param file
* @return
*/
@PostMapping("/excelAdd")
public ResponseResult lead(@RequestPart MultipartFile file) throws IOException {
// 拿到文件输入流
InputStream inputStream = file.getInputStream();
// 在这里我们要创建一个监听器
EasyExcel.read(inputStream, UserDto.class,excelListen)
// 读第一张工作表,是从0开始
.sheet(0)
// 列头占一行
.headRowNumber(1)
.doRead();
ArrayList list = excelListen.getList();
System.out.println(list);
return new ResponseResult(200,"导入成功");
}
具体代码的作用我打了注释,方便大家理解
5.最终我们测试看一下打印结果,是否是我们需要的
结果正确
接下来我们演示文件导出
1.我们直接编写接口
@GetMapping("/export")
public ResponseResult export(HttpServletResponse response) throws IOException {
// 自己先模拟一个数据集合,里面放我们的UserDto
ArrayList<UserDto> userDtos = new ArrayList<>(Arrays.asList(new UserDto(1L,"cxx","123","321")));
// 告诉前端我们返回的是个excel表
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
// 设置字符编码
response.setCharacterEncoding("utf-8");
// 文件的名字
String fileName = URLEncoder.encode("测试数据", "utf-8").replaceAll("\\+", "%20");
// 响应头
response.setHeader("Content-disposition","attachment;fileName" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream())
// 设置表头,我们UserDto打了 @ExcelProperty注解的字段
.head(UserDto.class)
.excelType(ExcelTypeEnum.XLSX)
.sheet("测试数据")
.doWrite(userDtos);
return new ResponseResult(200,"导出成功");
}
每行代码的作用我都打了注释,方便大家理解
2.我们直接看最终结果
具体业务需要根据我们项目的实际需求,我这里只是做一个大概的演示噢