pom依賴,easyexcel是必須的,lombok非必須,它可以在實體類上使用@Data注釋,無需生成get、set方法
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
實體類
public class Province {
@ExcelProperty(index = 0)
private Long provinceId;
@ExcelProperty(index = 1)
private String provinceName;
@ExcelProperty(index = 2)
private Long cityId;
@ExcelProperty(index = 3)
private String cityName;
public Long getCityId() {
return cityId;
}
public void setCityId(Long cityId) {
this.cityId = cityId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public Long getProvinceId() {
return provinceId;
}
public void setProvinceId(Long provinceId) {
this.provinceId = provinceId;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
}
excel監聽器(需注意的是,要將dao傳入進去,也就是每一個監聽器只操作一種類型的
/**
* 使用EasyExcel處理excel文件
* @Version 1.0.0
* @Description
*/
public class ProvinceExcelListener extends AnalysisEventListener<Province> {
private ProvinceMapper provinceMapper;
/**
* 批處理閾值
*/
private static final int BATCH_COUNT = 1000;
List<Province> list = new ArrayList<Province>(BATCH_COUNT); //存放數據
public ProvinceExcelListener(ProvinceMapper provinceMapper){
this.provinceMapper = provinceMapper;
}
@Override
public void invoke(Province province, AnalysisContext context) {
list.add(province);
//內存存放超過多少條數據,則先存放到數據庫中;保存完后,清空內存
if(list.size() >= BATCH_COUNT){
long beforeTime = System.currentTimeMillis();
saveData();
list.clear();//清空內存
System.out.println("處理1000數據所需的時間:"+(System.currentTimeMillis()-beforeTime));
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveData();//解析完成后需要調用一次,不大於BATCH_COUNT就沒處理
}
/**
* 保存數據
*/
private void saveData(){
for(Province province : list){
provinceMapper.add(province);
}
}
}
測試類
@Test
void contextLoads()throws Exception {
String fileName = "C:/Users/zwk/Desktop/工作簿1.xlsx";
long beforeTime = System.currentTimeMillis();
EasyExcel.read(fileName,Province.class,new ProvinceExcelListener(provinceMapper)).sheet().doRead();
System.out.println("讀取數據所花的時間:"+(System.currentTimeMillis()-beforeTime)+"毫秒");
}
注:空的也能讀取,不用特殊處理