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

折叠组是什么?如图就是用POI 实现的,代码很简单:sheet.groupRow(开始行,结束行)即可
POI groupRow 折叠分组,折叠部分不显示问题_第1张图片
但是万万没想到,最终实现出的结果,合并的组,有一部分并没有渲染出来,如下图:

POI groupRow 折叠分组,折叠部分不显示问题_第2张图片POI groupRow 折叠分组,折叠部分不显示问题_第3张图片
因为我的合并数据,是结合着数据逻辑的特殊动态计算出来的,一直认为是我算法的问题,或者是数据的问题,
这是我的算法,


 合并组调用:
 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;
    }

POI groupRow 折叠分组,折叠部分不显示问题_第4张图片
经过反复调试,和数据比对,数据应该没问题,针对计算出来的合并组行和Excel的行进行比对,没有发现任何问题,现在很大程度上认为是POI的BUG。

问题解决

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

POI groupRow 折叠分组,折叠部分不显示问题_第6张图片
POI groupRow 折叠分组,折叠部分不显示问题_第7张图片
执行导出结果:
POI groupRow 折叠分组,折叠部分不显示问题_第8张图片
POI groupRow 折叠分组,折叠部分不显示问题_第9张图片
POI groupRow 折叠分组,折叠部分不显示问题_第10张图片

你可能感兴趣的:(python,开发语言)