使用函式作為引數 傳遞資料,封裝阿里 easyexcel 匯出大資料量 excel
阿新 • • 發佈:2022-05-11
- 注意 資料是 從函式裡面拿到,很多語言都支援 函式作為引數,java8 之後也支援
- 函式作為引數 有些不好理解,但是 很多寫法 就是比較靈活了 如Scala 程式碼就十分優雅,鼓勵用
/** * 大數量匯出 * @param fileName 生成檔案地址 * @param head 表頭 * @param pageSize 頁大小 * @param pages 總頁數 * @param function 獲取資料函式 * @return */ public String exportBigData(String fileName, Class head, int pageSize, int pages, Function<Integer,List<?>> function) { // 每個 sheet 資料量大小 固定最大1百萬 int sheet = 1000000; int sheetNum = sheet / pageSize; int sheetIndex = 1; com.alibaba.excel.ExcelWriter excelWriter = null; try { excelWriter = EasyExcel.write(fileName, head).build(); WriteSheet writeSheet = null; for (int i = 1; i < pages; i++) { writeSheet = EasyExcel.writerSheet(sheetIndex, "Sheet"+sheetIndex).build(); // 分頁去資料庫查詢資料 List list = function.apply(i); excelWriter.write(list, writeSheet); if(i % sheetNum == 0){ sheetIndex++; } } } finally { // 關閉流 if (excelWriter != null) { excelWriter.finish(); } } return fileName; }
呼叫
1.匯出過 5000w 資料 但是很耗時,資料量大了 可能出現重複資料,因為匯出的時候資料可能發生變化
@Test public void testExport() throws Exception { long start = System.currentTimeMillis(); String fileName = "F:\\"+ "repeatedWritetest" + System.currentTimeMillis() + ".xlsx"; int pageSize = 20000; PageHelper.startPage(1,pageSize); List<Map> maps = testUserMapper.listData(); PageInfo pageInfo = new PageInfo<Map>(maps); int pages = pageInfo.getPages(); // 呼叫 exportBigData(fileName,DemoData01.class,pageSize, pages,(i)->{ PageHelper.startPage(i,pageSize,false); List<Map> data = testUserMapper.listData(); return getDemoData01List(maps); }); long end = System.currentTimeMillis(); System.out.println("耗時:"+(end-start)/1000 +"秒"); }