当前位置: 首页 > news >正文

动态表头导出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. 关键点说明

  1. 动态表头

    • 通过 buildHead() 方法将前端传递的 headers 转换为 EasyExcel 需要的 List<List<String>> 格式。
  2. 动态数据

    • 通过 buildData() 方法,根据 headers 中定义的 field 字段顺序,从 data 中提取对应值,构建数据行。
  3. 流式导出

    • 使用 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. 扩展优化

  • 字段校验:确保前端传递的 fielddata 中存在对应值。
  • 大数据量分页:如果数据量过大,可分页查询后分批写入。
  • 自定义样式:通过 WriteHandler 动态设置单元格样式(如字体、颜色)。

通过这种方式,无需定义实体类即可实现完全动态的 Excel 导出功能,表头和字段完全由前端控制。

相关文章:

动态表头导出EasyExcel

在 Spring Boot 中结合 EasyExcel 实现动态表头导出&#xff08;无实体类&#xff0c;表头和字段&#xff08;前端传表名&#xff0c;字段值动态查询&#xff0c;返回List<Map<String,Object>>&#xff09;由前端传递&#xff09;可以通过以下步骤实现。以下是完整…...

【前端】react+ts 轮播图的实现

一、场景描述 在很多网站的页面中都有轮播图&#xff0c;所以我想利用react.js和ts实现一个轮播图。自动轮播图已经在前面实现过了&#xff0c;如&#xff1a;https://blog.csdn.net/weixin_43872912/article/details/145622444?sharetypeblogdetail&sharerId145622444&a…...

清华大学出品DeepSeek 四部教程全收录(附下载包),清华deepseek文档下载地址

文章目录 前言一、清华大学deepseek教程&#xff08;四部&#xff09;二、清华大学deepseek教程全集1.清华大学第一版《DeepSeek&#xff1a;从入门到精通》2.清华大学第二版《DeepSeek赋能职场》3.清华大学第三版《普通人如何抓住DeepSeek红利》4.清华大学第四版&#xff1a;D…...

Android 布局系列(三):RelativeLayout 使用指南

引言 在 Android 开发中&#xff0c;布局管理是构建用户界面的核心。RelativeLayout 曾经是 Android 中非常流行的一种布局方式&#xff0c;广泛应用于各种项目中。它通过相对位置关系组织视图元素&#xff0c;使得我们可以根据父容器或者其他视图的位置来灵活调整子视图的布局…...

ubuntu20.04音频aplay调试

1、使用指定声卡&#xff0c;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&#xff0c;可以通过arecord -l获取 -f 录音格式 S16_LE…...

前缀和代码解析

前缀和是指数组一定范围的数的总和,常见的有两种,一维和二维,我会用两道题来分别解析 一维 DP34 【模板】前缀和 题目: 题目解析: 暴力解法 直接遍历数组,遍历到下标为 l 时,开始进行相加,直到遍历到下标为 r ,最后返回总和.这样做的时间复杂度为: O(n) public class Main …...

Windows 环境下安装 Anaconda 并配置

安装Anaconda 1. 下载安装包 官网下载&#xff1a;https://www.anaconda.com/download/success 也可以从国内镜像仓库下载&#xff1a; 中国科学技术大学 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中&#xff0c;根据数据存储的方式不同&#xff0c;变量可以分为两大类&#xff1a;简单类型&#xff08;也称为基本数据类型或原始类型&#xff09;和复杂类型&#xff08;也称为引用数据类型&#xff09;。理解这两者的区别对于编写高效且无误的代码至关重要。本…...

AI绘画软件Stable Diffusion详解教程(1):Windows系统本地化部署操作方法(专业版)

一、事前准备 1、一台配置不错的电脑&#xff0c;英伟达显卡&#xff0c;20系列起步&#xff0c;建议显存6G起步&#xff0c;安装win10或以上版本&#xff0c;我的显卡是40系列&#xff0c;16G显存&#xff0c;所以跑大部分的模型都比较快&#xff1b; 2、科学上网&#xff0…...

大白话Vue 双向数据绑定的实现原理与数据劫持技术

咱们来好好唠唠Vue双向数据绑定的实现原理和数据劫持技术&#xff0c;我会用特别通俗的例子给你讲明白。 啥是双向数据绑定 你可以把双向数据绑定想象成一个神奇的“同步器”。在网页里有两部分&#xff0c;一部分是数据&#xff0c;就像你记在小本本上的信息&#xff1b;另一…...

VUE 获取视频时长,无需修改数据库,前提当前查看视频可以得到时长

第一字段处 <el-table-column label"视频时长" align"center"> <template slot-scope"scope"> <span>{{ formatDuration(scope.row.duration) }}</span> </template> </el-ta…...

antv G6绘制流程图

效果图&#xff08;优点&#xff1a;可以自定义每一条折线的颜色&#xff0c;可以自定义节点的颜色&#xff0c;以及折线的计算样式等&#xff09;&#xff1a; 代码&#xff1a; <!-- 流程图组件 --> <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 - 数据的发送引脚&#xff0c;Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平&#xff0c;起始位低电平&#xff0c;数据位有8位校验位&#xff0c;9位校验位&#xff0c;停止位是高电平保持一位或者半位&#xff0c;又或者两位的状态。 8位无校验位传输一个字节…...

实现分布式限流开源项目

以下是10个可以实现分布式限流中间件的开源项目推荐&#xff0c;这些项目基于不同的技术栈&#xff0c;适用于多种应用场景&#xff1a; 1. **Alibaba Sentinel** Sentinel 是阿里巴巴开源的分布式限流中间件&#xff0c;支持多种限流策略&#xff08;如QPS、并发线程数等…...

递归构建行政区域树(二)

概述 这篇博客中构建出的行政区域树利用element-ui的Tree组件展示出来。 实现 源码位于码云&#xff0c;欢迎点击哦。 项目结构 最后 好久没写基于element-ui的项目了&#xff0c;都有点生疏了。 好了&#xff0c;如果对你有帮助&#xff0c;欢迎点个免费的赞哦。...

AR技术下的电商:虚拟试穿/试用/试戴成新风尚

随着科技的日新月异&#xff0c;增强现实&#xff08;AR&#xff09;技术正悄然改变着我们的生活&#xff0c;尤其在电子商务领域&#xff0c;AR技术的融入正掀起一场前所未有的变革。那么&#xff0c;AR技术究竟是何方神圣&#xff1f;它在电商领域又展现出了哪些非凡的应用呢…...

社群团购平台的愿景构建与开源链动2+1模式S2B2C商城小程序应用探索

摘要&#xff1a;在数字经济背景下&#xff0c;社群团购作为一种新兴的商业模式&#xff0c;凭借其独特的互动性和便捷性&#xff0c;展现出巨大的市场潜力。本文旨在探讨社群团购平台愿景的构建策略&#xff0c;并结合开源链动21模式S2B2C商城小程序的应用&#xff0c;为创业者…...

笔记20250225

关于上拉电阻和下拉电阻的作用 原理 上拉电阻&#xff1a;在上拉电阻所连接的导线上&#xff0c;如果外部组件未启用&#xff0c;上拉电阻则“微弱地”将输入电压信号“拉高”。当外部组件未连接时&#xff0c;对输入端来说&#xff0c;外部“看上去”就是高阻抗的&#xff0c…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...