需求
上传一个excel,读取所有sheet的内容,并根据每个sheet的命名处理其对应的数据
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
每行数据对应的实体类
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ToString
public class RecordImportBean {
/**
* 一个对象要么只用index,要么只用name去匹配
*/
@ExcelProperty(index = 0)
private String name;
// /**
// * 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
// */
// @ExcelProperty(value = "名称")
// private String name;
@ExcelProperty(index = 1)
private BigDecimal number;
@ExcelProperty(index = 2)
private Date createTime;
@ExcelProperty(index = 3)
private String script;
}
读取监听器
/**
* 自定义监听器
*/
class CustomExcelListener extends AnalysisEventListener<RecordImportBean> {
private List<RecordImportBean> dataList = new ArrayList<>();
@Override
public void invoke(RecordImportBean recordImportBean, AnalysisContext analysisContext) {
dataList.add(recordImportBean);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 在这里处理完所有数据后的逻辑,如果不需要可以删除
}
public List<RecordImportBean> getDataList() {
return dataList;
}
}
Controller
@PostMapping("importFromExcel")
@ApiOperation(value = "从excel导入", notes = "")
public Result importFromExcel(@RequestParam("file") MultipartFile file) {
return tRecordService.importFromExcel(file);
}
Service实现
@Override
public Result importFromExcel(MultipartFile file) {
try {
InputStream fileInputStream = file.getInputStream();
// 读取Excel文件
ExcelReaderBuilder readerBuilder = EasyExcel.read(fileInputStream);
ExcelReader excelReader = readerBuilder.build();
ExcelReadExecutor excelReadExecutor = excelReader.excelExecutor();
List<ReadSheet> sheets = excelReadExecutor.sheetList();
//读取到的数据
Map<String, List<RecordImportBean>> sheetData = new HashMap<>();
for (ReadSheet sheet : sheets) {
CustomExcelListener listener = new CustomExcelListener();
ReadSheet readSheet1 = EasyExcel.readSheet(sheet.getSheetNo()).head(RecordImportBean.class).registerReadListener(listener).build();
excelReader.read(readSheet1);
// 得到sheet名称和其对应的数据
sheetData.put(sheet.getSheetName(), listener.getDataList());
}
return ResultTool.success();
} catch (IOException e) {
e.printStackTrace();
log.error("导入数据出错:"+e.getMessage());
return ResultTool.fail();
}
}