基于springboot的动态表头excel导出

EasyExcel实现动态表头功能 阅读详情

一,背景

        在项目里面基本上,只要遇到报表或者数据表格都需要进行导出,每个页面写一个导出方法又太麻烦。经过多个项目的练手,我觉得需要把导出方法进行封装或者说模块化,这样无论是前端调用还是后端调用都只需要提供表头和数据,就可以进行excel的导出不必一个页面写一个导出。

二,模块化逻辑

        只要是excel的导出必定有表头,数据内容,那么调用导出模块时只需要两种数组,①表头部分,②数据部分  表头和数据都是动态的 这样就实现了动态表头功能 

请求示例
     {
              //表头
          "table_name_head": [
        {
            "label": "经销商编码",
            "key": "dealer_code"
        },
        {
            "label": "经销商名称",
            "key": "dealer_name"
        },
        {
            "label": "创建人",
            "key": "create"
        },
        {
            "label": "地区",
            "key": "region"
        }
    ],
   //excel数据
        "data": [
   {
     "dealer_code": "5645343",
     "dealer_name": "xxxxxx",
     "create": "JNJX",
     "region": "North"
     }
     ]
     }
    

三,通用导出模块代码

模块使用了三个参数 

ExcelUtil.exportExcel("excelTemplate",map,response);
excelTemplate //模板名称
map // 里面存在两个元素 表头数组 ,数据数组
response //HttpServletResponse
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * @PACKAGE_NAME: com.spike.util.controller
 * @USER: spike
 * @DATE: 2023/4/27 15:46
 * @PROJECT_NAME: Springcolud_Spike
 */
@Slf4j
public class ExcelUtil {

    /**
     * 判断excel文件类型正则表达式
     */
    private static final String IS_EXCEL = "^.+\\.(?i)((xls)|(xlsx))$";

    /**
     * 判断是否为 xls后缀版本的excel
     */
    private static final String IS_XLS_EXCEL = "^.+\\.(?i)(xls)$";

    /**
     * 存放excel模板的目录
     */
    private static final String CLASS_PATH = "templates/excel/";
    
    /**
     * 动态表头
     */
    public static final String TABLE_NAME_HEAD = "table_name_head";

    public static final String LABEL = "label";

    public static final String KEY = "key";

    public static void exportExcel(String execlTempleName, Map<String, Object> map, HttpServletResponse response) throws Exception {
        ExcelUtil.ExcelTemplate excelTemplate = ExcelUtil.ExcelTemplate.init(execlTempleName + ".xlsx");
        Workbook workbook = excelTemplate.getWorkbook();
        Sheet sheetAt = workbook.getSheetAt(0);
        //获取动态表头
        if (map.get(TABLE_NAME_HEAD) == null || !(map.get(TABLE_NAME_HEAD) instanceof List)) {
            log.info("动态标题格式异常,导出失败!");
            return;
        }
        //动态表头
        List<Map<String, Object>> tableHead = (List<Map<String, Object>>) map.get(TABLE_NAME_HEAD);
        //设置表头
        Row tempRow = sheetAt.createRow(0);
        int col = 0;
        for (Map<String, Object> tableHeadMap: tableHead) {
            String tableName = tableHeadMap.get(LABEL).toString();
            tempRow.createCell(col++).setCellValue(tableName);
        }
        //填充表内容
        int rowValue = 1;
        //创建数据行
        if (map.get("data") == null || !(map.get("data") instanceof List)) {
            log.info("数据格式异常,导出失败!");
            return;
        }
        List<Map> dataList = (List<Map>) map.get("data");
        Row row = sheetAt.createRow(rowValue);
        for (Map dataMap : dataList) {
            row = sheetAt.createRow(rowValue);
            col = 0;
            for (Map<String, Object> tableHeadMap : tableHead) {
                String fileName =  tableHeadMap.get(KEY).toString();
                String value = dataMap.get(fileName) != null ? dataMap.get(fileName).toString() : "";
                if(!value.isEmpty()&& Pattern.matches("[-]?[0-9]*[.]?[0-9]*",value)){
                    row.createCell(col).setCellType(CellType.NUMERIC);
                    double dobValue= Double.valueOf(value);
                    row.createCell(col++).setCellValue(dobValue);
                }else {
                    row.createCell(col).setCellType(CellType.STRING);
                    row.createCell(col++).setCellValue(value);
                }
            }
            rowValue = rowValue + 1;
        }
        String fileName = "DFlow" + System.currentTimeMillis();
        excelTemplate.export(response, fileName);
        return;
    }

