1. 程式人生 > 其它 >使用函式作為引數 傳遞資料,封裝阿里 easyexcel 匯出大資料量 excel

使用函式作為引數 傳遞資料,封裝阿里 easyexcel 匯出大資料量 excel

  1. 注意 資料是 從函式裡面拿到,很多語言都支援 函式作為引數,java8 之後也支援
  2. 函式作為引數 有些不好理解,但是 很多寫法 就是比較靈活了 如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 +"秒");
    }