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

POI groupRow 折叠分组,折叠部分不显示问题

折叠组是什么?如图就是用POI 实现的,代码很简单:sheet.groupRow(开始行,结束行)即可
在这里插入图片描述
但是万万没想到,最终实现出的结果,合并的组,有一部分并没有渲染出来,如下图:

在这里插入图片描述在这里插入图片描述
因为我的合并数据,是结合着数据逻辑的特殊动态计算出来的,一直认为是我算法的问题,或者是数据的问题,
这是我的算法,

合并组调用:List<List<Integer>> groupRows = setGroupRowE(startIndex,dataB);for(int i=0; i<groupRows.size(); i++) {sheet.groupRow(groupRows.get(i).get(0),groupRows.get(i).get(1));}
/*** 根据数据规则动态计算分组下标* @param startIndex* @param data* @return*/private List<List<Integer>> setGroupRowE(int startIndex,List<Map<String, Object>> data) {List<List<Integer>> groupRowAll = new ArrayList<>();List<List<Integer>> groupRow2 = new ArrayList<>();Map<String,List<Integer>> cache = new LinkedHashMap<>();int finalStartIndex = startIndex;for(int i = 0; i <data.size(); i++) {if(Constant.SYMBOL.equals(data.get(i).get(Constant.SEC_TYPE1))){// 第一级int finalI = i;int firstRow0 = groupRowAll.size() == 0 ? finalStartIndex : (int)groupRowAll.get(groupRowAll.size()-1).get(1)+1;List<Map<String, Object>> finalData1 = data;int count = (int) data.stream().filter((item)-> finalData1.get(finalI).get(Constant.RULE_TYPE).equals(item.get(Constant.RULE_TYPE)) && !Constant.SYMBOL.equals(item.get(Constant.SEC_TYPE1))).collect(Collectors.toList()).size();List<Integer> group1 = new ArrayList<>();if (count == 0) {group1  =  Arrays.asList(firstRow0,firstRow0);groupRow2 = new ArrayList<>();System.out.println("---" +data.get(finalI).get(Constant.RULE_TYPE).toString()+ "---" + group1);cache.put(data.get(finalI).get(Constant.RULE_TYPE).toString(), group1);groupRowAll.add(group1);} else {group1 =  Arrays.asList(firstRow0 + 1,firstRow0 + count);cache.put(data.get(finalI).get(Constant.RULE_TYPE).toString(), group1);System.out.println("---" +data.get(finalI).get(Constant.RULE_TYPE).toString()+ "---" + group1);groupRow2 = new ArrayList<>();groupRowAll.add(group1);}}if(Constant.SYMBOL.equals(data.get(i).get(Constant.SEC_TYPE))){// 第二级int finalI = i;int firstRow0 = groupRow2.size() == 0 ? cache.get(data.get(finalI).get(Constant.RULE_TYPE).toString()).get(0) : (int)groupRow2.get(groupRow2.size()-1).get(1)+1;List<Map<String, Object>> finalData = data;int count = (int) data.stream().filter((item)-> finalData.get(finalI).get(Constant.RULE_TYPE).equals(item.get(Constant.RULE_TYPE))&& finalData.get(finalI).get(Constant.SEC_TYPE1).equals(item.get(Constant.SEC_TYPE1))&& !Constant.SYMBOL.equals(item.get(Constant.SEC_TYPE))).collect(Collectors.toList()).size();List<Integer> group1 =  Arrays.asList(firstRow0 + 1,firstRow0 + count);System.out.println("--------" +group1);groupRow2.add(group1);groupRowAll.add(group1);}}System.out.println(groupRowAll);return groupRowAll;}

在这里插入图片描述
经过反复调试,和数据比对,数据应该没问题,针对计算出来的合并组行和Excel的行进行比对,没有发现任何问题,现在很大程度上认为是POI的BUG。

问题解决

还好没有放弃,通过百度,和翻阅资料,找到了唯一的一篇文章https://www.5axxw.com/questions/content/u1sln7
里面的问题和我的问题一样,解决点来说就是在最初创建workbook对象,我new 的是SXSSFWorkbook对象,应该用XSSFWorkbook对象,那么他俩到底啥区别呢?
在这里插入图片描述
也就是我们用流操作workbook在操作时获取的不是一个完整的Workbook对象,它是为了防止内存溢出;知道这一点,只需要将SxssFWorkbook 改为XSSFWorkbook,Sheet 改为XSSFSheet 即可,其余不变

在这里插入图片描述
在这里插入图片描述
执行导出结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

POI groupRow 折叠分组,折叠部分不显示问题

折叠组是什么&#xff1f;如图就是用POI 实现的&#xff0c;代码很简单&#xff1a;sheet.groupRow(开始行&#xff0c;结束行)即可 但是万万没想到&#xff0c;最终实现出的结果&#xff0c;合并的组&#xff0c;有一部分并没有渲染出来&#xff0c;如下图&#xff1a; 因为我…...

一、数据库基础

数据库 一、数据库基础 1、一些概念 数据库&#xff1a;数据库&#xff08;DataBase &#xff0c;简称DB&#xff09;&#xff0c;就是信息的集合。数据库是由数据库管理系统管理的数据的集合&#xff1b;数据库管理系统&#xff1a;简称DBMS 。是一种操纵和管理数据库的大型…...

Harmony OS教程学习笔记

基础知识 1.如何修改程序启动的第一个页面&#xff1f; 不想使用创建的默认的页面&#xff0c;这时需要修改启动页面&#xff0c;修改的地方在EntryAbility文件中的onWindowStageCreate方法中。 onWindowStageCreate(windowStage: window.WindowStage) {// Main window is cr…...

605. 种花问题

链接 假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。给你一个整数数组 flowerbed 表示花坛&#xff0c;由若干 0 和 1 组成&#xff0c;其中…...

Elasticsearch 常见的简单查询

查看es中有哪些索引 请求方式&#xff1a;GET 请求地址&#xff1a;http://localhost:9200 /_cat/indices?v 参数&#xff1a;无 结果&#xff1a; 查看索引全部数据 请求方式&#xff1a;GET 请求地址&#xff1a;http://localhost:9200/index-2023-08/_search 参数&a…...

C#使用xamarin进行跨平台开发

使用 Xamarin 进行跨平台开发可以使用 C# 和 .NET 平台来开发移动应用程序&#xff0c;同时将代码在多个主要移动操作系统上运行&#xff0c;包括 Android 和 iOS。以下是在 C# 中使用 Xamarin 进行跨平台开发的一般步骤&#xff1a; 安装 Xamarin&#xff1a; 在开始之前&…...

xargs 的用法 在1个文件夹中批量删除文件,这些删除的文件名是另一个文件夹中的文件名。

xargs 的用法 在1个文件夹中批量删除文件&#xff0c;这些删除的文件名是另一个文件夹中的文件名。 1、问题背景 应用场景 1、问题背景 应用场景 在二进制部署docker时&#xff0c;会把docker的所有可执行文件复制到/usr/bin下。 如果说复制过去后&#xff0c;想要反悔&#x…...

集简云本周新增/更新:新增2大功能,集成2款应用,更新4款应用,新增近20个动作

本周更新概要 新增功能 新增功能&#xff1a;Claude2 新增功能&#xff1a;语聚AI对话助手对话背景设定 应用新增 新增应用&#xff1a;领星ERP 新增应用&#xff1a;slack(自建) 应用更新 更新应用&#xff1a;企业微信(代开发) 更新应用&#xff1a;阿里云效2020(新版…...

MySQL存储过程怎么写?看完这篇秒懂

今天测试一个数据展示模块&#xff0c;依赖于数据部推送数据&#xff0c;但是他们没有人员配合&#xff0c;为了赶工&#xff0c;于是自己徒手造数据&#xff0c;有些页面&#xff0c;要查看翻页和权限等相关的功能&#xff0c;手动造是不可能的&#xff0c;因为我懒....哈哈哈…...

STM32电源名词解释

STM32电源架构 常用名词 VCC Ccircuit 表示电路&#xff0c;即接入电路的电压。 VDD Ddevice 表示器件&#xff0c; 即器件内部的工作电压。 VSS Sseries 表示公共连接&#xff0c;通常指电路公共接地端电压。 VDDA Aanalog 表示模拟&#xff0c;是模拟电路部分的电源。主要为…...

《操作系统真象还原》学习笔记:第七章 中断

由于 CPU 获知了计算机中发生的某些事&#xff0c;CPU 暂停正在执行的程序&#xff0c;转而去执行处理该事件的程序&#xff0c;当这段程序执行完毕后&#xff0c;CPU 继续执行刚才的程序。整个过程称为中断处理&#xff0c;也称为中断。 把中断按事件来源分类&#xff0c;来自…...

【学习笔记之vue】These dependencies were not found:

These dependencies were not found:方案一 全部安装一遍 我们先浅试一个axios >> npm install axios 安装完报错就没有axios了&#xff0c;验证咱们的想法没有问题&#xff0c;实行&#xff01; ok...

【数据结构】实现栈和队列

目录 一、栈1.栈的概念及结构&#xff08;1&#xff09;栈的概念&#xff08;2&#xff09;栈的结构 2.栈的实现&#xff08;1&#xff09;类型和函数的声明&#xff08;2&#xff09;初始化栈&#xff08;3&#xff09;销毁&#xff08;4&#xff09;入栈&#xff08;5&#x…...

APT60DQ20BG-ASEMI新能源功率器件APT60DQ20BG

编辑&#xff1a;ll APT60DQ20BG-ASEMI新能源功率器件APT60DQ20BG 型号&#xff1a;APT60DQ20BG 品牌&#xff1a;ASEMI 封装&#xff1a;TO-3P 恢复时间&#xff1a;&#xff1e;50ns 正向电流&#xff1a;60A 反向耐压&#xff1a;200V 芯片个数&#xff1a;2 引脚数…...

[Android Framework] 系统 ANR 问题排查实践小结

文章目录 背景卡顿的定义:卡顿分类:卡顿原因汇总ANR 出现的原理应用层导致ANR系统导致ANR日志抓取traces.txt 是如何生成的分析思路与验证相关日志分析data/anr/traces.txt其他分析思路如何分析生成的 trace.html 文件呢?最后解决参考:背景 本文记录了工作中遇到的Andorid …...

【Unity】Text文本组件的一些操作

Unity的Text组件的几种常见的操作方法 Text组件是Unity中用于在UI界面上显示文本的组件。它包含了一些常见的属性和方法&#xff0c;可以用来控制文本的内容、外观和交互。以下是一些常见的Text组件的操作&#xff1a; 设置文本内容&#xff1a;通过直接在Unity编辑器中的Text…...

如何通过tomcat下载映射下载文件

1.1找到tomcat服务器中server.xml文件 !--doBase是静态资源路径位置&#xff0c; path作用相当于设置的key, doBase作用相当于value --> <Context path"/download" docBase"E:\testBackData"></Context>1.2 找到tomcat服务器中web.xml文…...

Redis的8种数据结构和应用场景介绍,面试题答案

面试原题&#xff1a;你用过Redis哪些数据结构&#xff1f;&#xff08;网易一面 2023&#xff09;(面试题来自牛客网) 参考答案 后面有 详细答案解析&#xff0c;帮助更快记忆~ 参考答案共652字符&#xff0c;阅读约需1分8秒&#xff1b;全文共8694字符&#xff0c;阅读约需…...

Log4Qt日志框架(1)- 引入到QT中

Log4Qt日志框架&#xff08;1&#xff09;- 引入到QT中 1 下载源码2 简介3 加入到自己的项目中3.1 使用库文件3.2 引入源文件 4 说明 1 下载源码 github&#xff1a;https://github.com/MEONMedical/Log4Qt 官方(版本较老)&#xff1a;https://sourceforge.net/projects/log4q…...

【算法刷题之哈希表篇(1)】

目录 1.哈希表基础理论2.leetcode-242. 有效的字母异位词&#xff08;1&#xff09;方法一&#xff1a;排序&#xff08;2&#xff09;方法二&#xff1a;哈希表 3.leetcode-349. 两个数组的交集&#xff08;1&#xff09;方法一&#xff1a;哈希表&#xff08;2&#xff09;方…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...