记录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。
postman测试文件上传

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