美文网首页收藏
使用函数作为参数 传递数据,封装阿里 easyexcel 导出大

使用函数作为参数 传递数据,封装阿里 easyexcel 导出大

作者: 川流不息attitude | 来源:发表于2022-05-11 17:11 被阅读0次
  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 数据 但是很耗时,数据量大了 可能出现重复数据,因为导出的时候数据可能发生变化
2.分页数据量大,多线程分页加载提高效率 可能会出现内存溢出

 @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 +"秒");
    }

相关文章

网友评论

    本文标题:使用函数作为参数 传递数据,封装阿里 easyexcel 导出大

    本文链接:https://www.haomeiwen.com/subject/wrtjurtx.html