EasyExcel动态表头即动态数据生成

1️⃣ 业务需求

需要将数据库中的所有表放在一个下拉框中,下拉框支持模糊查询到相关的表,然后通过这个表名查询到数据库的数据,切换不同的表查询出来相关表的列和数据
需要注意的点: 1)js实现模糊搜索
           2)导出的表头和数据都是动态生成,切换a表就是导出a表的列和数据,切换b表就是b表的列和数据

2️⃣ 实现效果

选择一张表,查询出该表相关表头和数据

点击导出按钮,导出对应数据

选择另外一张表,查询出该表相关表头和数据

3️⃣ 查询实现

实现查询功能较为简单,就是后台查询表头列,然后js for循环实现列加入到table中

js部分

4️⃣ 导出实现(重点)

首先我用的框架即版本
  spring + mybatis + springmvc + easyexcel实现导出功能,除了easyexcel版本有需要注意,其他的自行版本对应;easyexcel的版本为:

  因为easyexcel对poi版本有版本对应,所以你的poi需要升级,poi版本为:

下图为官网版本对应:

接下来就是具体实现过程

这里需要注意的是,registerConverter方法,这个是一个自定义转换器,是用来转换mybatis的hashmap集合,转换的原因是:
  由于表格是动态的,他的数据以及表头都是根据你选择的表名来变化的,所以无法定义具体的实体类,所以mybatis那里我们只能写成Map而不是具体的entity

  easyexcel导出是不支持hashmap(mybatis,Map会自动转换为hashmap)的,会报一个转换错误的错,所以我们这里需要写转换器
转换器的具体实现:

最后最麻烦的就是数据结构:

最终通过不停的尝试,发现数据结构显示为上图,才会将数据导出来,但是又衍生出来了一个问题,数据导出来的,但是表名和数据匹配是乱的,所以还需要最后的一步就是将字段名和数据列对应
这里我的实现方法是直接循环hashmap,key为头,value为数据,然后各自进一步封装数据结构

5️⃣ 实现代码

接口实现类和mybatis xml的代码就不贴了,就是查询数据库sql,较简单
  // 表头
  List<List<String>> listHead = new ArrayList<>();

//导出功能 easyexcel 动态头导出
@RequestMapping(value = "/export", method = RequestMethod.GET)
public void export(HttpServletResponse response, HttpServletRequest request) throws UnsupportedEncodingException { try { response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setCharacterEncoding("UTF-8"); String fileName = URLEncoder.encode("test", "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); String tableName = request.getParameter("tableName"); EasyExcel.write(response.getOutputStream())
.registerConverter(new config())
.head(head1(tableName)).sheet("模板")
.doWrite(data(tableName
)); // 每次导出完清空listHead
listHead.clear(); } catch (Exception e) { e.printStackTrace(); } } private List<List<String>> head1(String tableName) { return listHead; } private List<List<Object>> data(String tableName) { // 表格的动态表头
List<String> head = new ArrayList<>();
// 表格内的数据
List<Map<String, Object>> dataHead = DataSelectService.findAllMap(tableName); List<List<Object>> list = new ArrayList<>(); Map<String, Object> mapData = new HashMap<>();
// 取出表头
for (int i = 0; i < dataHead.size(); i++) { mapData = dataHead.get(0); } for (String key :
mapData.keySet()) { head.add(key); } for (Map<String, Object> map :
dataHead) { List<Object> list1 = new ArrayList<>(); for (String key :
map.keySet()) { list1.add(map.get(key)); } list.add(list1); } System.out.println("list" + list); for (String s :
head) {
listHead.add(Collections.singletonList(s));
} return list; }
自定义转换器config
package com.tiancom.pas.dataSelect.config;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.WriteCellData; import java.util.HashMap; /**
* @Author : YuanXin
* @create 2023/12/7 11:34
* @Description : 转换器
*/
public class config implements Converter<HashMap<String, Object>> { @Override
public Class<HashMap> supportJavaTypeKey() {
return HashMap.class;
} @Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
} /**
* 这里是写的时候会调用。/
*/
@Override
public WriteCellData<HashMap<String,Object>> convertToExcelData(WriteConverterContext<HashMap<String, Object>> context) { return new WriteCellData<HashMap<String,Object>>(String.valueOf(context.getValue())); } }

