应用easyexcel 导入excel表格
1. 增加依赖pom.xml
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version></dependency>
2. 创立接管的实体类
import lombok.Data;@Datapublic class StaffExcelRequest { /** * * 员工姓名 */ private String name; /** * * 工号 */ private String jobNumber; /** * * 职位名称 */ private String jobTitle; /** * * 手机号 */ private String mobile;}
3. 创立监听事件
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); }}
4. 创立controller
@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);}