分批查询,分批导出--超大数据导出处理--easyExcel

该篇博客讨论了在处理大量数据导出时遇到的问题,系统在尝试一次性导出20万条数据时出现卡死。为解决此问题,博主提出了分批查询和导出的解决方案,每次导出5000条数据,通过循环实现全部数据的导出。代码示例展示了如何使用EasyExcel工具进行分页写入Excel,确保系统稳定运行。同时,博主欢迎有更好方法的人提出建议。
摘要由CSDN通过智能技术生成

情景:我们在做项目中,有个20万左右的数据要导出来,我们查出数据库要导出的话,系统就卡死了,
我们分批查询,分批导出

public void exportDmfAll(HttpServletResponse response,ProcessCompletionVo vo) {

    ExcelWriter excelWriter = null;
    try {
        String fileName = "数据导出";
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" +
                new String(fileName.getBytes("UTF-8"), "ISO8859-1") + ".xlsx");
        excelWriter = EasyExcel.write(response.getOutputStream()).build();

        Integer page = 1;
        while (true) {
            vo.setPageNum(page);
            vo.setPageCount(5000);
            R r = this.getBusinessArea(vo);

            List<DmFbillprocessNodeDetailModel> list = ((Page<DmFbillprocessNodeDetailModel>) r.get("data")).getContent();
            if (list.size()==0) {
                return;
            }
            R typeFlagR = getTypeFlagByBill(vo.getProcessName());
            String typeFlag = "";
            if (!ObjectUtils.isEmpty(typeFlagR.get("business_type"))) {
                typeFlag = String.valueOf(typeFlagR.get("business_type"));
            }
            //if ("国内".equals(typeFlag)) {
            List<DmfAllExcelOne> listResult = new ArrayList<>();

            for (DmFbillprocessNodeDetailModel dmFprocessNodeReportModel : list) {
                DmfAllExcelOne excel = new DmfAllExcelOne();
                BeanUtils.copyProperties(dmFprocessNodeReportModel, excel);
                listResult.add(excel);
            }
            WriteSheet writeSheet = EasyExcel.writerSheet(page - 1, "数据导出" + (page)).head(DmfAllExcelOne.class)
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
            excelWriter.write(listResult, writeSheet);
            //}
           

            page = page + 1;

        }

    } catch (IOException e) {
        e.printStackTrace();
        log.error("导出失败[{}]", e.getMessage());
    } finally {
        excelWriter.finish();
    }


}

大家有不明白的可以留言,或者有更好的方法,可以直接联系我,本人十分感谢~

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用EasyExcel进行分批导出的步骤如下: 1. 首先,在pom.xml文件中添加EasyExcel的依赖。 2. 创建一个实体类,用于描述导出数据的字段和类型,使用@ExcelProperty注解指定字段名和对应Excel的列索引。 3. 创建ExcelWriter对象,并指定导出的文件路径和实体类。 4. 计算总数据量和每个sheet的数据量,并计算总sheet数。 5. 进行循环导出,每次循环根据当前sheet的起始位置和结束位置获取需要导出的数据列表。 6. 使用writer将数据写入sheet中。 7. 最后,使用writer.finish()方法关闭writer。 以下是一个示例代码,用于分批导出1000万条数据: ```java // 创建ExcelWriter对象 ExcelWriter writer = EasyExcel.write(filePath, User.class).build(); // 计算总数据量 int totalCount = 10000000; // 每个sheet存放的数据量 int pageSize = 1000000; // 计算总sheet数 int sheetCount = (totalCount + pageSize - 1) / pageSize; // 导出数据 for (int i = 0; i < sheetCount; i++) { int start = i * pageSize; int end = Math.min(start + pageSize, totalCount); List<User> userList = getUserList(start, end); // 将数据写入sheet Sheet sheet = EasyExcel.writerSheet(i + 1, "Sheet" + (i + 1)).build(); writer.write(userList, sheet); } // 关闭writer writer.finish(); ``` 请注意,getUserList方法是一个示例方法,用于获取需要导出的数据列表。你需要根据实际情况来编写这个方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [easyexcel分批导出excel文件](https://blog.csdn.net/qq_37022150/article/details/130331328)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值