多线程导出EXCEL多sheet

public void exportExcelFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String filePath = "/templates/export/basicData/summary/export/test.xlsx";
        InputStream tempIs = this.getClass().getResourceAsStream(filePath);
        OutputStream os = null;
        try {
            String fileName = URLEncoder.encode("附件2 水利工程汛前检查汇总表", "UTF-8");
            response.setContentType("application/octet-stream");
            response.setCharacterEncoding("utf8");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName.concat(".xlsx"));
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "no-store");
            response.addHeader("Cache-Control", "max-age=0");
            os = response.getOutputStream();
            ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(tempIs).build();
            //插入新增
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            //多线程下载
            CountDownLatch countDownLatch = new CountDownLatch(9);
            final List[] list1 = new List[9];
            Map<Integer, Object> paramsList = new HashMap<Integer, Object>();
            new Thread(() -> {
                //附件2-1 列表数据
                List  list = new ArrayList();//这边写你自己dao查询list
                Map<String, Object> waterParams = new HashMap<>();//这边写除了列表之外的参数
                list1[0] = list;
                paramsList.put(0,waterParams);
                countDownLatch.countDown();
            }).start();
            new Thread(() -> {
                //附件2-2 列表数据
                List  list = new ArrayList();//这边写你自己dao查询list
                Map<String, Object> waterParams = new HashMap<>();//这边写除了列表之外的参数
                list1[0] = list;
                paramsList.put(0,waterParams);
                countDownLatch.countDown();
            }).start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // 附件2-3
                    List  list = new ArrayList();//这边写你自己dao查询list
                    Map<String, Object> waterParams = new HashMap<>();//这边写除了列表之外的参数
                    list1[0] = list;
                    paramsList.put(0,waterParams);
                    countDownLatch.countDown();
                }
            }).start();
            new Thread(() -> {
                // 附件2-4
                List  list = new ArrayList();//这边写你自己dao查询list
                Map<String, Object> waterParams = new HashMap<>();//这边写除了列表之外的参数
                list1[0] = list;
                paramsList.put(0,waterParams);
                countDownLatch.countDown();
            }).start();
            new Thread(() -> {
                // 附件2-5
                List  list = new ArrayList();//这边写你自己dao查询list
                Map<String, Object> waterParams = new HashMap<>();//这边写除了列表之外的参数
                list1[0] = list;
                paramsList.put(0,waterParams);
                countDownLatch.countDown();
            }).start();
            new Thread(() -> {
                // 附件2-6
                List  list = new ArrayList();//这边写你自己dao查询list
                Map<String, Object> waterParams = new HashMap<>();//这边写除了列表之外的参数
                list1[0] = list;
                paramsList.put(0,waterParams);
                countDownLatch.countDown();

            }).start();
            new Thread(() -> {
                // 附件2-7
                List  list = new ArrayList();//这边写你自己dao查询list
                Map<String, Object> waterParams = new HashMap<>();//这边写除了列表之外的参数
                list1[0] = list;
                paramsList.put(0,waterParams);
                countDownLatch.countDown();

            }).start();

            new Thread(() -> {
                // 附件2-8
                List  list = new ArrayList();//这边写你自己dao查询list
                Map<String, Object> waterParams = new HashMap<>();//这边写除了列表之外的参数
                list1[0] = list;
                paramsList.put(0,waterParams);
                countDownLatch.countDown();

            }).start();

            new Thread(() -> {
                // 附件2-9
                List  list = new ArrayList();//这边写你自己dao查询list
                Map<String, Object> waterParams = new HashMap<>();//这边写除了列表之外的参数
                list1[0] = list;
                paramsList.put(0,waterParams);
                countDownLatch.countDown();

            }).start();
            countDownLatch.await(5, TimeUnit.MINUTES);
            for (int i=0;i<list1.length;i++) {
                WriteSheet writeSheet = EasyExcel.writerSheet(i).build();
                excelWriter.fill(paramsList.get(i), writeSheet);
                excelWriter.fill(list1[i],fillConfig, writeSheet);
            }
            excelWriter.finish();
            os.flush();
        }  catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }finally {
            os.close();
            tempIs.close();
        }
    }

提示:每个线程里面最好cry catch 一下,把countDownLatch.countDown();放finally里面,避免有异常导致countDownLatch.await(5, TimeUnit.MINUTES)等待时间过长问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel 是一款开源的 Java Excel 操作库,它提供了多线导出 Excel 的功能。下面是一个简单的示例代码,演示了如何使用 EasyExcel 实现多线导出 Excel: 首先,确保你已经引入了 EasyExcel 的依赖,可以在 Maven 中添加以下依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.4.0</version> </dependency> ``` 然后,你可以创建一个实现 Runnable 接口的 ExportTask 类,用来导出 Excel: ```java import com.alibaba.excel.EasyExcel; public class ExportTask implements Runnable { private String fileName; public ExportTask(String fileName) { this.fileName = fileName; } @Override public void run() { // 导出 Excel 的逻辑 // 这里只是一个示例,你需要根据自己的需求进行逻辑的编写 EasyExcel.write(fileName, ExportData.class).sheet("Sheet1").doWrite(dataList); } } ``` 在上面的代码中,`ExportData` 是你要导出的数据对象,`dataList` 是导出的数据列表。 接下来,你可以创建一个线程池,并提交多个任务进行导出: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { int threadCount = 5; // 线程数 ExecutorService executor = Executors.newFixedThreadPool(threadCount); for (int i = 0; i < threadCount; i++) { String fileName = "output_" + i + ".xlsx"; ExportTask exportTask = new ExportTask(fileName); executor.execute(exportTask); } executor.shutdown(); } } ``` 在上面的代码中,`threadCount` 是线程数,根据需求设置合适的值。每个线程都创建一个导出任务,并提交给线程池执行。 这样,就可以实现多线导出 Excel 文件了。注意在实际使用中,你需要根据自己的数据和业务需求进行适当的修改。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值