1、特点
- Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
- EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
- EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。
2、导入实验物品实现步骤
2.1 导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
2.2 创建实体类
用于设置excel表头,index=0表示第一列
@Data
public class ObjectData {
@ExcelProperty(index = 0)
@ApiModelProperty(value = "物品名称")
private String name;
@ExcelProperty(index = 1)
@ApiModelProperty(value = "厂商")
private String manufacturer;
@ExcelProperty(index = 2)
@ApiModelProperty(value = "单位")
private String unit;
@ExcelProperty(index = 3)
@ApiModelProperty(value = "库存")
private String stock;
@ExcelProperty(index = 4)
@ApiModelProperty(value = "物品类别名称")
private String label;
@ExcelProperty(index = 5)
@ApiModelProperty(value = "损坏数量")
private String damage;
@ExcelProperty(index = 6)
@ApiModelProperty(value = "备注")
private String ps;
}
2.3 创建读取的监听器
把excel的数据存放到数据库
public class ObjectExcelListener extends AnalysisEventListener<ObjectData> {
public ObjectService objectService;
public ObjectExcelListener(){}
public ObjectExcelListener(ObjectService objectService){
this.objectService=objectService;
}
//一行一行去读取excel内容
@Override
public void invoke(ObjectData objectData, AnalysisContext analysisContext) {
if(objectData==null){
throw new ZykException(20001,"添加失败");
}
Object object=new Object();
//把第一个参数的值复制到第二个参数(springboot自带的方法)
BeanUtils.copyProperties(objectData, object);
objectService.save(object);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
2.4 controller层
@ApiOperation(value = "Excel的批量导入")
@PostMapping("addObject")
public R addObject(MultipartFile file){
//1 获取上传的excel文件 MultipartFile
//返回错误提示信息
objectService.importObjectData(file,objectService);
return R.ok();
}
2.5 service层
@Service
public class ObjectServiceImpl extends ServiceImpl<ObjectMapper, Object> implements ObjectService {
@Override
public void importObjectData(MultipartFile file, ObjectService objectService) {
try {
InputStream inputStream = file.getInputStream();
// 这里 需要指定读用哪个class去读以及监听器,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(inputStream, ObjectData.class,new ObjectExcelListener(objectService)).sheet().doRead();
} catch (IOException e) {
e.printStackTrace();
}
}
}