在过去的几个月里,我一直在使用Apache POI为我们的应用程序创建一个'Export to/ Import from Excel'功能 .
注意:我使用了3.9但没有切换到3.10-FINAL .
典型的用例是,用户下载空模板或将现有数据导出到Excel文件 . 然后,他对数据进行了更改并再次上传了他的文件 .
为了向用户提供详细的反馈,我们使用他上传的Excel文件并从中创建报告文件 . 此报告文件是上载文件的副本,其中包含两个附加列,其中包含有关其导入数据的信息 . 例如,一条错误消息告诉他为什么他的数据不被接受 .
这需要将所有列向右移动,并在左侧添加两个新列 . 我实现了这一点,我甚至设法用列移动单元格注释 . 但是现在我被卡住了,因为我无法移动列分组 .
模板有几列组合在一起,默认情况下折叠 . 因为我们有100列,所以应该通过隐藏一些很少使用的列来使用户更容易 .
在模板创建过程中,我使用以下代码来创建分组 .
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);
这只是一个例子 . 我尝试了几种不同的方法,例如使用最大范围一次取消所有组的分组,或者在 Map 上取消组合每个组 .
然而,没有任何工作符合预期 . 如果我尝试取消组列分组,则会破坏分组并产生不良影响 . 列组分为较小的组,而不是从Excel文档中删除 . 有些实际上已被删除但我发现现在可以安全地工作 .
注意:我只使用XSSF .
由于某些原因,我无法使用标准POI API重写列分组 . 实际上,似乎列分组功能在填充数据之前只能与空文档一起正常工作 .
我花了很多时间在谷歌搜索问题,但没有找到解决方案,坦率地说,几乎没有任何结果与我的问题相符 . 我的google-fu离开了我,或者我是唯一一个不得不为这种功能而烦恼的人 .
我希望这里的某个人可以对我的问题有一个想法或解决方案,因为我认为这应该是可能的 . 那么 ungroupColumn
函数有什么意义呢?
注意:我考虑使用两个不同的模板并简单地复制数据,因为在生成模板时正确创建分组似乎没有问题 . 然而,这将需要对代码进行几处重大更改(而且我基本上没有时间)并且会对我必须满足的一个或两个其他要求造成问题 . 所以这对我来说更像是一个计划C,这将是我解决问题的最后一个方案 .
Edit:
对于那些感兴趣的人,我选择了Florian Rodler提出的解决方案,因为它证明了我的问题是一个有效的解决方案/解决方案 . 我稍微修改了他的代码 .
if (sheet.getPhysicalNumberOfRows() > 0) {
Row row = sheet.rowIterator().next();
for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
sheet.ungroupColumn(i, i);
}
}
这会成功删除Excel文档中的所有列组/轮廓 . 然后我使用我的问题中显示的模板创建代码,大于2的 offset
将组移动(或者更确切地说)重新组合到右侧 .
1 回答
似乎Apache POI处理列组的方式被破坏并产生副作用,但我认为有一种方法可以删除表中的所有列组,如下所示:
如果仅在大纲级别上,则将删除所有组 . 如果有n个大纲级别,您可能需要重复n次以确保每个组都被删除 .