- 引入包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
- 新建和excel内容一致的bean
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
public class SerialEntity {
@ExcelIgnore
private Integer id;
/**
* 序号
*/
@ExcelProperty(value = "序号",index = 0)
private String no;
/**
* BarCode
* */
@ExcelProperty(value = "BarCode",index = 1)
private String serialNo;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getSerialNo() {
return serialNo;
}
public void setSerialNo(String serialNo) {
this.serialNo = serialNo;
}
}
3. 导入
这里的50代表内存中我只存50条数据,达到50条就登录到数据库,然后释放掉,当然根据性能要求可以改带一点,但是不能无限大,如果excel内容有几百万条,全部读取到内存中再操作肯定会崩溃
public void saveSerialNo(MultipartFile file) throws Exception {
EasyExcel.read(file.getInputStream(), SerialEntity.class, new AnalysisEventListener<SerialEntity>() {
/**
* 批处理阈值,作用:减轻数据库的压力
*/
private static final int BATCH_COUNT = 50;
/**
* 存储员工对象
*/
List<ESerial> eSerialsList = new ArrayList<>(BATCH_COUNT);
//easyExcel每次从Excel中读取一行数据就会调用一次invoke方法
@Override
public void invoke(SerialEntity serialEntity, AnalysisContext analysisContext) {
ESerial eSerial = new ESerial();
eSerial.preInsert();
eSerial.setUseCount(0);
eSerial.setBarcode(serialEntity.getSerialNo());
eSerialsList.add(eSerial);
if (eSerialsList.size() >= BATCH_COUNT) {
eSerialService.saveOrUpdateState(eSerialsList);
eSerialsList.clear();
}
}
//easyExcel在将Excel表中数据读取完毕后,最终执行此方法
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//最后,如果size<BATCH_COUNT就在这里进行数据的处理
if (eSerialsList.size() > 0) {
eSerialService.saveOrUpdateState(eSerialsList);
}
}
}).sheet().doRead();//sheet()参数指定,默认读取第一张工作表
}