在现有的POI中可以更改列分组吗?

过去几个月我一直在使用Apache POI ,为我们的应用程序创build一个“从Excel导出/导入”function。

注:我使用3.9,但没有切换到3.10-FINAL。

典型的用例是用户下载空模板或将现有数据导出到Excel文件。 然后,他对数据进行更改并再次上传他的文件。

为了给用户提供详细的反馈,我们使用他上传的Excel文件,并从中创build一个报告文件。 此报告文件是上传文件的副本,其中包含两个附加列,其中包含有关他所导入的数据的信息。 例如,一条错误消息告诉他为什么他的数据不被接受。

这需要将所有列向右移动,并在左侧添加两个新列。 我实现了这一点,我甚至设法移动单元格的评论与列。 现在我卡住了,因为我不能移动列分组。

该模板有几个分组在一起,并按默认折叠。 因为我们有100多列,所以通过隐藏一些很less使用的列可以让用户更容易。

在创build模板时,我使用下面的代码来创build分组。

SimpleEntry<Integer, Integer> group; sheet.setRowSumsRight(false); for (String groupId : groupMap.keySet()) { group = groupMap.get(groupId); sheet.groupColumn((group.getKey() + 1) + offset, group.getValue() + offset); sheet.setColumnGroupCollapsed(group.getValue() + offset, true); } 

group.getKey()返回最左边的列和group.getValue()最右边的列。 offset始终为0。
我的想法是使用offset为2的相同代码来移动报告文件中的分组。 认为只是覆盖将无法正常工作我试图取消组合第一个这个:

 sheet.ungroupColumn(0, 130); 

这只是一个例子。 我尝试了几种不同的方法,例如使用最大范围一次取消所有组的组合,或者取消我的地图上每个组的取消组合。

然而,没有按预期工作。 如果我尝试取消组合分组,它会打破分组,而产生不希望的效果。 列组被拆分成更小的组,而不是从Excel文档中删除。 有些实际上被删除,但我现在find了使其安全工作的方法。

注意:我只使用XSSF

我没有想法,而且在我看来,由于某些原因,使用标准POI API重写列分组是不可能的。 实际上,列分组function似乎只能在空文档填充数据之前正常工作。
我花了很多时间search这个问题,但没有find解决办法,几乎没有任何结果符合我的问题。 无论是我的google-fu离开了我,还是我唯一一个不得不为此function而烦恼的人。

我希望这里有人可能有一个想法或解决我的问题,因为我认为这应该是可能的。 那么ungroupColumn函数的重点是什么呢?

注:我想过使用两个不同的模板,并简单地复制数据,因为在生成模板时正确创build分组似乎没有问题。
然而,这将需要对代码进行几处重大更改(而且我基本上已经超时),并且会带来一两个我必须满足的其他要求。 所以这更像是一个C计划 ,这将是我最后一个解决问题的方法。


编辑:
对于那些感兴趣的人,我采用了弗洛里安·罗德勒提出的解决scheme,因为事实certificate这是我的问题的解决scheme/解决方法。 我稍微修改了他的代码。

 if (sheet.getPhysicalNumberOfRows() > 0) { Row row = sheet.rowIterator().next(); for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { sheet.ungroupColumn(i, i); } } 

这成功地从我的Excel文档中删除所有列组/轮廓。 然后我使用我的问题中显示的模板创build代码, offset量大于2, 移动 (或者重新创build)到右侧。

看起来,Apache POI处理列组的方式被破坏,并产生副作用,但我认为有一种方法可以像这样删除表中的所有列组:

 for (int i=first_column; i<=last_column; i++) { sheet.ungroupColumn(i,i); } 

如果只有大纲级别,这将删除所有组。 如果有n个大纲级别,则可能需要重复n次以确保每个组都被删除。