SpringBoot 企业级 Excel 导入导出实战注解式表头字典转换下拉校验大数据量异步方案演示地址http://ruoyioffice.com | 源码1·GitHubruoyi-office | 源码2·GitCoderuoyi-office | 源码3·Giteeruoyi-office | 微信17156169080备注「RuoYi Office」Excel 导入导出是企业系统里看着简单、做起来全是坑的功能用原生 POI 手撸表头、样式、列宽几百行代码只为导一张表数据量一大就OutOfMemoryError状态码1导出去用户看不懂要的是启用/禁用导入没有模板、没有校验用户随便填一个格式系统就崩。RuoYi Office 基于 FastExcel 封装了一个ExcelUtils工具类——三行代码完成导出注解定义表头、字典自动转换、下拉框自动校验、导入模板一键下载、导入结果带成功/失败明细并配套百万级数据的流式分批、动态表头、异步导出 下载中心方案把 Excel 这件脏活累活彻底标准化。▲ Excel 导入导出能力全景①导出ExcelUtils.write ExcelProperty 表头 DictConvert 字典转换 列宽自适应→ ②导入模板下载 read 解析 校验 结果统计→ ③进阶流式分批 / 动态表头 / 异步导出 下载中心引言Excel 导入导出到底难在哪“不就是导个 Excel 吗用 POI 写个循环就行了。”——直到你真正落地才发现每一处都是坑手撸 POI 又长又脆创建 Workbook、Sheet、Row、Cell、CellStyle、设列宽、设表头……导一张 10 列的表要写一两百行样板代码改个字段还得回去改下标极易出错。大数据量直接 OOM用XSSFWorkbook把几十万行全 load 进内存导出时OutOfMemoryError当场翻车。POI 的 SXSSF 能缓解但要手动管理刷盘窗口没人愿意写。码值用户看不懂数据库里性别存1/2、状态存0/1直接导出去用户一脸懵。要把码值翻译成男/女“启用/禁用”每个字段都手动if-else转换。导入毫无防护没有标准模板用户列顺序填错没有字段校验一个非法日期就抛异常导完不知道成功几条、失败几条、哪条失败、为什么失败。本文以 RuoYi Office 的****-spring-boot-starter-excel为例拆解它如何用注解 封装把这些坑一次填平并给出大数据量的进阶方案。所有核心代码均来自真实源码。一、核心理念注解定义结构工具类兜底实现RuoYi Office 的 Excel 方案基于FastExcelEasyExcel 的活跃分支cn.idev.excel核心思想是用注解声明导出什么样用一个工具类兜底怎么导业务代码只描述结构不碰 POI 细节。1.1 ExcelUtils三行搞定导出与导入整个导出能力浓缩在ExcelUtils.write一个方法里——注册列宽自适应、下拉框、Long 精度保护三个 Handler一行doWritepublicstaticTvoidwrite(HttpServletResponseresponse,Stringfilename,StringsheetName,ClassThead,ListTdata)throwsIOException{FastExcelFactory.write(response.getOutputStream(),head).autoCloseStream(false)// 交给 Servlet 处理流.registerWriteHandler(newColumnWidthMatchStyleStrategy())// 列宽自适应最大 255.registerWriteHandler(newSelectSheetWriteHandler(head))// 基于隐藏 sheet 实现下拉框.registerConverter(newLongStringConverter())// 避免 Long 精度丢失.sheet(sheetName).doWrite(data);response.addHeader(Content-Disposition,attachment;filenameHttpUtils.encodeUtf8(filename));response.setContentType(application/vnd.ms-excel;charsetUTF-8);}publicstaticTListTread(MultipartFilefile,ClassThead)throwsIOException{try(InputStreaminputStreamfile.getInputStream()){returnFastExcelFactory.read(inputStream,head,null).autoCloseStream(false).doReadAllSync();}}关键设计Content-Disposition写在doWrite之后——这样导出过程中若抛异常响应的 contentType 还没被改成 Excel前端能正常收到 JSON 错误提示而不是下载一个损坏文件。1.2 ExcelProperty注解即表头导出哪些列、列名是什么全部写在 RespVO 的字段注解上无需手动建表头publicclassInfraStudentRespVO{ExcelProperty(编号)privateLongid;ExcelProperty(名字)privateStringname;ExcelProperty(出生日期)privateLocalDatebirthday;ExcelProperty(value性别,converterDictConvert.class)DictFormat(system_user_sex)// 字典类型privateIntegersex;ExcelProperty(创建时间)privateLocalDateTimecreateTime;}字段顺序即列顺序value即列名加converter即做值转换。改导出列 改字段注解不用动任何导出逻辑。二、字典转换与下拉校验让 Excel 既好看又防错2.1 DictConvert码值 ↔ 文案自动互转性别1/2、状态0/1这类码值导出时翻译成文案、导入时翻译回码值靠ExcelProperty(converter DictConvert.class) DictFormat(字典类型)两个注解搞定导出DictConvert读DictFormat指定的字典类型把1转成男、0转成禁用导入反向把男转回1、禁用转回0。业务代码一个if都不用写码值翻译完全声明式。2.2 ExcelColumnSelect导入下拉框防止乱填导入模板里性别、状态这种枚举字段最好做成下拉框避免用户手填错。ExcelColumnSelect配合SelectSheetWriteHandler基于一个隐藏 sheet 生成数据有效性下拉publicinterfaceExcelColumnSelect{StringdictType()default;// 字典类型取字典项做下拉StringfunctionName()default;// 或自定义数据源方法名二选一}dictType直接取字典项作下拉选项functionName则对接ExcelColumnSelectFunction实现动态数据源如部门列表、商品列表。导入模板自带下拉用户只能选不能乱填从源头杜绝脏数据。三、导出一个接口三种用途实际 Controller 里导出、导入模板、导入三个接口配合构成完整闭环GetMapping(/export-excel)PreAuthorize(ss.hasPermission(infra:student:export))ApiAccessLog(operateTypeEXPORT)// 操作日志记录谁导了什么publicvoidexportStudentExcel(ValidInfraStudentPageReqVOpageReqVO,HttpServletResponseresponse)throwsIOException{pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);// 不分页导全量按当前查询条件ListInfraStudentDOliststudentService.getStudentPage(pageReqVO).getList();ExcelUtils.write(response,学生.xls,数据,InfraStudentRespVO.class,BeanUtils.toBean(list,InfraStudentRespVO.class));}GetMapping(/get-import-template)publicvoidimportTemplate(HttpServletResponseresponse)throwsIOException{// 导出一个空列表 → 只有表头和下拉框的导入模板ExcelUtils.write(response,学生导入模板.xls,数据,InfraStudentImportExcelVO.class,Collections.emptyList());}设计要点复用查询条件导出导出接口复用列表的PageReqVO把pageSize设为PAGE_SIZE_NONE实现按当前筛选条件导全量。导入模板 空数据导出模板就是用ImportExcelVO带ExcelColumnSelect下拉导出一个空列表表头与下拉天然对齐导入解析。操作日志留痕ApiAccessLog(operateType EXPORT)自动记录导出操作满足数据安全审计。四、导入模板下载 解析 校验 结果统计导入是 Excel 功能里最需要防御性设计的部分。RuoYi Office 的导入闭环是下载模板 → 用户填写 → 上传解析 → 逐条校验 → 返回成功/失败明细PostMapping(/import)PreAuthorize(ss.hasPermission(infra:student:import))publicCommonResultInfraStudentImportRespVOimportExcel(RequestParam(file)MultipartFilefile)throwsException{// 1. 用 ImportExcelVO 解析与模板表头一致ListInfraStudentImportExcelVOlistExcelUtils.read(file,InfraStudentImportExcelVO.class);// 2. 交给 Service 逐条校验 落库返回统计结果returnsuccess(studentService.importStudentList(list));}Service 层的导入逻辑通常包含逐条校验必填、格式、字典合法性校验单条失败不影响其它行去重 / updateSupport按唯一键如手机号判断新增还是更新updateSupporttrue时覆盖已有数据结果统计返回ImportRespVO包含成功条数、失败明细第几行、什么原因前端弹窗展示成功 X 条失败 Y 条及失败原因列表。用专门的ImportExcelVO而非 RespVO解析——导入字段往往少于导出字段不需要 id、创建时间单独定义一个导入 VO 更清晰、更安全。五、进阶方案百万级数据 动态表头 异步导出基础封装解决了 90% 的中小数据量场景。当数据量上到几十万、上百万行或表头不固定时需要进阶方案以下为架构设计思路可在此封装基础上扩展。5.1 流式分批杜绝 OOM不要一次selectList把百万行全 load 进内存。FastExcel/EasyExcel 天生支持分批写入——边查边写每批 1000~5000 行写完即释放// 伪代码分批游标查询 分批写入内存恒定try(ExcelWriterwriterFastExcelFactory.write(out,head).build()){WriteSheetsheetFastExcelFactory.writerSheet(数据).build();longlastId0;while(true){ListXxxDObatchmapper.selectBatchByIdGreaterThan(lastId,2000);// 游标分页避免深翻页if(batch.isEmpty())break;writer.write(BeanUtils.toBean(batch,XxxRespVO.class),sheet);lastIdbatch.get(batch.size()-1).getId();}}要点用游标分页id lastId而非limit offset——百万级数据深翻页offset会越来越慢。5.2 动态表头表头由运行时决定报表类导出常需要列不固定如按月份动态生成列。这时不用注解 VO改用 EasyExcel 的ListListString动态表头 ListListObject数据运行时拼出表头与数据矩阵即可。5.3 异步导出 下载中心百万级导出耗时几十秒HTTP 同步等待会超时。成熟方案是异步化用户点导出 → 提交一个导出任务落库状态进行中→ 立即返回任务已提交 ↓ 后台线程/XXL-Job 异步执行 → 生成文件上传到 MinIO/OSS → 更新任务状态已完成 ↓ 用户在下载中心看到任务 → 点击下载文件配合站内信/WebSocket 通知您的导出已完成体验远好于转圈等待几十秒最后超时。这也是 RuoYi Office 文件服务MinIO XXL-Job 消息通知中心三块能力的天然组合点。六、RuoYi Office Excel 方案的创新设计6.1 一个工具类封装所有套路列宽自适应、下拉框、Long 精度、流处理——这些每次都要写的细节全收进ExcelUtils业务方三行调用再也不碰 POI。6.2 注解驱动改字段不改逻辑导出列、列名、字典转换、下拉数据源全部声明在 VO 注解上。改导出内容只改注解导出逻辑零改动。6.3 字典转换双向打通DictConvert让码值在数据库存储和Excel 展示间自动互转导出可读、导入可解析彻底告别人肉if-else。6.4 导入带校验与结果回执标准模板 下拉约束 逐条校验 成功/失败明细统计让导入从撞运气变成可控、可追溯。七、技术亮点总结设计要点实现方式价值三行导出ExcelUtils.write封装 FastExcel业务零样板代码注解表头ExcelProperty改字段不改逻辑字典转换DictConvertDictFormat码值/文案双向自动互转下拉校验ExcelColumnSelect 隐藏 sheet导入防乱填列宽自适应ColumnWidthMatchStyleStrategy无需手设列宽Long 精度LongStringConverter大 ID 不丢精度导入闭环模板下载 解析 校验 统计导入可控可追溯错误友好contentType 后置异常返回 JSON 而非坏文件大数据量游标分页 流式分批写内存恒定杜绝 OOM异步导出任务化 下载中心 通知百万级不超时八、快速体验在线演示http://ruoyioffice.com/web/账号admin/admin123体验路径系统管理 / 各业务模块列表页 → 点击「导出」按钮或在支持导入的页面下载模板、填写后导入。推荐体验流程任选一个列表页如用户管理、操作日志设置筛选条件后点「导出」观察导出文件的表头、字典文案、列宽在支持导入的模块下载「导入模板」注意模板里的下拉框按模板填几行含一行故意填错导入后查看成功 X 条、失败 Y 条 失败原因的结果回执。源码仓库仓库地址GitHubgithub.com/yuqing2026/ruoyi-officeGitCodegitcode.com/zhouzhongyan/ruoyi-officeGiteegitee.com/yqzy1688/ruoyi-office结语企业级 Excel 方案的核心思想是把每次都要写的样板封装成工具类把导出长什么样声明成注解把导入怎么防错做成模板 校验 回执的闭环。业务方只描述结构不碰底层细节数据量大了再叠加流式分批与异步下载中心。这套声明式 工具化 渐进增强的思路让 Excel 从最招人烦的脏活变成几分钟就能接好的标准能力。你们项目导大数据量 Excel 踩过 OOM 吗是怎么解决的欢迎评论区交流。常见问题FAQRuoYi Office 用的是 EasyExcel 还是 POI底层是 FastExcelEasyExcel 的活跃分支包名cn.idev.excel在其上封装了ExcelUtils工具类。相比裸 POI内存占用低、代码量少一个数量级。导出时码值如状态 0/1怎么变成中文在 RespVO 字段上加ExcelProperty(converter DictConvert.class)和DictFormat(字典类型)导出时自动把码值翻译成字典文案导入时再翻译回码值。百万级数据导出会内存溢出吗基础封装适合中小数据量。百万级建议用流式分批写游标分页id lastId 每批写入即释放 异步导出到文件服务 下载中心避免一次性 load 进内存导致 OOM。导入支持数据校验和失败提示吗支持。导入走下载标准模板带下拉约束→ 解析 → 逐条校验 → 返回成功/失败明细的闭环前端展示成功 X 条、失败 Y 条及每条失败原因。能做表头不固定的动态导出吗能。固定结构用ExcelProperty注解 VO动态表头改用ListListString表头 ListListObject数据矩阵运行时拼装适合按月份/维度动态生成列的报表。想要体验 RuoYi Office 的强大功能在线演示http://ruoyioffice.com/web/账号 admin / admin123源码仓库GitHub | GitCode | Gitee技术咨询添加微信17156169080备注「RuoYi Office」⭐如果觉得不错请给个 Star 支持一下
SpringBoot 企业级 Excel 导入导出实战:注解式表头+字典转换+下拉校验+大数据量异步方案
SpringBoot 企业级 Excel 导入导出实战注解式表头字典转换下拉校验大数据量异步方案演示地址http://ruoyioffice.com | 源码1·GitHubruoyi-office | 源码2·GitCoderuoyi-office | 源码3·Giteeruoyi-office | 微信17156169080备注「RuoYi Office」Excel 导入导出是企业系统里看着简单、做起来全是坑的功能用原生 POI 手撸表头、样式、列宽几百行代码只为导一张表数据量一大就OutOfMemoryError状态码1导出去用户看不懂要的是启用/禁用导入没有模板、没有校验用户随便填一个格式系统就崩。RuoYi Office 基于 FastExcel 封装了一个ExcelUtils工具类——三行代码完成导出注解定义表头、字典自动转换、下拉框自动校验、导入模板一键下载、导入结果带成功/失败明细并配套百万级数据的流式分批、动态表头、异步导出 下载中心方案把 Excel 这件脏活累活彻底标准化。▲ Excel 导入导出能力全景①导出ExcelUtils.write ExcelProperty 表头 DictConvert 字典转换 列宽自适应→ ②导入模板下载 read 解析 校验 结果统计→ ③进阶流式分批 / 动态表头 / 异步导出 下载中心引言Excel 导入导出到底难在哪“不就是导个 Excel 吗用 POI 写个循环就行了。”——直到你真正落地才发现每一处都是坑手撸 POI 又长又脆创建 Workbook、Sheet、Row、Cell、CellStyle、设列宽、设表头……导一张 10 列的表要写一两百行样板代码改个字段还得回去改下标极易出错。大数据量直接 OOM用XSSFWorkbook把几十万行全 load 进内存导出时OutOfMemoryError当场翻车。POI 的 SXSSF 能缓解但要手动管理刷盘窗口没人愿意写。码值用户看不懂数据库里性别存1/2、状态存0/1直接导出去用户一脸懵。要把码值翻译成男/女“启用/禁用”每个字段都手动if-else转换。导入毫无防护没有标准模板用户列顺序填错没有字段校验一个非法日期就抛异常导完不知道成功几条、失败几条、哪条失败、为什么失败。本文以 RuoYi Office 的****-spring-boot-starter-excel为例拆解它如何用注解 封装把这些坑一次填平并给出大数据量的进阶方案。所有核心代码均来自真实源码。一、核心理念注解定义结构工具类兜底实现RuoYi Office 的 Excel 方案基于FastExcelEasyExcel 的活跃分支cn.idev.excel核心思想是用注解声明导出什么样用一个工具类兜底怎么导业务代码只描述结构不碰 POI 细节。1.1 ExcelUtils三行搞定导出与导入整个导出能力浓缩在ExcelUtils.write一个方法里——注册列宽自适应、下拉框、Long 精度保护三个 Handler一行doWritepublicstaticTvoidwrite(HttpServletResponseresponse,Stringfilename,StringsheetName,ClassThead,ListTdata)throwsIOException{FastExcelFactory.write(response.getOutputStream(),head).autoCloseStream(false)// 交给 Servlet 处理流.registerWriteHandler(newColumnWidthMatchStyleStrategy())// 列宽自适应最大 255.registerWriteHandler(newSelectSheetWriteHandler(head))// 基于隐藏 sheet 实现下拉框.registerConverter(newLongStringConverter())// 避免 Long 精度丢失.sheet(sheetName).doWrite(data);response.addHeader(Content-Disposition,attachment;filenameHttpUtils.encodeUtf8(filename));response.setContentType(application/vnd.ms-excel;charsetUTF-8);}publicstaticTListTread(MultipartFilefile,ClassThead)throwsIOException{try(InputStreaminputStreamfile.getInputStream()){returnFastExcelFactory.read(inputStream,head,null).autoCloseStream(false).doReadAllSync();}}关键设计Content-Disposition写在doWrite之后——这样导出过程中若抛异常响应的 contentType 还没被改成 Excel前端能正常收到 JSON 错误提示而不是下载一个损坏文件。1.2 ExcelProperty注解即表头导出哪些列、列名是什么全部写在 RespVO 的字段注解上无需手动建表头publicclassInfraStudentRespVO{ExcelProperty(编号)privateLongid;ExcelProperty(名字)privateStringname;ExcelProperty(出生日期)privateLocalDatebirthday;ExcelProperty(value性别,converterDictConvert.class)DictFormat(system_user_sex)// 字典类型privateIntegersex;ExcelProperty(创建时间)privateLocalDateTimecreateTime;}字段顺序即列顺序value即列名加converter即做值转换。改导出列 改字段注解不用动任何导出逻辑。二、字典转换与下拉校验让 Excel 既好看又防错2.1 DictConvert码值 ↔ 文案自动互转性别1/2、状态0/1这类码值导出时翻译成文案、导入时翻译回码值靠ExcelProperty(converter DictConvert.class) DictFormat(字典类型)两个注解搞定导出DictConvert读DictFormat指定的字典类型把1转成男、0转成禁用导入反向把男转回1、禁用转回0。业务代码一个if都不用写码值翻译完全声明式。2.2 ExcelColumnSelect导入下拉框防止乱填导入模板里性别、状态这种枚举字段最好做成下拉框避免用户手填错。ExcelColumnSelect配合SelectSheetWriteHandler基于一个隐藏 sheet 生成数据有效性下拉publicinterfaceExcelColumnSelect{StringdictType()default;// 字典类型取字典项做下拉StringfunctionName()default;// 或自定义数据源方法名二选一}dictType直接取字典项作下拉选项functionName则对接ExcelColumnSelectFunction实现动态数据源如部门列表、商品列表。导入模板自带下拉用户只能选不能乱填从源头杜绝脏数据。三、导出一个接口三种用途实际 Controller 里导出、导入模板、导入三个接口配合构成完整闭环GetMapping(/export-excel)PreAuthorize(ss.hasPermission(infra:student:export))ApiAccessLog(operateTypeEXPORT)// 操作日志记录谁导了什么publicvoidexportStudentExcel(ValidInfraStudentPageReqVOpageReqVO,HttpServletResponseresponse)throwsIOException{pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);// 不分页导全量按当前查询条件ListInfraStudentDOliststudentService.getStudentPage(pageReqVO).getList();ExcelUtils.write(response,学生.xls,数据,InfraStudentRespVO.class,BeanUtils.toBean(list,InfraStudentRespVO.class));}GetMapping(/get-import-template)publicvoidimportTemplate(HttpServletResponseresponse)throwsIOException{// 导出一个空列表 → 只有表头和下拉框的导入模板ExcelUtils.write(response,学生导入模板.xls,数据,InfraStudentImportExcelVO.class,Collections.emptyList());}设计要点复用查询条件导出导出接口复用列表的PageReqVO把pageSize设为PAGE_SIZE_NONE实现按当前筛选条件导全量。导入模板 空数据导出模板就是用ImportExcelVO带ExcelColumnSelect下拉导出一个空列表表头与下拉天然对齐导入解析。操作日志留痕ApiAccessLog(operateType EXPORT)自动记录导出操作满足数据安全审计。四、导入模板下载 解析 校验 结果统计导入是 Excel 功能里最需要防御性设计的部分。RuoYi Office 的导入闭环是下载模板 → 用户填写 → 上传解析 → 逐条校验 → 返回成功/失败明细PostMapping(/import)PreAuthorize(ss.hasPermission(infra:student:import))publicCommonResultInfraStudentImportRespVOimportExcel(RequestParam(file)MultipartFilefile)throwsException{// 1. 用 ImportExcelVO 解析与模板表头一致ListInfraStudentImportExcelVOlistExcelUtils.read(file,InfraStudentImportExcelVO.class);// 2. 交给 Service 逐条校验 落库返回统计结果returnsuccess(studentService.importStudentList(list));}Service 层的导入逻辑通常包含逐条校验必填、格式、字典合法性校验单条失败不影响其它行去重 / updateSupport按唯一键如手机号判断新增还是更新updateSupporttrue时覆盖已有数据结果统计返回ImportRespVO包含成功条数、失败明细第几行、什么原因前端弹窗展示成功 X 条失败 Y 条及失败原因列表。用专门的ImportExcelVO而非 RespVO解析——导入字段往往少于导出字段不需要 id、创建时间单独定义一个导入 VO 更清晰、更安全。五、进阶方案百万级数据 动态表头 异步导出基础封装解决了 90% 的中小数据量场景。当数据量上到几十万、上百万行或表头不固定时需要进阶方案以下为架构设计思路可在此封装基础上扩展。5.1 流式分批杜绝 OOM不要一次selectList把百万行全 load 进内存。FastExcel/EasyExcel 天生支持分批写入——边查边写每批 1000~5000 行写完即释放// 伪代码分批游标查询 分批写入内存恒定try(ExcelWriterwriterFastExcelFactory.write(out,head).build()){WriteSheetsheetFastExcelFactory.writerSheet(数据).build();longlastId0;while(true){ListXxxDObatchmapper.selectBatchByIdGreaterThan(lastId,2000);// 游标分页避免深翻页if(batch.isEmpty())break;writer.write(BeanUtils.toBean(batch,XxxRespVO.class),sheet);lastIdbatch.get(batch.size()-1).getId();}}要点用游标分页id lastId而非limit offset——百万级数据深翻页offset会越来越慢。5.2 动态表头表头由运行时决定报表类导出常需要列不固定如按月份动态生成列。这时不用注解 VO改用 EasyExcel 的ListListString动态表头 ListListObject数据运行时拼出表头与数据矩阵即可。5.3 异步导出 下载中心百万级导出耗时几十秒HTTP 同步等待会超时。成熟方案是异步化用户点导出 → 提交一个导出任务落库状态进行中→ 立即返回任务已提交 ↓ 后台线程/XXL-Job 异步执行 → 生成文件上传到 MinIO/OSS → 更新任务状态已完成 ↓ 用户在下载中心看到任务 → 点击下载文件配合站内信/WebSocket 通知您的导出已完成体验远好于转圈等待几十秒最后超时。这也是 RuoYi Office 文件服务MinIO XXL-Job 消息通知中心三块能力的天然组合点。六、RuoYi Office Excel 方案的创新设计6.1 一个工具类封装所有套路列宽自适应、下拉框、Long 精度、流处理——这些每次都要写的细节全收进ExcelUtils业务方三行调用再也不碰 POI。6.2 注解驱动改字段不改逻辑导出列、列名、字典转换、下拉数据源全部声明在 VO 注解上。改导出内容只改注解导出逻辑零改动。6.3 字典转换双向打通DictConvert让码值在数据库存储和Excel 展示间自动互转导出可读、导入可解析彻底告别人肉if-else。6.4 导入带校验与结果回执标准模板 下拉约束 逐条校验 成功/失败明细统计让导入从撞运气变成可控、可追溯。七、技术亮点总结设计要点实现方式价值三行导出ExcelUtils.write封装 FastExcel业务零样板代码注解表头ExcelProperty改字段不改逻辑字典转换DictConvertDictFormat码值/文案双向自动互转下拉校验ExcelColumnSelect 隐藏 sheet导入防乱填列宽自适应ColumnWidthMatchStyleStrategy无需手设列宽Long 精度LongStringConverter大 ID 不丢精度导入闭环模板下载 解析 校验 统计导入可控可追溯错误友好contentType 后置异常返回 JSON 而非坏文件大数据量游标分页 流式分批写内存恒定杜绝 OOM异步导出任务化 下载中心 通知百万级不超时八、快速体验在线演示http://ruoyioffice.com/web/账号admin/admin123体验路径系统管理 / 各业务模块列表页 → 点击「导出」按钮或在支持导入的页面下载模板、填写后导入。推荐体验流程任选一个列表页如用户管理、操作日志设置筛选条件后点「导出」观察导出文件的表头、字典文案、列宽在支持导入的模块下载「导入模板」注意模板里的下拉框按模板填几行含一行故意填错导入后查看成功 X 条、失败 Y 条 失败原因的结果回执。源码仓库仓库地址GitHubgithub.com/yuqing2026/ruoyi-officeGitCodegitcode.com/zhouzhongyan/ruoyi-officeGiteegitee.com/yqzy1688/ruoyi-office结语企业级 Excel 方案的核心思想是把每次都要写的样板封装成工具类把导出长什么样声明成注解把导入怎么防错做成模板 校验 回执的闭环。业务方只描述结构不碰底层细节数据量大了再叠加流式分批与异步下载中心。这套声明式 工具化 渐进增强的思路让 Excel 从最招人烦的脏活变成几分钟就能接好的标准能力。你们项目导大数据量 Excel 踩过 OOM 吗是怎么解决的欢迎评论区交流。常见问题FAQRuoYi Office 用的是 EasyExcel 还是 POI底层是 FastExcelEasyExcel 的活跃分支包名cn.idev.excel在其上封装了ExcelUtils工具类。相比裸 POI内存占用低、代码量少一个数量级。导出时码值如状态 0/1怎么变成中文在 RespVO 字段上加ExcelProperty(converter DictConvert.class)和DictFormat(字典类型)导出时自动把码值翻译成字典文案导入时再翻译回码值。百万级数据导出会内存溢出吗基础封装适合中小数据量。百万级建议用流式分批写游标分页id lastId 每批写入即释放 异步导出到文件服务 下载中心避免一次性 load 进内存导致 OOM。导入支持数据校验和失败提示吗支持。导入走下载标准模板带下拉约束→ 解析 → 逐条校验 → 返回成功/失败明细的闭环前端展示成功 X 条、失败 Y 条及每条失败原因。能做表头不固定的动态导出吗能。固定结构用ExcelProperty注解 VO动态表头改用ListListString表头 ListListObject数据矩阵运行时拼装适合按月份/维度动态生成列的报表。想要体验 RuoYi Office 的强大功能在线演示http://ruoyioffice.com/web/账号 admin / admin123源码仓库GitHub | GitCode | Gitee技术咨询添加微信17156169080备注「RuoYi Office」⭐如果觉得不错请给个 Star 支持一下