EasyExcel導入 基礎用法
上次寫道EasyExcel的導出功能,現在再來了解下它的導入功能
導入依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
1、創建實體類
創建一個和需要導入數據的 excel 對應的實體類
利用提供的 @ExcelProperty
注解中的 converter
屬性引入轉換器
/**
* @Author: tt
* @Date: 2020/12/18 14:40
* @Description: TODO
* @Version: 1.0
*/
@Data
public class Jobdata {
private String name;
private String titleLevel;
private Date createDate;
//Boolean 類型轉換器
@ExcelProperty(value="是否啟用", converter = CustomBooleanConverterImport.class)
private Boolean enabled;
}
2、編寫 Boolean 類型轉換器
public class CustomBooleanConverterImport implements Converter<Boolean> {
@Override
public Class supportJavaTypeKey() {
return null;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return null;
}
//轉換邏輯寫在這里
@Override
public Boolean convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
Boolean b = false;
if (cellData.getStringValue().equals("是")){
b=true;
}
return b;
}
@Override
public CellData convertToExcelData(Boolean value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return null;
}
}
3、調用下載
public void importJob(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), Jobdata.class, new UploadDataListener(jobLevelMapper)).sheet().doRead();
}
4、編寫監聽器 寫入規則
@Slf4j
public class UploadDataListener extends AnalysisEventListener<Jobdata> {
/**
* 每隔5條存儲數據庫,實際使用中可以3000條,然后清理list ,方便內存回收
*/
private static final int BATCH_COUNT = 5;
List<Jobdata> list = new ArrayList<Jobdata>();
/**
* 假設這個是一個DAO,當然有業務邏輯這個也可以是一個service。當然如果不用存儲這個對象沒用。
*/
private JobLevelMapper jobLevelMapper;
/**
* 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來
*
* @param jobLevelMapper
*/
public UploadDataListener(JobLevelMapper jobLevelMapper) {
this.jobLevelMapper = jobLevelMapper;
}
/**
* 這個每一條數據解析都會來調用
*
* @param data
* one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(Jobdata data, AnalysisContext context) {
// log.info("解析到一條數據:{}", JSON.toJSONString(data));
list.add(data);
// 達到BATCH_COUNT了,需要去存儲一次數據庫,防止數據幾萬條數據在內存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
// 存儲完成清理 list
list.clear();
}
}
/**
* 所有數據解析完成了 都會來調用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 這里也要保存數據,確保最后遺留的數據也存儲到數據庫
saveData();
}
/**
* 加上存儲數據庫
*/
private void saveData() {
log.info("{}條數據,開始存儲數據庫!", list.size());
jobLevelMapper.save(list);
log.info("存儲數據庫成功!");
}
}