使用EasyExcel上传Excel文件,并把数据保存到数据库中

导入阿里巴巴EasyExcel的maven依赖

<dependencies>
	<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>easyexcel</artifactId>
		<version>2.1.1</version>
	</dependency>
</dependencies>

编写Controller,接收前台传来的Excel文件数据

@Autowired
private SubjectService subjectService;

@PostMapping("/upload/excel")
public RE<String> uploadExcel(MultipartFile file) {
	
	RE<String> re = subjectService.saveSubject(file, subjectService);
	return re;
	
}

编写Service

@Override
public RE<String> saveSubject(MultipartFile file,SubjectService subjectService) {
	
	try {
		// EasyExcel读取文件,SubjectData是对应的Excel实体类,SubjectExcelListener是文件读取监听器
		EasyExcel.read(file.getInputStream(),SubjectData.class,new SubjectExcelListener(subjectService)).sheet().doRead();
		return RE.successWithoutData();
	} catch (Exception e) {
		return RE.failed(e.getMessage());
	}
	
}

编写Excel对应的实体类

@Data
public class SubjectData {
	// Excel是2级目录,所以是两个属性,index代表索引,0表示一级分类,1表示二级分类
	// 也就是说,twoSubjectName是oneSubjectName子目录
	@ExcelProperty(index = 0)
	private String oneSubjectName;

	@ExcelProperty(index = 1)
	private String twoSubjectName;
}

编写阅读监听类,Excel文件的读操作,是通过此监听类实现的,EasyExcel是一行一行的读取文件,所以要把每一次读取的数据保存到数据库中,为了避免重复,保存之前会判断是否存在相同的数据。

package com.china.edu.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.china.edu.entity.Subject;
import com.china.edu.entity.SubjectData;
import com.china.edu.service.SubjectService;

// 继承AnalysisEventListener类,实现阅读,泛型为对应的Excel实体类
public class SubjectExcelListener extends AnalysisEventListener<SubjectData>{
	
	// 因为最终保存数据库的操作是在本类中实现,所以要添加一个属性,使用SubjectService里的CRUD方法
	public SubjectService subjectService;
	
	// 无参构造
	public SubjectExcelListener() {}
	
	// 有参构造
	public SubjectExcelListener(SubjectService subjectService) {
		this.subjectService = subjectService;
	}
	
	@Override
	public void invoke(SubjectData data, AnalysisContext context) {
		
		/* invoke每次读取一行数据,所以每次处理一条数据,数据包括一级分类和二级分类
		 * 先判断一级分类是否存在,不存在则添加一级分类,然后获取一级分类的id值,继续
		 * 判断二级分类,不存在则添加二级分类
		 * 
		 * */
		
		Subject subject = this.existOneSubject(subjectService, data.getOneSubjectName());
		if(subject == null) {
			// 不存在一级分类则添加
			subject = new Subject();
			subject.setTitle(data.getOneSubjectName());
			subject.setParentId("0");
			subjectService.save(subject);
		}
		// 获取subject的id
		// 注意这里的subject.getId();如果上面查出是空值,这里获取就是空指
		// 所以要确保subject被赋值
		String pid = subject.getId();
		Subject subject2 = this.existTwoSubject(subjectService, data.getTwoSubjectName(), pid);
		if(subject2 == null) {
			// 不存在二级分类则添加
			subject2 = new Subject();
			subject2.setTitle(data.getTwoSubjectName());
			subject2.setParentId(pid);
			subjectService.save(subject2);
		}
	}
	
	// 判断一级分类是否存在的方法
	private Subject existOneSubject(SubjectService subjectService,String name) {
		// 使用QueryWrapper构建查询条件
		QueryWrapper<Subject> wrapper = new QueryWrapper<>();
		wrapper.eq("title", name);
		wrapper.eq("parent_id", "0");
		Subject subject = subjectService.getOne(wrapper);
		return subject;
		
	}
	
	// 判断二级分类是否存在的方法
	private Subject existTwoSubject(SubjectService subjectService,String name,String pid) {
		// 使用QueryWrapper构建查询条件
		QueryWrapper<Subject> wrapper = new QueryWrapper<>();
		wrapper.eq("title", name);
		wrapper.eq("parent_id", pid);
		Subject subject = subjectService.getOne(wrapper);
		return subject;
		
	}
	
	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
		// TODO Auto-generated method stub
		
	}
}





以上监听类执行数据库的操作。先调用Service,Service再调用监听类,实现了Excel文件的上传。

你可能感兴趣的:(JAVA)