    /**
     * 获取response输出流
     *
     * @param fileName 文件名
     * @param response 响应体
     * @return OutputStream
     */
    private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {
        try {
            fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
            response.setContentType("octets/stream");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ";" + "filename*=utf-8''" + fileName);
            return response.getOutputStream();
        } catch (IOException e) {
            log.error("设置excel输出流异常!文件名:{}", fileName, e);
            throw e;
        }
    }

    /**
     * 构建 Workbook 对象
     *
     * @param templateName 模板文件名
     * @return Workbook
     */
    public static Workbook buildWorkbook(String templateName) throws Exception {
        Workbook workbook;
        try {
            if (templateName.matches(IS_EXCEL)) {
                // 得到文件输入流对象
                InputStream inputStream = ExcelUtil.class.getClassLoader().getResourceAsStream(CLASS_PATH + templateName);
                if (inputStream == null) {
                    throw new Exception("找不到excel模板文件");
                }

                boolean isXlsExcel = templateName.matches(IS_XLS_EXCEL);
                // 创建工作簿,并传递要读取的文件
                workbook = isXlsExcel ? new HSSFWorkbook(inputStream) : new XSSFWorkbook(inputStream);
                inputStream.close();
            } else {
                throw new Exception("文件格式不是xls或xlsx");
            }
            return workbook;
        } catch (Exception e) {
            log.info("获取Workbook对象异常!msg:{}", e.getMessage(), e);
            throw e;
        }

    }

    /**
     * excel 模板类
     */
    public static class ExcelTemplate {

        private Workbook workbook;

        /**
         * 通过文件名称读取模板文件并初始化ExcelTemplate对象
         *
         * @param fileName 模板文件名
         * @return ExcelTemplate
         */
        public static ExcelTemplate init(String fileName) throws Exception {
            ExcelTemplate excelTemplate = new ExcelTemplate();
            Workbook workbook = ExcelUtil.buildWorkbook(fileName);
            excelTemplate.setWorkbook(workbook);
            return excelTemplate;
        }

        /**
         * 导出excel
         *
         * @param response     响应体
         * @param newExcelName 自定义导出excel的文件名
         */
        public void export(HttpServletResponse response, String newExcelName) throws Exception {
            OutputStream out = null;
            try {
                out = getOutputStream(newExcelName, response);
                ByteArrayOutputStream ops = new ByteArrayOutputStream();
                workbook.write(ops);
                out.write(ops.toByteArray());
            } finally {

                try {
                    if (out != null) {
                        out.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }

        public void setWorkbook(Workbook workbook) {
            this.workbook = workbook;
        }

        public Workbook getWorkbook() {
            return workbook;
        }
    }
}

maven依赖 

 <!--execl依赖-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

导出模块使用的是模板填充 所以还需要在resources 下面添加空白的excel模板

 新建一个excel文件作为模板即可

        基本的导出模块已经完成 只需要把导出模块放在工具类中,在service中调用就可以了(也可以把接口放开直接让前端传动态表头和需要导出的数据),非常方便摸鱼

EasyExcel导出-动态表头:样式、合并单元格 WriteSheet writeSheet1 = EasyExcel.writerSheet("测试sheet").build();//表头合并策略 LongestMatchColumnWidthStyleStrategy.java (alibaba有提供)String destFilePath = "D:\\download\\chrome\\导出\\";//表头样式 HeadCellStyleStrategy.java。// 设置表头单元格背景颜色为黄色。//导出文件地址及名称。 阅读详情

相关推荐

Spring Boot 数据导出实战:EasyExcel + 动态表头,搞定 Excel/CSV 批量导出(企业级落地)

本文聚焦 Spring Boot 生态下的数据导出需求,以 “智能图书管理系统” 为案例,核心围绕阿里开源框架 EasyExcel,解决传统 POI 导出存在的内存溢出(OOM)、代码繁琐、格式混乱等痛点,提供企业级落地方案。 文章先对比 EasyExcel 与传统 POI 的优势,强调其 “低内存占用、注解驱动、Spring Boot 无缝适配” 的核心特性;随后通过实操落地四大核心场景:单 sheet 基础导出(含表头映射、数据格式化、样式自定义)、多 sheet 导出(图书列表 + 借阅记录)、动态表

lamehsl的专栏 1098

springboot整合easyexcel进行动态表头导出

springboot整合easyexcel进行动态表头导出~

Think_and_work的博客 1475

springboot使用freemarker进行复杂Excel导出(多sheet页)

springboot使用freemarker模板进行复杂Excel导出

吗喽的博客 2382

SpringBoot:EasyExcel动态字段(不创建对象)多sheet、多文件|压缩包格式导出

EasyExcel动态字段(不创建对象)多sheet、多文件|压缩包格式导出

白面小生的博客 1570

Springboot Excel 最简单的 多sheet表 导入导出

Springboot Excel 最简单的 多sheet表 导入导出

默默不代表沉默 4517

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》

认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。

那谁的博客 5913

springboot+easypoi模板导出Excel 动态表头+多表格(一个sheet)

1.需求:导出的数据如下图所示 其中表头中的仓库 集散地是是动态生成的。 首先制作Excel模板: 代码: @Resource private RedisService redisService; @Override public void assignModel(EventInfo info, HttpServletResponse response) { AssginModelRes res=new AssginModelRes(); Object obj = redisServ

weixin_42156018的博客 4658

AI视频生成技术研究报告:现状、挑战与展望

AI 视频生成技术概述:介绍 AI 视频生成技术的基本概念,回顾其发展历程,从早期依赖图像拼接的简单生成方式,到如今融合多种先进技术的复杂模型应用,梳理技术演进的关键节点和重要突破。同时,分析该技术在当前阶段的特点,包括生成视频的质量、速度、灵活性等方面,以及与传统视频制作方式的差异,阐述 AI 视频生成技术如何改变视频创作的流程和模式。技术实现路径分析。

daqsdfas的博客 4576

使用 Spring Boot 和 EasyExcel 进行动态表头导出 Excel

通过本文的介绍,我们学习了如何使用 Spring Boot 和 EasyExcel 进行动态表头的 Excel 导出。EasyExcel 提供了强大的功能和简洁的 API,使得 Excel 导出变得非常简单。希望这篇文章对大家有所帮助!

dream_snow2012的专栏 1217

保姆级教程如何进行本地局域网布署openclaw小龙虾

全网唯一一篇一步步实战教程,图文并茂方式的方式教你如何本地部署安装小龙虾openclaw

zzw17wei的专栏 1467

Python 爬虫实战:arXiv 学术论文 PDF 批量下载(含反爬策略与文件命名规范)

arXiv 是全球最大的免费开放预印本论文平台之一,涵盖物理学、数学、计算机科学等多个学科领域。研究人员、学生和工程师常常需要批量下载论文 PDF 进行文献综述、构建机器学习数据集或进行文本挖掘研究。然而,手动逐篇下载论文效率低下,因此开发一个自动化批量下载工具显得尤为重要。

yansideyucsdn的博客 1817

SpringBoot + hutool工具 实现动态表头导出Excel

动态表头定位:前端导出Excel时,选择需要导出的字段。 实现思路:使用 自定义注解 ,映射 实体类字段和表头名称,再通过反射获取到实体类的自定义注解,对比 前端带过来的 表头集合,通过 hutool导出功能实现。 导入 相关依赖 <!-- hutool 工具依赖 --> <dependency> <groupId>cn.hutool</groupId> <

qq_44136551的博客 1万+

【LLM技术全景】规模定律与模型演进:为什么模型越大越强?

规模定律性能 ∝ 参数量^N性能 ∝ 数据量^M性能 ∝ 计算量^L其中 N, M, L 是小于1的正数(通常0.05~0.15)关键观察损失与规模的关系呈幂律(不是线性,也不是对数)三个要素(参数、数据、计算)需要协调增长只增加其中一个要素,收益会边际递减规模定律(Scaling Law):1. 模型性能与参数量、数据量、计算量呈幂律关系2. Kaplan定律(2020):参数量是主要因素3. Chinchilla定律(2022):数据和参数同等重要,最优比例1:20。

专注:太空算力、AI infra、异构调度、大模型成本工程 495

基于EasyExcel实现动态表头导出

在众多Excel数据导入导出的应用场景中,对Excel表头进行动态处理已成为一种常见需求。这种动态表头的处理方式,不仅需要灵活适应不同数据结构的变化,还要确保在导入和导出过程中保持数据的准确性和完整性。为了应对这一挑战,我们选择了EasyExcel作为解决方案,它为我们提供了高效而强大的工具来实现动态表头的导入和导出功能。通过这种高端的技术手段,我们能够更加轻松地应对各种复杂的数据处理需求,为业务的发展提供了更加稳健和可靠的支持。

Lansluo的博客 4146

手把手教你安装 OpenClaw 小龙虾(MAC安装教程),一次成功不踩坑

本文详细介绍了在Mac上安装OpenClaw的完整流程。主要内容包括:1)准备工作(磁盘空间、网络环境、终端工具);2)安装Homebrew包管理器及常见问题解决;3)安装Node.js 22+版本(环境核心);4)Git安装与验证;5)OpenClaw项目克隆、依赖安装及运行配置;6)大模型配置方法(以MiniMax为例)。文章提供了详细的命令行操作步骤和常见错误解决方案,特别强调了网络环境要求和Apple Silicon芯片的原生支持注意事项。最后展示了验证配置成功的方法和资源获取渠道。