easyexcel只通过表名来动态查询并动态导出数据的更多相关文章

  1. MYSQL中只知表名查询属于哪个SCHEMA

    只知道表名XXX查该表属于哪个schema.以及该表有哪些列等信息 SELECT * from information_schema.columns WHERE table_name = 'xxx'; ...

  2. sql查询所有表以及表名的模糊查询

    --1.查看所有表名:select name from sysobjects where type='U'--2.查找包含用户的表名,可通过以下SQL语句实现, Select * From sysob ...

  3. EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性

    创建动态查询 想在项目中实现一个灵活的动态查询类,参考http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html和http://www.cnb ...

  4. [Database] 不知道表名和字段查找值=1234的数据.

      --如果表比较大,时间会比较长 DECLARE @searchValue NVARCHAR(50) SET @searchValue='1234' DECLARE @t TABLE ( rowNu ...

  5. PHP+Mysql+easyui点击左侧tree菜单对应表名右侧动态生成datagrid加载表单数据(二)

    关于tree菜单生成,参考我的另一篇博文地址tree 菜单 实现功能:点击左侧tree菜单中的table,右侧通过datagrid加载出该表对用的所有数据 难点:获取该表的所有列名,动态生成datag ...

  6. oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)

    语句的执行环境是plsql的sql窗口, 语句的目的是从整个数据库中的所有表判断 不等于某个字段的记录数 . 代码如下: declare s_sql clob:=''; -- 声明一个变量,该变量用于 ...

  7. 使用SQL查询所有数据库名和表名

    使用SQL查询所有数据库名和表名 MySQL中查询所有数据库名和表名 查询所有数据库 show databases; 1 1 查询指定数据库中所有表名 select table_name from i ...

  8. MySQL 查询某个数据库中所有包含数据记录的表名

    MySQL 查询某个数据库中所有包含数据记录的表名 有时根据实际应用需要,需要对数据进行备份. 如果一个数据库中有很多数据表,但是只想备份包含数据记录的那些表数据(空表不做数据备份). 如果通过如下S ...

  9. [转载] SQL获取所有数据库名、表名、储存过程以及参数列表

    查询一个数据库中所有表字段属性的sql语句       1.获取所有用户名: SELECT name FROM Sysusers where status='2' and islogin='1' is ...

  10. MySQL,SQLSERVER,ORACLE获取数据库表名及字段名

    1.MySQL 获取表名: 用“show tables”命令.在程序中也可以采用该命令获取,在返回的RowSet中的“Tables_in_db”读出来.其中“db”是指你的数据库的名称,比如说Tabl ...

随机推荐

  1. 从各方面比较下kafka、activemq、rabbitmq、rocketmq之间的区别

    [消息队列]从各方面比较下kafka.activemq.rabbitmq.rocketmq之间的区别   一.单机吞吐量ActiveMQ:万级,吞吐量比RocketMQ和Kafka要低了一个数量级Ra ...

  2. 特色国风数字孪生智慧大坝 3D 可视化

    前言 水利兴,五谷丰.水利作为国民经济稳定和谐的重要部分,不仅有防洪减灾.农业灌溉.城市供水调水.渔业外贸.旅游航运.生态环境等综合应用,水电资源也是至关重要的可持续能源之一.大坝与水库.水电站等水利 ...

  3. 机器学习-线性分类-支持向量机SVM-SMO算法-14

    目录 1. SVM算法总结 2. SMO算法 1. SVM算法总结 选择 核函数 以及对应的 超参数 为什么要选择核函数? 升维 将线性问题不可分问题 升维后转化成 线性可分的问题 核函数 有那些? ...

  4. 深入理解Kafka核心设计及原理(一):初识Kafka

    转载请注明出处: 1.1 kafka简介 Kafka 起初是由 Linkedin 公司采用 Scala 语言开发的一个多分区.多副本且基于 ZooKeeper协调的分布式消息系统,现己被捐献给 Apa ...

  5. Redis服务端辅助的客户端缓存机制

    一.背景和问题 二.Redis6 的解决方案及原理 2.1 服务端支持客户端缓存的两种模式 1. 默认模式 2. 广播模式 2.2 客户端实现的两种连接模式 1. 使用同一连接 2. 使用不同连接 3 ...

  6. WPF|如何在 WPF 中设计漂亮的社交媒体信息仪表板

    1. 效果展示 先来直接欣赏效果: 2. 准备 创建一个WPF工程,比如站长使用 .NET 7 创建名为 Dashboard3 的WPF项目,添加一些图片资源,项目目录如下: 2.1 图片资源 可在网 ...

  7. 基于AHB_BUS的eFlash控制器设计-01

    基于AHB-BUS的eflash控制器设计 SRAMC是单周期的读写,控制比较简单,没有状态机也没有软硬件的协同 eflash是非易失性的存储器,可以进行读写擦除,它也是一个基于AHB_slave的模 ...

  8. [转帖]TNS-12535 TNS-00505的处理方法

    硬件说明: 操作系统版本:ORACLE LINUX 6.3  64位 数据库版本:11.2.0.3   64位 问题说明: 在检查数据库的alert日志的时候,发现大量的12170和TNS-12535 ...

  9. [转帖]MobaXterm激活专业版

      本文思路来自 https://github.com/flygon2018/MobaXterm-keygen 有python 环境 并且不看英文的可以继续往下 不然直接访问这个地址也行. 1.需要一 ...

  10. [转帖]Postmark - 存储性能测试工具

    1. 引言 Postmark是由著名的NAS提供商NetApp开发,用来测试其产品的后端存储性能. Postmark主要用于测试文件系统在邮件系统或电子商务系统中性能,这类应用的特点是:需要频繁.大量 ...