1、controller
@PostMapping("/importExcel") public SvResult<AdminBatchImportUploadResultVo> importExcel(@RequestParam("file") MultipartFile file, AdminBaseReqParam req, @RequestParam(value = "productType", defaultValue = "0") Integer productType) { return batchImportService.upload(file, productType, req); }
2、解析文件
private List<BatchImportLineData> parseExcel(MultipartFile file) { List<BatchImportLineData> list = new ArrayList<>(); try { EasyExcel.read(file.getInputStream(), BatchImportLineData.class, new ImportExcelListener<BatchImportLineData>(dataList -> { list.addAll(dataList); }, BATCH_COUNT)).sheet().doRead(); } catch (DecorateException e) { throw e; } catch (IOException e) { log.error("excel解析异常,", e); throw new DecorateException(SvResultEnum.CLIENT_ERROR, "excel解析异常,请检查文件格式"); } return list; }
3、excel解析listner
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.read.listener.PageReadListener;
import com.jd.rcloud.common.enu.SvResultEnum;
import com.jd.rcloud.common.exception.DecorateException;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.function.Consumer;
@Slf4j public class ImportExcelListener<T> extends PageReadListener<T> { public ImportExcelListener(Consumer<List<T>> consumer) { super(consumer); } public ImportExcelListener(Consumer<List<T>> consumer, int batchCount) { super(consumer, batchCount); } @Override public void onException(Exception exception, AnalysisContext context) { String errorMsg = String.format("%s, 第%d行解析异常", context.readSheetHolder().getReadSheet().getSheetName(), context.readRowHolder().getRowIndex() + 1); if (exception instanceof ExcelDataConvertException) { ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception; errorMsg = String.format("第%d行,第%d列数据解析异常", excelDataConvertException.getRowIndex() + 1, excelDataConvertException.getColumnIndex() + 1); } else { log.error(errorMsg + ";" + exception.getMessage()); } throw new DecorateException(SvResultEnum.CLIENT_ERROR, errorMsg); } }
4、新建一个类
@Data public class BatchImportLineData { @ExcelProperty("商品编码") private Long skuId; @ExcelProperty("序号") private Long index; }
5、jar包
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.2.1</version> </dependency>