EasyExcel百万数据从数据库写入到excel

一 生成一百万条测试数据

生成一百万条测试数据

二 查询数据写入到excel

实现思路: 分页查询数据每1000条数据写入到一个sheet
@GetMapping("/test/export")
    public AjaxResult testExport() throws FileNotFoundException {
        long startTime = System.currentTimeMillis();
        int minId = appUserService.getMinId();
        int maxId = appUserService.getMaxId();
        int i = 0;
        int limit = minId + 1000;
        OutputStream fileOutputStream = new FileOutputStream(new File("d://test.csv"));
        ExcelWriter excelWriter = EasyExcelFactory.write(fileOutputStream).build();
        while (minId < maxId) {
            Map<String,Integer> paramMap = new HashMap<>(16);
            paramMap.put("minId",minId);
            paramMap.put("limit",limit);
            List<AppUserDTO> appUsers = appUserService.selectAppUserByLimit(paramMap);
            WriteSheet sheet = EasyExcel.writerSheet().sheetName("sheet" + i).head(AppUserDTO.class).build();
            excelWriter.write(appUsers,sheet);
            minId += 1000;
            limit += 1000;
            i ++;
        }
        excelWriter.finish();
        excelWriter.close();
        long endTime = System.currentTimeMillis();

        System.out.println("程序运行时间是======>" + (endTime - startTime));
        return AjaxResult.success();
    }
 <select id="getMinId" resultType="java.lang.Integer">
        select MIN(id) from app_user
    </select>

    <select id="getMaxId" resultType="java.lang.Integer">
        select MAX(id) from app_user
    </select>

    <select id="selectAppUserByLimit" resultType="com.ruoyi.system.domain.dto.AppUserDTO" parameterType="java.util.Map">
        <include refid="selectAppUserVo"/>
        where id >= #{minId} and id &lt; #{limit}
        order by id asc
    </select>

在这里插入图片描述

在这里插入图片描述

三 总结

1 想过在写入文件的时候采用线程池多线程异步写入,结果一直报错空指针在问chatGPT后得到回答在这里插入图片描述
2 表的字段并不复杂百万数据导出用40多秒可以接受,如果是多表字段复杂情况怎么做?
个人感觉 :可以单独新增一个数据表专门用作导出功能,还有有没有更好的方法可以一起讨论
3 我上面用的查询数据库的方法需要数据是自增主键如果是分库分表的情况就不适合了
4 如果是用户浏览器下载,可以现在服务器导出生成文件然后生成文件下载地址返回给用户,供用户下载

最后 一百万导出用时40多秒是不是还是有些慢,还有哪些更好的办法提高速度呢?用python pandas库效果会怎样呢,后面试试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会跑的葫芦怪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值