首页 > 其他分享 >easyexcel只通过表名来动态查询并动态导出数据

easyexcel只通过表名来动态查询并动态导出数据

时间:2023-12-18 11:45:53浏览次数:27  
标签:String tableName easyexcel 导出 表头 表名 new 动态

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()));


    }


}

标签:String,tableName,easyexcel,导出,表头,表名,new,动态
From: https://www.cnblogs.com/preciouslove/p/17894921.html

相关文章

  • 动态规划进阶
    数位DP常见的模板:询问\(l\simr\)中有多少个满足给定条件的数,\(1\lel\ler\le10^{18}\)。这种问题,数位DP可以做到\(O(\logv)\)级别,其中\(v\)是\(l,r\)的值域。思路直接枚举会枚举大量不可能满足条件的数,可以从数位入手。数位DP的算法流程如下:几个定义:\(len(......
  • js动态加载
    <scripttype="text/javascript">//动态加载js(顺序执行js)functionloadScript(url,callback){varscript=document.createElement("script")script.type="text/javascript";if(script.readyState){//IE......
  • 动态绘制svg
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=......
  • 非动态数组版本下的筛选
    问题:一对多查找(筛选)的结果需要横向排列,但是表格暂时不支持动态数组。右拉下拉公式解决:{=IFERROR(INDEX(FILTER($E:$E,$D:$D=$G2),COLUMN(A1)),"")}公式中的Filter部分筛选出满总D列中等产于G2对应E列的内容,其结果是多个单元格组成的数组。使用Index提取数组中的内容,第......
  • VUE框架指令语法与v-bind实现标签属性内部动态------VUE框架
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • Threejs利用着色器编写动态飞线特效
    一、导语动态飞线特效是可视化数据地图中常见的需求之一,鼠标点击的区块作为终点,从其他区块飞线至点击区块,附带颜色变换或者结合粒子动画二、分析利用创建3点来构成贝塞尔曲线,形成线段利用着色器材质来按照线段以及时间点变化来变化线段的颜色形成动画三、上基础代码//贝塞尔曲线......
  • 免杀-绕过静态动态查杀
    前言在我们后渗透时很多时候需要使用到一些敏感的工具,而这些工具大多都被360等杀软厂商标记。导致我们传入的工具无法执行或执行时被拦截。接下来以测试工具mimitakz为例演示如何绕过这些杀软拦截,躲避查杀等。以下为具体开发细节,程序执行时杀软拦截360静态查杀何为"静态查......
  • Golang 配置文件动态更变(viper)
    一.下载包gogetgithub.com/spf13/viper二.源码1funcLoadConf(fpnamestring){2ini:=viper.New()3ini.SetConfigFile(fpname)45ini.SetDefault("database.dbname","esaletest")6ini.SetDefault("database.dbhos......
  • 【笔记】2023.12.16 动态规划
    笔记2023.12.16:动态规划今天题目很多,可能有些题不口胡了。LOJ6089小Y的背包计数问题前\(\sqrtn\)个物品直接做单调队列优化是\(O(n\sqrtn)\)。大于\(\sqrtn\)的是完全背包。考虑到完全背包\(v\)的OGF为\(\dfrac{1}{1-x^{v}}\)。这不行。你考虑到对于一个物......
  • MongoDB 7.0 动态 WiredTiger tickets
    在WiredTiger存储引擎中,WiredTigertickets提供了并发控制机制。这些tickets分为读tickets和写tickets。当多个操作,比如读和写尝试并发访问数据库,WiredTiger使用tickets来确保这些操作不会冲突,从而保证数据的完整性和性能。WiredTiger中的"tickets"实际上是一种资源管理机制,用于限......