一、指定行寫入方式
//創建對應的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