使用easyexcel 导入excel表格
1. 添加依赖pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
2. 创建接收的实体类
import lombok.Data;
@Data
public 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);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。