本文直接以Spring-Boot项目为例,通过流的形式进行,方便大家理解。
在Spring-Boot项目中引入EasyExcel依赖,
com.alibaba
easyexcel
3.0.5
新建一个工具类
1.导入
代码如下:
/**
* 导入
*
* @param file Excel文件
* @param t 类型
* @param consumer 消费者
* @param capacity 最大容量
* @param headRowNumber 头行数
* @param 泛型
* @return
*/
public static boolean readExcel(MultipartFile file, Class t, Consumer> consumer, Integer capacity, Integer headRowNumber) {
try {
InputStream inputStream = file.getInputStream();
EasyExcel.read(inputStream, t, EasyExcelUtil.getListener(consumer, capacity)).sheet().headRowNumber(headRowNumber).doRead();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 自定义监听器
*
* @param consumer 消费者
* @param capacity list最大容量,即单次读取最大条数
* @param 自定义类型
* @return
*/
public static AnalysisEventListener getListener(Consumer> consumer, int capacity) {
return new AnalysisEventListener() {
private List list = new LinkedList<>();
@Override
public void invoke(T t, AnalysisContext context) {
list.add(t);
if (list.size() == capacity) {
accept();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
if (list.size() > 0) {
accept();
}
}
private void accept() {
consumer.accept(list);
list.clear();
}
};
}
使用时需要调用readExcel方法,传入对应参数,这里作为演示,代码都在controller层。代码如下:
@PostMapping("/readExcel")
@ResponseBody
public void readExcel(@RequestPart MultipartFile file) {
EasyExcelUtil.readExcel(file,User.class,consumer(),10,1);
}
public Consumer> consumer(){
return list->{
// 这里面是业务逻辑代码,根据实际使用情况编写。作为演示,这个做个遍历打印输出
list.forEach(System.out::println);
};
}
User实体类
@Data
public class User {
// @ExcelProperty 这个注解用来指定excel中的列
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
}
演示表格
使用测试接口工具进行测试演示结果如下:
2.导出
工具类代码:
/**
* 导出
*
* @param list 导出数据集合
* @param clazz 类型
* @param response HttpServletResponse
* @param fileName 文件名称
* @return
* @throws Exception
*/
public static Boolean writeExcel(List list, Class clazz, HttpServletResponse response, String fileName) throws Exception {
String file = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + file);
response.setCharacterEncoding("utf-8");
ServletOutputStream outputStream = response.getOutputStream();
try {
EasyExcel.write(outputStream, clazz).sheet().doWrite(list);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
outputStream.flush();
outputStream.close();
}
}
正常业务中的代码如下:
@GetMapping("/downloadExcel")
public void downloadExcel(HttpServletResponse response) throws Exception {
// 导出的文件名
String fileName="用户列表";
// 此处用来模拟正常业务中从数据库取出的数据
List list=new ArrayList<>();
for (int i=1;i<=10;i++){
User user = new User();
user.setName("用户"+i);
user.setAge(18+i);
list.add(user);
}
EasyExcelUtil.writeExcel(list,User.class,response,fileName);
}
controller层切记不要加@ResponseBody这个注解,注解不要使用@RestController
这两个注解会报错,返回的类型不一样
使用get请求,为了方便测试,可以直接在浏览器地址栏输入请求地址就能下载。测试结果如下
至此,使用EasyExcel完成导入导出。如有错误之处,欢迎各位指正。