动态表头导出EasyExcel
在 Spring Boot 中结合 EasyExcel 实现动态表头导出(无实体类,表头和字段(前端传表名,字段值动态查询,返回List<Map<String,Object>>)由前端传递)可以通过以下步骤实现。以下是完整示例:
1. 前端请求数据结构
假设前端传递的 JSON 格式如下:
{"headers": [{"title": "姓名", "field": "name"},{"title": "年龄", "field": "age"},{"title": "城市", "field": "city"}],"data": [{"name": "张三", "age": 25, "city": "北京"},{"name": "李四", "age": 30, "city": "上海"}]
}
2. 后端 DTO 定义
定义接收参数的 DTO 类:
@Data
public class ExportRequest {private List<Header> headers;private List<Map<String, Object>> data;@Datapublic static class Header {private String title; // 表头名称private String field; // 数据字段名}
}
3. Controller 层接口
处理导出请求:
@RestController
public class ExportController {@Autowiredprivate ExportService exportService;@PostMapping("/export")public void exportExcel(@RequestBody ExportRequest request, HttpServletResponse response) {exportService.export(request, response);}
}
4. Service 层实现
核心导出逻辑:
@Service
public class ExportService {public void export(ExportRequest request, HttpServletResponse response) {try {// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("UTF-8");String fileName = URLEncoder.encode("动态导出.xlsx", "UTF-8");response.setHeader("Content-Disposition", "attachment; filename=" + fileName);// 获取输出流OutputStream outputStream = response.getOutputStream();// 动态构建表头和数据WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();ExcelWriter excelWriter = EasyExcel.write(outputStream).build();// 动态添加表头WriteTable writeTable = new WriteTable();List<List<String>> head = buildHead(request.getHeaders());writeTable.setHead(head);// 动态填充数据List<List<Object>> data = buildData(request.getHeaders(), request.getData());excelWriter.write(data, writeSheet, writeTable);// 关闭流excelWriter.finish();outputStream.flush();} catch (IOException e) {throw new RuntimeException("导出失败", e);}}// 构建表头private List<List<String>> buildHead(List<ExportRequest.Header> headers) {List<List<String>> head = new ArrayList<>();for (ExportRequest.Header header : headers) {List<String> columnHead = Collections.singletonList(header.getTitle());head.add(columnHead);}return head;}// 构建数据行private List<List<Object>> buildData(List<ExportRequest.Header> headers, List<Map<String, Object>> dataList) {List<List<Object>> data = new ArrayList<>();for (Map<String, Object> rowData : dataList) {List<Object> row = new ArrayList<>();for (ExportRequest.Header header : headers) {row.add(rowData.get(header.getField()));}data.add(row);}return data;}
}
5. 关键点说明
-
动态表头
- 通过
buildHead()方法将前端传递的headers转换为 EasyExcel 需要的List<List<String>>格式。
- 通过
-
动态数据
- 通过
buildData()方法,根据headers中定义的field字段顺序,从data中提取对应值,构建数据行。
- 通过
-
流式导出
- 使用
ExcelWriter直接操作输出流,避免内存溢出(适合大数据量)。
- 使用
6. 测试与验证
使用 Postman 发送请求:
-
URL:
POST http://localhost:8080/export -
Body(JSON):
{"headers": [{"title": "姓名", "field": "name"},{"title": "年龄", "field": "age"},{"title": "城市", "field": "city"}],"data": [{"name": "张三", "age": 25, "city": "北京"},{"name": "李四", "age": 30, "city": "上海"}] } -
响应:浏览器自动下载
动态导出.xlsx,内容如下:姓名 年龄 城市 张三 25 北京 李四 30 上海
7. 扩展优化
- 字段校验:确保前端传递的
field在data中存在对应值。 - 大数据量分页:如果数据量过大,可分页查询后分批写入。
- 自定义样式:通过
WriteHandler动态设置单元格样式(如字体、颜色)。
通过这种方式,无需定义实体类即可实现完全动态的 Excel 导出功能,表头和字段完全由前端控制。
相关文章:
动态表头导出EasyExcel
在 Spring Boot 中结合 EasyExcel 实现动态表头导出(无实体类,表头和字段(前端传表名,字段值动态查询,返回List<Map<String,Object>>)由前端传递)可以通过以下步骤实现。以下是完整…...
【前端】react+ts 轮播图的实现
一、场景描述 在很多网站的页面中都有轮播图,所以我想利用react.js和ts实现一个轮播图。自动轮播图已经在前面实现过了,如:https://blog.csdn.net/weixin_43872912/article/details/145622444?sharetypeblogdetail&sharerId145622444&a…...
清华大学出品DeepSeek 四部教程全收录(附下载包),清华deepseek文档下载地址
文章目录 前言一、清华大学deepseek教程(四部)二、清华大学deepseek教程全集1.清华大学第一版《DeepSeek:从入门到精通》2.清华大学第二版《DeepSeek赋能职场》3.清华大学第三版《普通人如何抓住DeepSeek红利》4.清华大学第四版:D…...
Android 布局系列(三):RelativeLayout 使用指南
引言 在 Android 开发中,布局管理是构建用户界面的核心。RelativeLayout 曾经是 Android 中非常流行的一种布局方式,广泛应用于各种项目中。它通过相对位置关系组织视图元素,使得我们可以根据父容器或者其他视图的位置来灵活调整子视图的布局…...
ubuntu20.04音频aplay调试
1、使用指定声卡,aplay 播放命令 aplay -D plughw:1,0 test2.wav2、 录音 arecord -Dhw:1,0 -d 10 -f cd -r 44100 -c 2 -t wav test.wav3、各个参数含义 -D 指定声卡编号 plughw:0,0 //0,0代表card0,device0,可以通过arecord -l获取 -f 录音格式 S16_LE…...
前缀和代码解析
前缀和是指数组一定范围的数的总和,常见的有两种,一维和二维,我会用两道题来分别解析 一维 DP34 【模板】前缀和 题目: 题目解析: 暴力解法 直接遍历数组,遍历到下标为 l 时,开始进行相加,直到遍历到下标为 r ,最后返回总和.这样做的时间复杂度为: O(n) public class Main …...
Windows 环境下安装 Anaconda 并配置
安装Anaconda 1. 下载安装包 官网下载:https://www.anaconda.com/download/success 也可以从国内镜像仓库下载: 中国科学技术大学 https://mirrors.ustc.edu.cn/ 清华大学开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/ 2. 安装过程 双…...
大模型在尿潴留风险预测及围手术期方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与数据来源 二、大模型预测尿潴留的原理与方法 2.1 相关大模型介绍 2.2 模型构建与训练 2.3 模型评估指标与验证 三、术前尿潴留风险预测及方案制定 3.1 术前风险因素分析 3.2 大模型预测结果分析 3.3 …...
JavaScript 简单类型与复杂类型
在JavaScript中,根据数据存储的方式不同,变量可以分为两大类:简单类型(也称为基本数据类型或原始类型)和复杂类型(也称为引用数据类型)。理解这两者的区别对于编写高效且无误的代码至关重要。本…...
AI绘画软件Stable Diffusion详解教程(1):Windows系统本地化部署操作方法(专业版)
一、事前准备 1、一台配置不错的电脑,英伟达显卡,20系列起步,建议显存6G起步,安装win10或以上版本,我的显卡是40系列,16G显存,所以跑大部分的模型都比较快; 2、科学上网࿰…...
大白话Vue 双向数据绑定的实现原理与数据劫持技术
咱们来好好唠唠Vue双向数据绑定的实现原理和数据劫持技术,我会用特别通俗的例子给你讲明白。 啥是双向数据绑定 你可以把双向数据绑定想象成一个神奇的“同步器”。在网页里有两部分,一部分是数据,就像你记在小本本上的信息;另一…...
VUE 获取视频时长,无需修改数据库,前提当前查看视频可以得到时长
第一字段处 <el-table-column label"视频时长" align"center"> <template slot-scope"scope"> <span>{{ formatDuration(scope.row.duration) }}</span> </template> </el-ta…...
antv G6绘制流程图
效果图(优点:可以自定义每一条折线的颜色,可以自定义节点的颜色,以及折线的计算样式等): 代码: <!-- 流程图组件 --> <template><div id"container"></div>…...
完美隐藏滚动条方案 (2024 最新验证)
完美隐藏滚动条方案 (2024 最新验证) css /* 全局隐藏竖直滚动条但保留滚动功能 */ html {overflow: -moz-scrollbars-none; /* Firefox 旧版 */scrollbar-width: none; /* Firefox 64 */-ms-overflow-style: none; /* IE/Edge */overflow-y: overlay; …...
单片机的串口(USART)
Tx - 数据的发送引脚,Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平,起始位低电平,数据位有8位校验位,9位校验位,停止位是高电平保持一位或者半位,又或者两位的状态。 8位无校验位传输一个字节…...
实现分布式限流开源项目
以下是10个可以实现分布式限流中间件的开源项目推荐,这些项目基于不同的技术栈,适用于多种应用场景: 1. **Alibaba Sentinel** Sentinel 是阿里巴巴开源的分布式限流中间件,支持多种限流策略(如QPS、并发线程数等…...
递归构建行政区域树(二)
概述 这篇博客中构建出的行政区域树利用element-ui的Tree组件展示出来。 实现 源码位于码云,欢迎点击哦。 项目结构 最后 好久没写基于element-ui的项目了,都有点生疏了。 好了,如果对你有帮助,欢迎点个免费的赞哦。...
AR技术下的电商:虚拟试穿/试用/试戴成新风尚
随着科技的日新月异,增强现实(AR)技术正悄然改变着我们的生活,尤其在电子商务领域,AR技术的融入正掀起一场前所未有的变革。那么,AR技术究竟是何方神圣?它在电商领域又展现出了哪些非凡的应用呢…...
社群团购平台的愿景构建与开源链动2+1模式S2B2C商城小程序应用探索
摘要:在数字经济背景下,社群团购作为一种新兴的商业模式,凭借其独特的互动性和便捷性,展现出巨大的市场潜力。本文旨在探讨社群团购平台愿景的构建策略,并结合开源链动21模式S2B2C商城小程序的应用,为创业者…...
笔记20250225
关于上拉电阻和下拉电阻的作用 原理 上拉电阻:在上拉电阻所连接的导线上,如果外部组件未启用,上拉电阻则“微弱地”将输入电压信号“拉高”。当外部组件未连接时,对输入端来说,外部“看上去”就是高阻抗的,…...
RabbitMQ实战:插件扩展机制全解析——常用插件、安装启用、管理、生产推荐
RabbitMQ实战:插件扩展机制全解析——常用插件、安装启用、管理、生产推荐一、前言二、基础认知:RabbitMQ插件机制是什么2.1 插件定义2.2 插件核心特点2.3 插件扩展流程图三、RabbitMQ插件:安装、启用、禁用、管理全流程3.1 插件核心目录3.2 …...
瑞萨RZN2L EtherCAT从机配置全流程:从TwinCAT3驱动到IO测试(避坑指南)
瑞萨RZN2L EtherCAT从机配置实战:从环境搭建到IO测试的完整避坑手册 工业自动化领域的技术迭代从未停歇,而EtherCAT作为实时以太网通信协议中的佼佼者,其配置过程却常常让工程师们头疼不已。特别是当面对瑞萨RZN2L这样的工业级MPU时ÿ…...
【2026奇点智能技术大会权威解码】:AI原生数据结构生成的5大范式跃迁与工程落地路径
第一章:2026奇点智能技术大会:AI数据结构生成 2026奇点智能技术大会(https://ml-summit.org) 核心突破:语义驱动的数据结构合成引擎 本届大会首次公开发布StructGen v3.1——一个基于多模态推理与形式化约束求解的AI数据结构生成框架。它不…...
别再到处找下载链接了!Linux系统压力测试工具stress和stress-ng最新稳定版安装包获取指南
Linux系统压力测试工具stress与stress-ng权威获取指南 在Linux系统运维和性能调优领域,压力测试是不可或缺的环节。作为最常用的两款开源压测工具,stress和stress-ng能够模拟CPU、内存、IO等多种资源的高负载场景,帮助开发者验证系统稳定性。…...
HsMod:基于BepInEx的炉石传说功能增强插件完全指南
HsMod:基于BepInEx的炉石传说功能增强插件完全指南 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 想象一下,当你正在炉石传说中完成日常任务时,那些冗长…...
终极清净体验:3步告别Windows音量弹窗干扰的完整指南
终极清净体验:3步告别Windows音量弹窗干扰的完整指南 【免费下载链接】HideVolumeOSD Hide the Windows 10 volume bar 项目地址: https://gitcode.com/gh_mirrors/hi/HideVolumeOSD 开篇引子:那个总是在关键时刻跳出来的"不速之客" 想…...
Open WebUI:5分钟搭建你的专属AI助手,开启完全离线智能对话新时代
Open WebUI:5分钟搭建你的专属AI助手,开启完全离线智能对话新时代 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui Open WebUI是一款…...
如何3步永久备份你的QQ空间记忆:GetQzonehistory完全指南
如何3步永久备份你的QQ空间记忆:GetQzonehistory完全指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间里那些记录青春点滴的说说会随着时间流逝而消失…...
深入解析基4 Booth算法在定点乘法器中的高效实现
1. 从买菜到芯片:为什么需要基4 Booth算法? 记得我第一次接触乘法器设计时,脑子里全是菜市场阿姨算账的画面。比如买3斤苹果,每斤5元,阿姨会脱口而出"三五十五"。但在芯片世界里,这种简单的乘法却…...
STM32 HAL库实战:DMA串口通信避坑指南(附CubeMX配置)
STM32 HAL库实战:DMA串口通信避坑指南(附CubeMX配置) 1. 为什么DMA串口通信值得投入时间掌握? 第一次在STM32项目中使用DMA串口通信时,我盯着屏幕上的数据乱码整整调试了三天。直到发现CubeMX里那个不起眼的"Memo…...
