首先导入easyExcel依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
service层实现类的方法
@Override
public String importUser(MultipartFile file) {
try (InputStream inputStream = file.getInputStream()) {
// 创建临时文件
File tempFile = createTempFile(file);
// 读取Excel数据
List<LunchDataMultiSheetListener> listenerList = readExcelData(tempFile);
// 处理Excel数据
handleExcelData(listenerList);
return "success";
} catch (IOException e) {
e.printStackTrace();
return "error";
}
}
/**
* 创建临时文件
*/
private File createTempFile(MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();
String[] filename = originalFilename.split("\\.");
File tempFile = File.createTempFile(filename[0], "." + filename[1] + ".");
file.transferTo(tempFile);
tempFile.deleteOnExit();
return tempFile;
}
/**
* 读取Excel数据
*/
private List<LunchDataMultiSheetListener> readExcelData(File file) {
ExcelReader excelReader = EasyExcel.read(file).build();
List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();
List<LunchDataMultiSheetListener> listenerList = sheets.stream()
.map(sheet -> {
LunchDataMultiSheetListener listener = new LunchDataMultiSheetListener();
ReadSheet readSheet = EasyExcel.readSheet(sheet.getSheetNo()).registerReadListener(listener).build();
excelReader.read(readSheet);
List<List<String>> dataList = listener.getDataList();
return listener;
})
.collect(Collectors.toList());
excelReader.finish();
return listenerList;
}
private void handleExcelData(List<LunchDataMultiSheetListener> listenerList, Long projectId) {
listenerList.forEach(listener -> listener.getDataList().forEach(lineData -> {
System.out.println("lineData = " + lineData);
// 其它业务处理。。
}));
});
}
}
重点来了,那就是easyexcel要使用的监听器
@Slf4j
@Data
public class LunchDataMultiSheetListener extends AnalysisEventListener<Map<Integer, String>> {
private List<List<String>> dataList;
public LunchDataMultiSheetListener() {
this.dataList = new ArrayList<>();
}
/**
* 每读到一行数据都调用invoke方法
*
* @param integerObjectMap
* @param context
*/
@Override
public void invoke(Map<Integer, String> integerObjectMap, AnalysisContext context) {
Integer rowIndex = context.readRowHolder().getRowIndex();
System.out.println("rowIndex = " + rowIndex);
// key为列号,value为单元格的内容
log.info("解析到数据:{}", integerObjectMap);
// 获取当前解析的sheet的信息
String sheetName = context.readSheetHolder().getSheetName();
// Integer sheetIndex = context.readSheetHolder().getSheetNo();
// System.out.println("当前解析的sheet名称:" + sheetName);
// System.out.println("当前解析的sheet索引:" + sheetIndex);
// 把数据放到dataList里面,便于统一处理
LinkedList<String> strings = new LinkedList<>();
integerObjectMap.forEach((k, v) -> {
strings.add(v);
});
this.dataList.add(strings);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 读完所有数据,做统一处理。
// 当然还可以拿到listener之外处理
log.info("数据读取完成");
}
}
核心完成了
你可以根据监听器中的map分别处理每一个sheet中的数据