一 创建监听器:
package pro.tjkj.docaudiovisualres.util;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import pro.tjkj.docaudiovisualres.service.ExcelImportService;
import pro.tjkj.docaudiovisualres.service.TemplateService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 导入Excel文件监听器
* @author gaojie
* @since 2022-06-21
*/
public class ImportExcelListener extends AnalysisEventListener<Map<Integer, String>> {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private ExcelImportService excelImportService;
//文件类型
private Long fileType;
//文件夹id
private Long folderId;
//错误信息集合
private List<String> errMessageList;
private MultipartFile file;
//表头
private List<Map<Integer, Map<Integer, String>>> headList;
//保存解析到的结果
private List<Map<Integer, Map<Integer, String>>> list;
//用户id
private Long UserId;
public ImportExcelListener(Long fileType, Long folderId, Long userId,ExcelImportService excelImportService,MultipartFile file){
this.fileType = fileType;
this.folderId = folderId;
this.excelImportService = excelImportService;
this.file=file;
this.UserId=userId;
headList = new ArrayList<>();
list = new ArrayList<>();
errMessageList = new ArrayList<>();
}
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
//logger.info("解析到一条头数据:{}, currentRowHolder: {}", headMap.toString(), context.readRowHolder().getRowIndex());
Map<Integer, Map<Integer, String>> map = new HashMap<>();
map.put(context.readRowHolder().getRowIndex(), headMap);
headList.add(map);
}
@Override
public void invoke(Map<Integer, String> data, AnalysisContext context) {
//logger.info("解析到一条数据:{}, currentRowIndex: {}----", data.toString(), context.readRowHolder().getRowIndex());
Map<Integer, Map<Integer, String>> map = new HashMap<>();
map.put(context.readRowHolder().getRowIndex(), data);
list.add(map);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
checkAndSaveData();
}
private void checkAndSaveData(){
errMessageList= excelImportService.checkAndSaveData(folderId,fileType,UserId,file,headList,list);
}
public void setErrMessageList(List<String> errMessageList){
this.errMessageList = errMessageList;
}
public List<String> getErrMessageList(){
return errMessageList;
}
}
二 导入的控制器
/**
* 批量导入数据
*/
@PostMapping(consumes = "multipart/form-data")
@ApiOperation("批量导入")
public RequestDataDTO<Object> importExcel(@ModelAttribute ImportTemplateDTO importTemplateDTO) {
return RequestDataDTO.buildSuccess(this.templateService.importExcel(importTemplateDTO));
}
三 批量导入的业务层
/**
* 批量导入
* @param