<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
import lombok.Data;
@Data
public class StaffExcelRequest {
/**
* * 员工姓名
*/
private String name;
/**
* * 工号
*/
private String jobNumber;
/**
* * 职位名称
*/
private String jobTitle;
/**
* * 手机号
*/
private String mobile;
}
public class ExcelListener extends AnalysisEventListener<StaffExcelRequest> {private static final Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class);
/**
* 存储验证通过的数据
*/
@Getter
private List<StaffExcelRequest> list = new ArrayList<>();
/**
* 假如这个是一个 DAO,当然有业务逻辑这个也能够是一个 service。当然如果不必存储这个对象没用。*/
private StaffService staffService;
/**
* 返回谬误
*/
@Setter
@Getter
private List<Map<String,String>> maps = new ArrayList<Map<String,String>>();
private Map<String,String> map = new HashMap<>();
/**
* 头部占用的行数
*/
@Setter
public Integer headerInteger = 1;
public ExcelListener() {// 这里是 demo,所以轻易 new 一个。理论应用如果到了 spring, 请应用上面的有参构造函数}
/**
* 如果应用了 spring, 请应用这个构造方法。每次创立 Listener 的时候须要把 spring 治理的类传进来
*
* @param staffService
*/
public ExcelListener(StaffService staffService) {this.staffService = staffService;}
/**
* 这个每一条数据解析都会来调用
*
* @param data
* one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(StaffExcelRequest data, AnalysisContext context) {
// 开始计数, 以后是多少行
headerInteger++;
if (data.getName() == null || data.getName().equals("")) {map.put("code","400");
map.put("msg","第 ["+headerInteger+"] 行, 员工姓名不能为空");
maps.add(map);
return;
}
if (data.getJobNumber() == null || data.getJobNumber().equals("")) {map.put("code","400");
map.put("msg","第 ["+headerInteger+"] 行, 员工工号不能为空");
maps.add(map);
return;
}
LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
list.add(data);
}
/**
* 所有数据解析实现了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保留数据,确保最初遗留的数据也存储到数据库
saveData();
LOGGER.info("所有数据解析实现!");
}
/**
* 加上存储数据库
*/
private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", list.size());
List<Staff> staffCollection = new ArrayList<>();
for (StaffExcelRequest request : list) {
// 创立实体类, 用于保留数据
Staff entity = new Staff();
staff.setName(request.getName());
staffCollection.add(entity);
}
boolean b = staffService.saveBatch(staffCollection);
LOGGER.info("存储数据库胜利!"+b);
}
}
@PostMapping("/import")
// @RequiresPermissions("staff:import")
public BaseResultData importExcel(@RequestParam("file") MultipartFile file) throws IOException {
// 解决上传文件
if (file.isEmpty()) {return BaseResultData.ERROR(1,"上传失败,请抉择文件");
}
// 流导入
InputStream inputStream = file.getInputStream();
// 监听器
ExcelListener listener = new ExcelListener(staffService);
// 读取 excel
EasyExcel.read(inputStream, StaffExcelRequest.class,listener).sheet().doRead();
// 查看是否有异样
List<Map<String, String>> maps = listener.getMaps();
String temp = "";
if (maps.size() > 0) {for (Map<String, String> map : maps) {temp += map.get("msg")+"\n";
}
}
// 返回信息
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("success",listener.getList().size()+"");
hashMap.put("error",temp);
return BaseResultData.SUCCESS(hashMap);
}