记录Java接口上传Excel文件,及使用阿里的easyExcel读取excel文件内容,进行内容校验的过程。文中贴出代码是精简后代码,仅供参考。
引入依赖
在pom.xml中引入easyExcel需要的依赖,具体参考官网:EasyExcel文档
上传文件及读取数据
1.接口API
/*** 文件上传接口* @param fileUploadQuery* @return*/@CrossOrigin@PostMapping("/uploadExcelFile")ImportVO uploadExcelFile(@Valid @ModelAttribute FileUploadQuery fileUploadQuery);
参数FileUploadQuery,若未使用lombok,需手动加上get、set等方法。
import lombok.Data;@Data
public class FileUploadQuery {/**ID*/private Integer Id;/**name*/private String name;
}
注返回数据类型可根据自己需要自定义。
2.controller
/*** 文件上传接口* @param fileUploadQuery* @return*/@Overridepublic ImportVO uploadExcelFile(@Valid @ModelAttribute FileUploadQuery fileUploadQuery) {return settingService.uploadExcelFile(fileUploadQuery);}
3.service
MultipartFile 是spring的一个类型,可参考MultipartFile上传文件的几种场景
文件上传详细可参考:Spring中MultipartHttpServletRequest实现文件上传
/*** 文件上传接口* @param fileUploadQuery {参数相关信息}* @return*/public ImportVO uploadExcelFile(FileUploadQuery fileUploadQuery) {ImportVO vo = new ImportVO();List<String> context = new ArrayList<>();// 读取文件信息MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;MultipartFile file = multipartRequest.getFile("file");// 如果附件为空,则结束if (file == null || file.isEmpty()) {throw new BizException(2, "文件不允许为空!");}// 存储文件流InputStream fileName = null;try {fileName = file.getInputStream();} catch (Exception e) {log.error("uploadExcelFile Error. Error is {}", e);}// 该监听将excel文件一行一行读入内存(必须有)ExcelListener listener = new ExcelListener();ExcelReader excelReader = EasyExcel.read(fileName, ExcelModel.class,listener).build();ReadSheet readSheet = EasyExcel.readSheet(0).build();excelReader.read(readSheet);// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的excelReader.finish();// readList 文件中的数据,不包括表头List<ExcelModel> readList = listener.getList();// 校验上传文件,校验函数可以自定义,此处不多加描述List<String> lengthResult = checkIdLength(readList);if (lengthResult.size() > 0) {context.addAll(lengthResult);}// 如果没有报错信息,说明校验通过if (context.size() < 1) {context.add("校验成功");}vo.setContext(context);return vo;}
4.easyExcel读文件
文件模板
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class ExcelModel {/** ID */@ExcelProperty(value = "ID", index = 0)private Integer ID;/** 姓名 */@ExcelProperty(value = "姓名", index = 1)private String name;/** 姓名,如果index这样设置会跳过第三列 */@ExcelProperty(value = "姓名", index = 3)private String name;}
文件监听
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.ArrayList;
import java.util.List;public class ExcelListener extends AnalysisEventListener<ExcelModel> {/*** 批处理阈值,正式环境通常为2000*/private static final int BATCH_COUNT = 1000;/** ExcelModel表格列属性模板 */private List<ExcelModel> list = new ArrayList<>(BATCH_COUNT);private Logger logger = LoggerFactory.getLogger("日志");/*** 每解析到一条数据,执行一次invoke()方法* @param data* @param context*/@Overridepublic void invoke(ExcelModel data, AnalysisContext context) {logger.info("解析到一条数据:{}", JSON.toJSONString(data));list.add(data);if (list.size() >= BATCH_COUNT) {list.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {logger.info("共有{}条Id数据存入list", list.size());}// 用于获取文件内容列表public List<ExcelModel> getList() {return list;}
}
测试
使用postman测试(body–>form-data),其中file属性的类型选择为file。