Chengbei11的博客 6340

【OpenClaw从入门到精通】第19篇:OpenClaw电商实战:从零搭建比价+库存监控+自动调价全自动化系统(2026实测附完整代码)

2026年OpenClaw成为全球最火开源项目,电商行业因其场景高频、数据标准化成为其核心落地领域。本文针对电商从业者面临的比价繁琐、库存混乱、调价滞后三大痛点,基于OpenClaw的“接入层-执行层-决策层”三层架构,从零拆解智能比价、多平台库存监控、动态自动调价三大核心场景的实现逻辑。文中包含完整的环境配置、技能安装、代码实现(含Python脚本与YAML配置)、执行结果验证,同时补充关键算法原理与避坑指南,兼顾新手入门与进阶提升。读者可直接参考本文实操流程,快速搭建属于自己的电商自动化系统,实现7×2

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2238

SpringBoot实战:用EasyExcel 3.1.0实现复杂Excel模板导出(含动态表头+多sheet填充)

本文详细介绍了在SpringBoot项目中使用EasyExcel 3.1.0实现复杂Excel模板导出的实战方法。针对动态表头、多sheet填充、样式继承等核心痛点,提供了从模板设计、代码实现到性能优化的完整解决方案,帮助开发者大幅提升报表开发效率与维护性。

