[alibaba/easyexcel]在使用response.getOutputStream() 来导出excel时,如何获取到最后导出文件的大小

2024-05-09 389 views
7

/**

  • 查询优化的方法 */ public void exportExcelByMultithreading(HttpServletResponse response, ThreadPoolTaskExecutor threadPoolTaskExecutor, Class pojoClass, Integer pageSize, QueryWrapper queryWrapper) throws IOException { ServletOutputStream out = getServletOutputStream(response); // // 导出文件路径 // String fileName = "d:\test.xlsx";

    Long count = baseMapper.selectCount(queryWrapper);
    Long sheetNum = count % pageSize == 0 ? count / pageSize:count / pageSize + 1;
    // 多线程去读
    // 1.初始化map容量 防止扩容带来的效率损耗
    Map<Integer, Page<T>> pageMap = new ConcurrentHashMap<>(Math.toIntExact(3));
    CountDownLatch countDownLatch = new CountDownLatch(Math.toIntExact(3));
    // 注意 easyexcel 暂时不支持多线程并发写入!!! 详情请看github上issues
    for (int i = 200 ;i< sheetNum;i++){
        int finali = i;
        threadPoolTaskExecutor.submit(()->{
            Page<T> page = new Page<>();
            page.setCurrent(finali + 1);
            page.setSize(pageSize);
            // 获取数据存放到map中
            Page<T> selectPage = baseMapper.selectPage(page,queryWrapper);
            pageMap.put(finali,selectPage);
            // 消耗掉一个
            countDownLatch.countDown();
        });
    }
    try {
        countDownLatch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    // 写入
    try (ExcelWriter excelWriter = EasyExcel.write(out, pojoClass).build()) {
        pageMap.forEach((k,v)->{
            log.info("正在写入{}条数据",pageSize);
            WriteSheet writeSheet = EasyExcel.writerSheet(k, "第"+(k+1)+"批数据").build();
            excelWriter.write(v.getRecords(), writeSheet);
            pageMap.remove(k);
        });
    
        excelWriter.finish();
    }

    }

回答

2

放在try()里面就不需要手动finish了 close里面就有finish操作了

7

文件大小似乎没什么好办法

4

不知道您是否已经解决该问题?我们先暂时关闭这个问题,如果还存在问题请重新Reopen这个issue