一款由阿里巴巴开源的java操作excel组件
步骤一:导入相关依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
步骤二:获取要导入的表的表头信息
如图,这里的表头就是一级分类和二级分类
步骤三:创建一个ExcelObjectData类,其中定义一级分类和二级分类成员变量
/**
package com.zj.exceleasydemo.com.zj.entity;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* 步骤三:创建与excel的映射类
*/
@Data
public class ExcelObjectData {
@ExcelProperty("一级分类")
private String levelOneTitle;
@ExcelProperty("二级分类")
private String levelTwoTitle;
}
注意:这里为了实现类中属性与excel表中头部标题信息相对应,需要在@ExcelProperty中进行映射指定
步骤四:
创建service以及其相关接口:
ExcelService.java接口增加接口方法
/**
* 批量导入
*
* @param inputStream 输入流
*/
void batchImport(InputStream inputStream);
ExcelServiceImpl.java类增加实现功能
/**
* 第四步:创建service层,主要用来获取excel中的数据
*/
@Service
public class ExcelServiceImpl implements ExcelService {
@Override
public void BatchPost(InputStream inputStream) {
EasyExcel.read(inputStream, ExcelObjectData.class,new ExcelDataListener())
.excelType(ExcelTypeEnum.XLS).sheet().doRead();
}
}
这里我们需要注意一下exceleasy给我们提供的这个read方法:
EasyExcel中的方法非常多,我们这里使用参数最多的一个方法:
public static ExcelReaderBuilder read(File file, Class head, ReadListener readListener)
这里的file就是我们从前端上传过来的文件,head就是我们之前写的java类与excel头部的映射类ExcelSubjectData.class,而readListener类是我们需要重点关注的一个对象:
我们创建一个监听器ExcelDataListener.java
/**
* easyExcel中最重要的一个类,在这里实现数据的加入和读取
*/
@Data
public class ExcelDataListener extends AnalysisEventListener<ExcelObjectData> {
/**
* 一行一行的进行数据的获取
* @param data
* @param context
*/
@Override
public void invoke(ExcelObjectData data, AnalysisContext context) {
System.out.println("开始获得一组数据");
String levelOneTitle = data.getLevelOneTitle();
System.out.print("levelOneTitle:"+levelOneTitle);
String levelTwoTitle = data.getLevelTwoTitle();
System.out.println(" levelTwoTitle:"+levelTwoTitle);
}
/**
* 当所有数据获取完以后,执行的方法
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("所有数据获取结束");
}
}
注意该监视器类不能被spring所托管,所以我们不能使用在该类中使用spring相关的功能或注解,官网的代码注释如下:
步骤五:完成Controller层
在步骤四中,已经完成了数据的读取,我们可以发现,将数据从excel中读取过后,数据的存储并不是在service中发生的,而是在listener中发生的,只不过service又间接调用了listener,实现了数据存储的逻辑。另外上面的数据存储用到的是mysql的mybatis-plus,这里就不给出代码了。另外关于上面service的逻辑部分请根据自己的开发实际来定,我们这里easyexcel主要是用来获取excel中的数据而已,对于数据的存储已经不属于easyexcel的范畴了
步骤六:ExcelController
@RestController
@RequestMapping("/excel")
public class ExcelController {
@Autowired
private ExcelService excelService;
@PostMapping("/post")
public String excelTest(@RequestParam("file") MultipartFile multipartFile){
try{
InputStream inputStream = multipartFile.getInputStream();
excelService.BatchPost(inputStream);
}catch(Exception e){
e.printStackTrace();
return "文件读取失败";
}
return "文件上传成功";
}
}package com.javaclimb.service.edu.controller.admin;
import com.javaclimb.service.base.result.R;
import com.javaclimb.service.base.result.ResultCodeEnum;
import com.javaclimb.service.edu.service.SubjectService;
import com.javaclimb.servicebase.exception.JavaclimbException;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
/**
* <p>
* 课程分类 前端控制器
* </p>
*
* @author javaclimb
* @since 2021-12-08
*/
@RestController
@RequestMapping("/admin/edu/subject")
@CrossOrigin
public class SubjectController {
@Resource
private SubjectService subjectService;
@ApiOperation("excel批量导入课程分类")
@PostMapping("/import")
public R batchImport(@ApiParam(value = "Excel文件",required = true) @RequestParam("file")MultipartFile file){
try {
InputStream inputStream = file.getInputStream();
subjectService.batchImport(inputStream);
return R.ok().message("批量导入成功");
} catch (IOException e) {
throw new JavaclimbException(ResultCodeEnum.EXCEL_DATA_IMPORT_ERROR);
}
}
}
步骤六:调用api测试
api调用没有问题,我们在看看控制台的打印:
测试成功