从数据库导出List<Map>数据动态生成sheet(数据量少可以参考看看)

2023-11-16

有个问题要注意,数据库导出Map数据如果值为空,这个字段和值不会查询出来
因为我上面配置没成功----execl列名(我用的是sql中文别名截取,就不用创建实体类了,如果你上面没问题就忽略)
第一步POM文件

 <properties>
        <!-- 版本管理 -->
        <poi.version>3.17</poi.version>
    </properties>
    
 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${poi.version}</version>
        </dependency>

第2步JAVA文件(注释最好看一下)

public class ExportExcel
{
    public static List<String> keyList=new ArrayList<>();
    public static int num;
**//fileName execl地址
//title   execlsheet名
//list   你的列名(我的)
//dataset   你的Map数据
//index  目前的行数**
    public static Workbook exportExcel(String fileName, String title,List<String> list, 
    List<LinkedHashMap<String, Object>> dataset, int index)
    {
        Sheet sheet=null;
        Workbook workbook=null;
        File file = new File(fileName);
        if(index==0&&file.exists())file.delete();
        if(!file.exists()){
            if (fileName.endsWith("xlsx"))
            {
                workbook = new XSSFWorkbook();
            } else if (fileName.endsWith("xls"))
            {
                workbook = new HSSFWorkbook();
            } else
            {
                try
                {
                    throw new Exception("invalid file name, should be xls or xlsx");
                } catch (Exception e)
                {
                    e.printStackTrace();
                }

            }
            sheet=workbook.createSheet(title);
        }else {
            try(BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream(fileName))
            ) {
                workbook=new XSSFWorkbook(bufferedInputStream);
            } catch (Exception e) {
                e.printStackTrace();
            }
           sheet=workbook.getSheetAt(0);
        }
        keyList=new ArrayList<>(list);
        **//列名转成数组**
        String[] headers=keyList.toArray(new String[keyList.size()]);
        // 列名
        Row row;
        if(index==0){
        //添加第一行
            row = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++)
            {
                Cell cell = row.createCell(i);
                sheet.setColumnWidth(i, 5000);
                cell.setCellValue(headers[i]);
            }
        }else {
            index= sheet.getLastRowNum();
        }
        Iterator<LinkedHashMap<String,Object>> it = dataset.iterator();

        while (it.hasNext())
        {
            index++;
            row = sheet.createRow(index);
            Map map = it.next();
            Set<String> mapKey = (Set<String>)map.keySet();
            Iterator<String> iterator = mapKey.iterator();
            num  = 0;
            while(iterator.hasNext()){
                String key = iterator.next();
                if(key.equals("ROW_ID")) {
                    continue;
                }
                if(num==5) {
                    System.out.println("aaa");
                }
                Cell cell = row.createCell(num);
                **//空的值填空**
                Cell cell1 = addNum(cell, key, row);
                Object obj = map.get(key);
                if(cell1!=null){
                    cell1 = row.createCell(num);
                    add(cell1,obj);
                    num++;
                    continue;
                }
                add(cell,obj);
                num++;
            }
        }

        try(FileOutputStream fos=new FileOutputStream(fileName);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fos);)
        {
            workbook.write(bufferedOutputStream);

        } catch (IOException e)
        {
            e.printStackTrace();

        }
        return workbook;
    }
    public static Cell addNum(Cell cell,String key,Row row){
        while (true){
            if(num!=keyList.indexOf(key)){
                cell.setCellValue("");
                num++;
                Cell cell1 = row.createCell(num);
                addNum(cell1,key,row);
                return cell1;
            }else {
                break;
            }
        }
        return null;
    }

    public static void add(Cell cell,Object obj){
    //对数字的处理(不然会导出文本格式)
        if(obj instanceof BigDecimal){
            cell.setCellValue(Integer.valueOf(String.valueOf(obj)));
        }
        else if (obj instanceof Double) {
            cell.setCellValue(Double.parseDouble(String.valueOf(obj)));
        } else {
             cell.setCellValue(String.valueOf(obj));
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从数据库导出List<Map>数据动态生成sheet(数据量少可以参考看看) 的相关文章

  • dev/mapper的解释

    二 dev mapper目录的解释 为了方便叙述 xff0c 假设一台服务器有三块硬盘分别为a xff0c b xff0c c xff0c 每块硬盘的容量为1T 在安装Linux的时候 xff0c 先根据系统及自身的需要建立基本的分区 xf
  • mybatis映射文件mapper.xml的写法。

    在学习mybatis的时候我们通常会在映射文件这样写 xff1a lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt DOCTYPE mapper PUBLIC 34 myba
  • MyBatis 实践 -Mapper与DAO

    MyBatis 实践 标签 xff1a Java与存储 MyBatis简介 MyBatis前身是iBatis 是一个基于Java的数据持久层 对象关系映射 ORM 框架 MyBatis是对JDBC的封装 使开发人员只需关注SQL本身 而不需
  • mapper扫描问题(Invalid bound statement (not found))

    分析 xff1a 通常来说这种情况是mybatis没有配置好 但是还有一种可能是你的mapperscan扫描问题 解决 xff1a 使用这个的时候应该扫描的是mapper层 如果我们用成全局的扫描 xff08 根目录 xff09 xff0c
  • Mapper代理开发

    1 定义与SQL映射文件同名的Mapper接口 xff0c 并且将Mapper接口和SQL映射文件放置在同一目录下 2 设置SQL映射文件的namespace属性为Mapper接口的全限定名 lt mapper namespace 61 3
  • 极致简单 mybatis自动生成mapper

    1安装batter mybatis generator插件 2连接数据库 调用mybatis generate Successfully
  • MyBatis Mapper 传递多个参数

    在pojo类对应的映射文件中 xff0c 对应的参数类型可以省略 传递方式 1 接口正常书写 xff0c 映射文件中SQL语句的占位符必须用 arg0 agr1 或param1 param2 接口 xff1a public Customer
  • MyBatis mapper.xml中使用静态常量或者静态方法

    使用MyBatis技术 xff0c 书写mapper xml时 xff0c 如果在其中的ognl表达式或者sql中直接使用一些数字或者字符串的话 xff0c 会造成难以维护的问题 在Java编码中 xff0c 我们通常会把这些数字或者字符串
  • Linux 虚拟机centos /dev/mapper/cl-root 100% 解决方法

    1 在虚拟机中添加硬盘 一 添加新的磁盘 1 选择 虚拟机设置 并打开 xff0c 将光标定位在 硬盘 SCSI 选项上 xff0c 然后点击下方的 添加 按钮 2 点击下一步 3 选择SCSI 点击下一步 4 选择创建新虚拟机磁盘 xff
  • 自带SLAM和定位,不需要里程计的全新建图传感器—— SLAMTEC Mapper来了

    这些年 xff0c 我们引领并见证了激光传感器行业的快速发展 xff0c 是时候 xff0c 我们来搞点新的名堂了 xff01 下面 xff0c 有请今天的主角SLAMTEC Mapper 正式登场 xff01 Slamtec Mapper
  • MyBatis 实践 -Mapper与DAO

    MyBatis 实践 标签 xff1a Java与存储 MyBatis简介 MyBatis前身是iBatis 是一个基于Java的数据持久层 对象关系映射 ORM 框架 MyBatis是对JDBC的封装 使开发人员只需关注SQL本身 而不需
  • SpringBoot中Mapper.xml的入参方式

    在SpringBoot开发过程中 我们使用 Mapper xml Mapper java 来封装对数据库表的 CURD 操作 正常每张表会有一组对应的文件 一 Mapper常见用法 下面例举一个查询操作 数据表t sap customer
  • MyBatis 采用注解方式批量更新数据 @Mapper @Update (包含2种方法)

    批量更新数据方法 1 注释db filed name 表示的是的数据库字段名字 entity name 表示的是你的实体字段 table name 表示你的表名 Update
  • 从数据库导出List<Map>数据动态生成sheet(数据量少可以参考看看)

    有个问题要注意 数据库导出Map数据如果值为空 这个字段和值不会查询出来 因为我上面配置没成功 execl列名 我用的是sql中文别名截取 就不用创建实体类了 如果你上面没问题就忽略 第一步POM文件
  • mapper批量插入

    1 常规方式的批量插入 sql语句 int bathNorm List
  • 洗牌阶段实际上做了什么?

    洗牌阶段实际上做了什么 可能性 A 由于 shuffle 是将映射器 o p 带到减速器 o p 的过程 因此它只是根据分区器中编写的代码将特定键从映射器带到特定的减速器 例如 映射器 1 的 o p 是 a 1 b 1 映射器 2 的 o
  • 未生成 Hadoop 流映射器字节偏移量

    我正在运行流式 Hadoop 作业 并且字节偏移量不会作为映射器的输出 键 生成 就像我所期望的那样 命令 HADOOP INSTALL bin hadoop jar HADOOP INSTALL contrib streaming had
  • Jackson Mapper - 如何在 null 或空值上失败

    我们在代码中使用 Jackson JSON 映射器来反序列化一些配置对象 当特定字段丢失或为空时 我们希望 Jackson 反序列化失败 Jackson 支持这种行为的唯一功能是针对原语 final DeserializationConfi
  • 如果单词的第一个字母是元音,如何返回 1,否则返回 0。映射器(MapReduce)问题

    这是我正在处理的 MapReduce 问题的第一部分 我需要一个函数 如果单词的第一个字母以元音开头 则返回 1 否则返回 0 该程序通过将文本文件传输到映射器来在终端中运行 如下所示 cat test txt python3 mapper
  • MapStruct - @Mapper 注释不创建 bean

    我从此来源下载了应用程序https github com springframeworkguru spring5 mvc rest tree vendor api https github com springframeworkguru s

随机推荐

  • C++的类与对象

    类的概念 类是将不同类型的数据和处理这些数据的操作封装在一起的一个复合数据类型 类有两类成员 一类是数据成员 用于表示实体抽象的属性 另一类是成员函数 用来描述实体抽象的行为 类作为一种数据类型 在定义的时候是不分配内存的 类通过将数据和对
  • JVM OOM问题排查与解决思路

    OOM原因 1 堆溢出 报错信息 java lang OutOfMemoryError Java heap space 代码中可能存在大对象分配 无法获得足够的内存分配 可能发生内存泄露 导致内存被无效占用以至于耗尽 2 永久代 元空间溢出
  • Blender图解教程:新手入门练习1

    多边形建模命令仅在编辑模式下可用 一 台灯 成果展示 步骤 1 打开Blender 新建 常规 文件 2 制作台灯底座 选择该立方体的上面 快捷键 3 然后使用快捷键 G 再按快捷键 Z 使其沿Z轴移动 移动鼠标 调整台灯底座到合适的高度
  • 电脑提示d3dcompiler_47.dll丢失怎么解决?d3dcompiler_47.dll缺失修复方法

    d3dcompiler 47 dll文件是Windows系统重要的组件 电脑一出现缺失或者损坏的情况下 电脑很多游戏跟软件都无法打开运行 小编今天就把修复教程分享给大家 首先是打开电脑浏览器后在顶部输入 dll修复文件 site 按下键盘的
  • 两个有序链表序列的合并(省略函数实现)

    浙大版 数据结构 第2版 题目集 习题2 5 两个有序链表序列的合并 include
  • 华为OD机试 Python 需要打开多少监控器

    描述 想象一下 你在一个长方形停车场 每个车位正上方都有一个监控器 只有当车位上或其周围 前 后 左 右 有车时 这个监控器才会开启 请根据给定的停车场车辆分布 计算需要开启的监控器数量 输入 第一行 两个整数 分别表示停车场的长和宽 1
  • C++学习(六十三)指针数组和数组指针

    指针数组 类似整型数组 浮点型数组 指数组里的元素为指针 define ARRAY LEN 100 char myStrPtr ARRAY LEN char指针的数组 墨菲定律的几条推论 会出错的事 总会出错 世上没有绝对正确的事情 每个解
  • Hashmap源码详解

    在开发中的对于数据结构如何选 我们要知道各个数据结构的优缺点 数组 采用一段连续的存储单元来存储数据 对于指定下标的查找 时间复杂度为O 1 但在数组中间以及头部插入数据时 需要复制移动后面的元素O n 优点 查找快 缺点插入慢 链表 一种
  • xmind怎么在左边创建_XMind如何调整分支主题位置?XMind分支主题任意移动方法

    如何利用xmind制作自己的思维导图 你好 建议你可以这样试试看 打开画图工具点击上方栏目 思维导图 在跳转专的页面点击 立即属体验 进入在线绘制界面 在画布的四周有很多的工具栏 这些在绘制的过程中都是可以使用的 首先 将中心主题进行确立
  • 使用 docker 搭建 clickhouse 集群

    转载来自 blog miaoji io p 57 写在前面 你好 欢迎浏览我的博客 这篇文章将记录我使用docker搭建clickhouse集群的过程 工具准备 服务器准备 这里我们准备三台服务器 分别配置hostname为server01
  • SpringBoot中静态资源文件的存放位置

    1 静态资源路径是指系统可以直接访问的路径 且路径下的所有文件均可被用户 通过浏览器直接读取 2 在Springboot中默认的静态资源路径有 classpath META INF resources classpath resources
  • 微信小程序——组件库

    文章目录 WeUI ColorUI LinUI echarts for weixin WeUI WeUI是微信官方设计团队为微信Web开发量身打造的一个UI样式库 可以理解为一种类似于Bootstrap的前端UI库 使用WeUI来编写小程序
  • rosrun 和 roslaunch 的时候 TAB 的自动补全出现问题

    rosrun 和 roslaunch 的时候 TAB 的自动补全出现问题 rospack Warning error while crawling home sun boost filesystem status Permission de
  • javaRebel(jRebel)使用手记

    想必大家对项目开发中 调试类文件修改时 容器自动重新加载漫长的过程早已厌倦 我今天闲来无事 于是 想试试javaRebel jRebel 这个东西 javaRebel jRebel 现在是收费软件 不过在网上可以下载到确解版的 在网上查了一
  • please remember me(auto login)

    记住我 用户自动登录的实现 auto login 一 什么是用户自动登录 对于我们的网站向已注册用户提供某些专门的服务 比如网上购物 在线下载 收费浏览等等 就会要求用户在使用这些服务之前进入登录页面 输入用户名和密码 并进行验证 如果用户
  • 搜索引擎(简化版)-分析总结

    整体思路 访问网址 进入首页 输入搜索内容 HTTP服务器接收到HTTP响应 解析取出其中的搜索内容 将搜索内容传输给CGI程序 既搜索客户端 由搜索客户端将搜索内容构造成一个请求 发送给搜索服务器 搜索服务器将请求解析 将搜索内容进行分词
  • hello_Makefile_c++

    1 错误 hello o In function start text 0x0 multiple definition of start usr lib gcc i486 linux gnu 4 4 3 lib crt1 o text 0x
  • html锚点反向联动,Vue监听滚动实现锚点定位(双向)示例_苏颜_前端开发者

    在项目需求中需要实现一个滚轴联动锚点的功能 效果图如下 功能代码demo如下 item name item export default data return scroll list name 第一条 backgroundcolor 90
  • MIPI DSI协议解析

    今天我们一起来学习一下MIPI DSI协议 1 Overview DSI 全称Display Serial Interface 是由MIPI联盟定义的处理器与外设之间的移动设备接口规范 该规范建立在现有的标准的基础上 并采用了MIPI联盟D
  • 从数据库导出List<Map>数据动态生成sheet(数据量少可以参考看看)

    有个问题要注意 数据库导出Map数据如果值为空 这个字段和值不会查询出来 因为我上面配置没成功 execl列名 我用的是sql中文别名截取 就不用创建实体类了 如果你上面没问题就忽略 第一步POM文件