# EasyExcel 上传(导入) 以人口(Population)导入为例: 1. 包含 **Excel实体类**、**错误实体类**、**导入监听器**,其中 **错误实体类** 非必须。 2. 如果不需要返回错误,可忽略输出错误文件的代码。 ## Excel实体类 ```java import com.alibaba.excel.annotation.ExcelProperty; public class PopulationExcel { @ExcelProperty(index = 0) private String name; @ExcelProperty(index = 1) private String idCard; @ExcelProperty(index = 2) private String areaCode; @ExcelProperty(index = 3) private String homeAddress; // get set } ``` ## 错误试题类 ```java import com.alibaba.excel.annotation.ExcelProperty; public class PopulationExcelError { @ExcelProperty(index = 0) private String name; @ExcelProperty(index = 1) private String idCard; @ExcelProperty(index = 2) private String areaCode; @ExcelProperty(index = 3) private String homeAddress; @ExcelProperty(index = 4) private String reason; // get set } ``` ## 监听器 ```java import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import java.util.ArrayList; import java.util.List; public abstract class PopulationExcelListener extends AnalysisEventListener { private static final Integer MAX_READ_COUNT = 100; private List populationExcels = new ArrayList<>(); @Override public void invoke(PopulationExcel populationExcel, AnalysisContext analysisContext) { if (populationExcels.size() > MAX_READ_COUNT) { // 超过读取最大量,执行保存, handle(populationExcels); populationExcels.clear(); } else { // 未达到读取最大量,继续读取 populationExcels.add(populationExcel); } } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { handle(populationExcels); populationExcels.clear(); } /** * 处理 * * @param rows */ public abstract void handle(List rows); } ``` ## 导入代码 ### controller 层 ```java @ApiOperation(value = "试题Excel", notes = "试题Excel接口") @ApiImplicitParams({ @ApiImplicitParam(name = "excel", value = "文件名称", paramType = "form"), }) @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("import-excel") public UploadExcelResultDTO importExcel(MultipartFile excel) throws IOException { if (Objects.isNull(excel)) { throw new ParamsException("Excel不能为空"); } // 判断后缀 if (!excel.getOriginalFilename().endsWith(IFileConstant.EXCEL_SUFFIX_XLS) && !excel.getOriginalFilename().endsWith(IFileConstant.EXCEL_SUFFIX_XLSX)) { throw new ParamsException("文件格式为Excel"); } return populationService.importExcel(excel); } ``` ### service 层 ```java @Override public UploadExcelResultDTO importExcel(MultipartFile excel) throws IOException { // 要输出的错误内容 List populationExcelErrors = new ArrayList<>(); long startTime = System.currentTimeMillis(); // 读取 Excel EasyExcel.read(excel.getInputStream(), PopulationExcel.class, new PopulationExcelListener() { @Override public void handle(List populationExcels) { // 这里处理数据,一般是入库 } }).headRowNumber(2).sheet().doRead(); long endTime = System.currentTimeMillis(); // 生成的错误文件ID,下载时使用 String excelFileId = null; if (populationExcelErrors.size() > 0) { excelFileId = new AbstractErrorExcelHandler(fileService) { @Override public List> excelHeaderNames() { // 构建错误 Excel 标题,与错误类对应 return simpleExcelHeader(new String[]{"序号", "姓名", "身份证", "错误原因"}); } }.saveErrorExcel(populationExcelErrors); } // 返回实体类, return new UploadExcelResultDTO(populationExcelErrors.size(), endTime - startTime, excelFileId); } ``` ## 模板下载接口 ```java @GetMapping("upload/upload-excel-template") public void excelTemplate(HttpServletResponse response) throws IOException { InputStream inputStream = PopulationRouteController.class.getClassLoader().getResourceAsStream("templates/population/upload/upload-excel-template.xls"); RequestUtil.download(response, inputStream, "人口导入模板.xls"); } ``` ## 列表导入按钮 ```html ``` ## 列表导入事件 ```javascript $(document).on('click', '#uploadExcel', function() { top.dialog.open({ url: top.restAjax.path('route/population/upload/upload-excel', []), title: '导入人口数据', width: '300px', height: '196px', onClose: function() { reloadTable(); } }); }); ``` ## 导入页面代码 ```html
下载“下载模板”整理数据,点击“导入数据”上传,格式为xls或xlsx
```