一、指定行寫入方式
//創建對應的excel對象 ExcelWriter excelWriter = EasyExcel.write(fileName).build(); //寫入方式一:從指定行開始寫入,後續行逐行寫入數據 WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build(); writeSheet.setStartRow(2); excelWriter.write(dataList, writeSheet); //寫入方式二:從指定行開始寫入,同時寫入指定條數的數據 WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build(); writeSheet.setStartRow(2); writeSheet.setPageSize(100); excelWriter.write(dataList, writeSheet); excelWriter.finish();
從指定行寫入是通過設置WriteSheet的startRow屬性實現的。當設置了startRow後,通過ExcelWriter寫入數據時,會從指定行開始寫入。此外,還可以設置pageSize屬性,控制每頁寫入多少條數據,以提高寫入效率。
二、多線程寫入數據
//創建對應的excel對象
ExcelWriter excelWriter = EasyExcel.write(fileName).build();
//構造多個寫入任務,同時寫入當前頁對應的數據
List sheetList = new ArrayList();
for(int i=0; i {
excelWriter.write(dataList, sheet);
latch.countDown();
});
}
latch.await();
} catch (Exception e) {
e.printStackTrace();
} finally {
excelWriter.finish();
executorService.shutdown();
}
多線程寫入是通過創建多個WriteSheet對象實現的。同樣是設置startRow和pageSize屬性,將數據均勻地分配到不同的線程中寫入,以提高寫入效率。需要注意的是,使用多線程寫入時,需要確保數據需要是可重入的,要求寫入數據不能有重複。
三、不同數據類型寫入
public class Data{
@ExcelProperty(value = "字符串標題", index = 0)
private String str;
@ExcelProperty(value = "日期標題", index = 1)
@DateTimeFormat("yyyy年MM月dd日HH時mm分ss秒")
private Date date;
@ExcelProperty(value = "數字標題", index = 2)
private Double doubleData;
}
//創建對應的excel對象
ExcelWriter excelWriter = EasyExcel.write(fileName, Data.class).build();
//調用write方法,進行數據寫入
excelWriter.write(dataList, EasyExcel.writerSheet(sheetName).build());
excelWriter.finish();
EasyExcel支持不同的數據類型寫入,只需要在對應的類中添加@ExcelProperty註解並指定對應的標題和索引位置,然後通過EasyExcel.write方法進行寫入即可。支持的數據類型包括String、Date、Double、Boolean、LocalDate、BigDecimal等。
四、自定義數據轉換器
public class DemoDataConverter implements Converter{
private static final Map map = new HashMap();
static {
map.put("男", 1);
map.put("女", 2);
}
@Override
public Class supportJavaTypeKey() {
return String.class;
}
@Override
public CellData convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
if (value == null || value.isEmpty()) {
return null;
}
return new CellData(map.get(value));
}
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return map.entrySet().stream()
.filter(entry -> Objects.equals(entry.getValue(), cellData.getNumberValue().intValue()))
.map(Map.Entry::getKey)
.findFirst()
.orElse(null);
}
}
//創建對應的excel對象
ExcelWriter excelWriter = EasyExcel.write(fileName, Data.class).registerConverter(new DemoDataConverter()).build();
//調用write方法,進行數據寫入
excelWriter.write(dataList, EasyExcel.writerSheet(sheetName).build());
excelWriter.finish();
自定義數據轉換器是通過實現Converter接口來實現的,需要重寫convertToExcelData和convertToJavaData兩個方法。其中,convertToExcelData用於將Java對象轉換成對應的Excel單元格數據,convertToJavaData用於將Excel單元格數據轉換成對應的Java對象。通過重寫這兩個方法,可以實現自定義的數據轉換邏輯。
五、數據校驗
public class DemoDataListener extends AnalysisEventListener {
List dataList = new ArrayList();
@Override
public void invoke(Data data, AnalysisContext context) {
if(data.getStr() == null || data.getDate() == null || data.getDoubleData() == null){
throw new RuntimeException("數據校驗失敗!");
}
dataList.add(data);
// 每1000條數據處理一次業務邏輯,防止數據量過大導致內存溢出
if (dataList.size() >= 1000) {
// TODO: 處理業務邏輯
dataList.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//處理剩餘的數據
// TODO: 處理業務邏輯
dataList.clear();
}
}
//創建對應的excel對象
ExcelReader excelReader = EasyExcel.read(fileName, Data.class, new DemoDataListener()).build();
//調用read方法,進行數據讀取
excelReader.read(EasyExcel.readerSheet(sheetName).head(Data.class).build());
數據校驗是通過實現AnalysisEventListener接口來實現的。讀取數據時,如果數據校驗失敗,可以拋出RuntimeException來停止數據讀取。通過設置讀取的pageSize屬性,可以控制每頁讀取多少條數據,以提高讀取效率。同時,在業務邏輯處理時,也需要注意對數據量過大的情況進行適當的分頁處理。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/189470.html
微信掃一掃
支付寶掃一掃