EasyExcel追加写入数据,分批查询多次写入场景下,注意使用方式【OOM警告】

使用.withTemplate(file) 将临时数据文件和真实数据文件合并的方式,在生产环境大批量数据下,完全不可取,有很高的内存溢出风险

伪代码

java 复制代码
    public static void writeAppend(String fileName) {
        String filePath = "tempDir".concat(File.separator).concat(fileName);
        File file = new File(filePath);
        File tempFile = new File(filePath.concat(".tmp"));
        if (file.exists()){
            // 第二次按照原有格式,不需要表头,追加写入
            EasyExcel.write(file, TestData.class)
                    .needHead(false)
                    // 这里有重大问题(拿中转的数据去做模板)
                    .withTemplate(file) 
                    .file(tempFile)
                    .sheet()
                    .doWrite(getDataList());
        } else {
	        if (!file.getParentFile().exists()) {
	            file.getParentFile().mkdirs();
	        }
            // 第一次写入需要表头
            EasyExcel.write(file,TestData.class)
                    .sheet()
                    .doWrite(getDataList());
        }

        if (tempFile.exists()){
            file.delete();
            tempFile.renameTo(file);
        }
    }

开发过程验证时,产生内存溢出

内存正常的用法

EasyExcel重复多次写入

java 复制代码
		// 方法1 如果写到同一个sheet
        String fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写
        ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
        // 这里注意 如果同一个sheet只要创建一次
        WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
        // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
        for (int i = 0; i < 5; i++) {
            // 分页去数据库或者其他服务查询数据,推荐主键范围加limit查询
            List<DemoData> dataList = getDataList();
            excelWriter.write(data, writeSheet);
            dataList = null;
        }
        // 千万别忘记finish 会帮忙关闭流
        excelWriter.finish();
相关推荐
Java成神之路-18 分钟前
通俗易懂理解 Spring MVC 拦截器:概念、流程与简单实现(Spring系列16)
java·spring·mvc
zhanghongbin0120 分钟前
AI 采集器:Claude Code、OpenAI、LiteLLM 监控
java·前端·人工智能
计算机毕设vx_bysj686922 分钟前
【免费领源码】77196基于java的手机银行app管理系统的设计与实现 计算机毕业设计项目推荐上万套实战教程JAVA,node.js,C++、python、大屏数据可视化
java·mysql·智能手机·课程设计
忘梓.22 分钟前
墨色规则与血色节点:C++红黑树设计与实现探秘
java·开发语言·c++
hhh3u3u3u23 分钟前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
星河耀银海25 分钟前
C++ 模板进阶:特化、萃取与可变参数模板
java·开发语言·c++
格鸰爱童话43 分钟前
向AI学习项目技能(五)
java·学习
程序员萌萌1 小时前
Java之mysql实战讲解(三):聚簇索引与非聚簇索引
java·mysql·聚簇索引
好家伙VCC1 小时前
**发散创新:基于Python与ROS的机器人运动控制实战解析**在现代机器人系统开发中,**运动控制**是实现智能行为的核心
java·开发语言·python·机器人
程途知微2 小时前
ConcurrentHashMap线程安全实现原理全解析
java·后端