记录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
*/
@Override
public 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
*/
@Override
public void invoke(ExcelModel data, AnalysisContext context) {
logger.info("解析到一条数据:{}", JSON.toJSONString(data));
list.add(data);
if (list.size() >= BATCH_COUNT) {
list.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
logger.info("共有{}条Id数据存入list", list.size());
}
// 用于获取文件内容列表
public List<ExcelModel> getList() {
return list;
}
}
测试
使用postman测试(body–>form-data),其中file属性的类型选择为file。