1. 依赖引入:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
2. excel映射实体类:
@Data
public class ExcelHeader implements Serializable {
@ExcelProperty(value = "字段1")
private String field1;
@ExcelIgnore
private String field2;
}
(1)@ExcelProperty可以指定列位置,也可以指定列的名称;
(2)对于不需要映射的字段,使用@ExcelIgnore注解
3. 监听器:
public class TestExcelListener extends AnalysisEventListener<ExcelHeader> {
private ExcelReader reader;
//装载解析的结果
List<ExcelHeader> internalAccounts = new ArrayList<>(100);
public TestExcelListener(InputStream inputStream) {
this.reader = EasyExcelFactory.read()
.autoCloseStream(true)
.autoTrim(true)
.registerReadListener(this)
.head(ExcelHeader.class)
.file(inputStream)
.ignoreEmptyRow(true)
.headRowNumber(7)
.build();
this.reader.read(new ReadSheet(0));
}
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
if (MapUtils.isEmpty(headMap)) {
throw new ExcelAnalysisException("未找到列");
}
}
@Override
public void invoke(ExcelHeader data, AnalysisContext context) {
internalAccounts.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
public List<ExcelHeader> closeAndGetData() {
reader.finish();
return internalAccounts;
}
}
4. controller调用:
@RestController
@RequestMapping("/api/excel")
public class ExcelParseController {
@PostMapping(value = "/parse", produces = MediaType.APPLICATION_JSON_VALUE)
public List<ExcelHeader>spvFileUpload(@RequestParam("file") MultipartFile file) throws Exception{
TestExcelListener listener = new TestExcelListener(file.getInputStream());
List<ExcelHeader> internalAccounts = listener.closeAndGetData();
return internalAccounts;
}
}