dapp9builder的博客 251

从win系统远程使用服务器中的nsight system、nsight compute

本文介绍了如何在Windows系统中远程使用服务器上的Nsight System和Nsight Compute工具。主要内容包括:1)双系统同步安装相同版本的Nsight工具,配置环境变量;2)命令行生成profile文件或直接运行分析;3)Windows远程连接服务器的配置方法;4)解决权限问题的具体方案,如修改文件夹权限或调整NVIDIA驱动配置。文章提供了详细的安装步骤和常见问题解决方案,适用于需要进行GPU性能分析和调试的开发人员。

Justinyh的博客 401

easypoi 表头数据导入_easypoi导出动态表头excel

easypoi导出动态表头excel1: springBoot项目maven依赖:cn.afterturneasypoi-spring-boot-starter4.1.2根据自己的poi版本选择cn.afterturneasypoi-spring-boot-starter3.3.0测试导出(数据组装如下):@Testpublic voiddynaCol() {try{List colList = ...

weixin_39555715的博客 1674

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

EasyExcel解析动态表头及导出

excel文件导入及导出,是日常开发中经常遇到的需求。本次笔者以EasyExcel为例,针对在项目中遇到的动态表头解析及导出的场景,详细介绍具体的代码实现过程。以上便是EasyExcel解析动态表头及导出的整个过程。在使用过程中,笔者的感受是,上手难度很低,很适合新手去做简单的表格解析,当然,如果你的需求有复杂的格式,EasyExcel也提供了api,能够很好的满足需要。

yupengfei112233的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

springboot 之 使用easyexcel导出数据到多个sheet,动态表头,自动计算列宽

easyexcel导出多sheet,动态表头,自动列宽

enjoy.day 1006

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

EasyExcel 动态表头生成且带合并

EasyExcel尝试EasyExcel下载源码及demo打开官网参考应用中需要导出的格式我的demo尝试springboot 项目pom.xml引入依赖来个例子官网的demo先跑跑自己搞一下 EasyExcel 原来写EXCEL导出用的是POI,如果遇到复杂些的EXCEL导出,各路合并计算单元格超级累无比啊!!万一数学幼儿园毕业的,经常数错!年前给组内同学推荐了阿里的EasyExcel,在CSD...

傲视苍穹 2万+

springboot3生成动态表头(动态列)的excel

【代码】springboot3生成动态表头(动态列)的excel。

Chenxuhui125的博客 517

SpringBoot项目整合EasyExcel:5分钟搞定Excel导入导出功能(动态表头+数据校验)

本文详细介绍了如何在SpringBoot项目中整合EasyExcel,快速实现Excel导入导出功能,包括动态表头生成、数据校验和前后端协同。通过实战案例展示如何优化内存使用、处理百万级数据导出,并解决常见问题,提升开发效率。

weixin_42520025的博客 426

SpringBoot 企业级 Excel 导入导出实战:注解式表头+字典转换+下拉校验+大数据量异步方案

深度拆解企业级 Excel 导入导出的完整设计。基于 FastExcel 封装 ExcelUtils 三行搞定导出,@ExcelProperty 注解式表头、DictConvert 字典码值互转、@ExcelColumnSelect 下拉框校验、导入模板下载、导入结果统计(成功/失败明细),并给出百万级数据的流式分批、动态表头、异步导出 + 下载中心的进阶方案,把"手撸 POI、内存溢出、码值乱码、导入无校验"的老问题一次讲透。

RuoYi Office是基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue3 + Vben Admin + Uniapp 构建的中小企业全业务办公一体化平台,涵盖OA 协同 880

SpringBoot整合EasyExcel实战:多Sheet导出学生成绩表(附完整源码)

本文详细介绍了SpringBoot整合EasyExcel实现多Sheet导出学生成绩表的实战教程。通过EasyExcel的高效数据处理能力,解决传统POI的内存溢出问题,涵盖动态表头配置、浏览器文件下载优化等核心功能,并提供完整源码和性能优化建议,助力开发者快速实现Excel报表导出需求。

weixin_30839881的博客 259
上一篇: vsftp docker安装和用户校验无法通过问题解决
下一篇: UDP打洞,内网穿透(附JAVA代码)
FOT-Spike
博客等级 码龄8年 295粉丝 5原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值