导入和导出方法类型,但导入需要定义一个工具类继承AnalysisEventListener监听器
一、引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
二、编写ExcelUtil
/**
* Excel表格工具类
*/
@Slf4j
public class ExcelUtil {
//-------------------------------------------------------------- 导入文件解析监听类 start ----------------------------------------------------
/**
* 读取文件解析监听类
* @param <T>
*/
public static class ExcelListener<T> extends AnalysisEventListener<T> {
/**
* 存放读取后的数据
*/
public List<T> datas = new ArrayList<>();
/**
* 逐条读取数据
*/
@Override
public void invoke(T t, AnalysisContext analysisContext) {
datas.add(t);
}
/**
* 解析读取数据总条数
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
log.info("读取数据条数:{}条!", datas.size());
}
public List<T> getDatas() {
return this.datas;
}
}
/**
* 读取Excel表格返回数据集合,默认读取第一个sheet表数据
* @param inputStream 输入流
* @param tClass 数据映射类
* @param excelListener 读取监听类
* @param <T> 泛型
* @return List结果集
*/
public static <T> List<T> readExcel(InputStream inputStream, Class<T> tClass, ExcelListener<T> excelListener) {
if (inputStream == null || tClass == null || excelListener == null) {
return null;
}
ExcelReaderBuilder read = EasyExcel.read(inputStream, tClass, excelListener);
read.sheet().doRead();
return excelListener.getDatas();
}
/**
* 读取Excel表格返回数据集合,设置读取第几个sheet表数据
* @param inputStream 输入流
* @param sheetNo 第X个sheet表
* @param tClass 数据映射类
* @param excelListener 读取监听类
* @param <T> 泛型
* @return List结果集
*/
public static <T> List<T> readExcel(InputStream inputStream, Integer sheetNo, Class<T> tClass, ExcelListener<T> excelListener) {
if (inputStream == null || tClass == null || excelListener == null) {
return null;
}
ExcelReaderBuilder read = EasyExcel.read(inputStream, tClass, excelListener);
if (sheetNo != null) {
read.sheet(sheetNo).doRead();
} else {
ExcelReader excelReader = read.build();
excelReader.readAll();
excelReader.finish();
}
return excelListener.getDatas();
}
//-------------------------------------------------------------- 导入文件解析监听类 end ----------------------------------------------------
}
三、编写接收层controller
RequestParam对应的参数请求类型content-type,可理解为媒体类型,比如文件的上传和下载,spring中专门有个支持的类MultipartFile来支持这种请求。
@PostMapping("/import")
public void import(@RequestParam(value = "file") MultipartFile file) {
service.import(file);
}
四、在serviceImpl里调用工具类读取表格数据
@Override
public void import(MultipartFile file) throws IOException {
//读取上传文件数据转换成
List<Export> list = ExcelUtil.readExcel(file.getInputStream(), 1, Export.class, new ExcelUtil.ExcelListener<>());
// 拿到list后发送给mapper层存入数据库
Mapper.insertImport(list);
}
service层和mapper层省略不写,获取list之后按照批量存入数据库方法写入数据库内
五、在postman中进行导入测试
选择File类型,上传需要导入的文件