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

news/2024/12/23 4:29:34/

折叠组是什么?如图就是用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 即可,其余不变

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


http://www.ppmy.cn/news/1057070.html

相关文章

C语言暑假刷题冲刺篇——day4

目录 一、选择题 二、编程题 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C语言每日一练 ✨其他专栏&#xff1a;代码小游戏C语言初阶&#x1f91d;希望作者的文章能对你…

十一、hadoop应用

1.上传数据集 27.19.74.143,2015/3/30 17:38,/static/image/common/faq.gif 110.52.250.126,2015/3/30 17:38,/data/cache/style_1_widthauto.css?y7a 27.19.74.143,2015/3/30 17:38,/static/image/common/hot_1.gif 27.19.74.143,2015/3/30 17:38,/static/image/common/hot_2…

Java8 Stream流 flatMap使用

参考链接 import cn.hutool.core.collection.ListUtil; import lombok.AllArgsConstructor; import lombok.Data;import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors;public class FlatMapLearn {DataAllArgsConstructorpublic static c…

算法和数据结构

day1 1&#xff1a;正确 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 // 中序遍历一遍二叉树&#xff0c;并统计节点数目 class Solution { public:int count 0; // 统计节点数void inorder(TreeNode* root) {if(!root) return;inorder(root-&g…

libdrm全解析八 —— 源码全解析(5)

接前一篇文章&#xff1a;libdrm全解析七 —— 源码全解析&#xff08;4&#xff09; 本文参考以下博文&#xff1a; DRM 驱动程序开发&#xff08;VKMS&#xff09; 特此致谢&#xff01; 本文继续对include/drm/drm.h中实际功能宏定义进行讲解。 7. DRM_IOCTL_GET_STATS …

PyTorch深度学习实战(13)——可视化神经网络中间层输出

PyTorch深度学习实战&#xff08;13&#xff09;——可视化神经网络中间层输出 0. 前言1. 可视化特征学习的结果2. 可视化第一个卷积层的输出3. 可视化不同网络层的特征图小结系列链接 0. 前言 随着深度学习的快速发展&#xff0c;神经网络已成为解决各种复杂任务的重要工具。…

FinalShell报错:Swap file “.docker-compose.yml.swp“ already exists

FinalShell中编辑docker-compose.yml文件&#xff0c;保存时报错&#xff1a;Swap file ".docker-compose.yml.swp" already exists&#xff1b;报错信息截图如下&#xff1a; 问题原因&#xff1a;有人正在编辑docker-compose.yml文件或者上次编辑没有保存&#xff…

Docker 搭建 LNMP + Wordpress(详细步骤)

目录 一、项目模拟 1. 项目环境 2. 服务器环境 3.任务需求 二、Linux 系统基础镜像 三、Nginx 1. 建立工作目录 2. 编写 Dockerfile 脚本 3. 准备 nginx.conf 配置文件 4. 生成镜像 5. 创建自定义网络 6. 启动镜像容器 7. 验证 nginx 四、Mysql 1.…