首页 文章

可以使用POI在现有Excel中更改列分组吗?

提问于
浏览
1

在过去的几个月里,我一直在使用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 回答

  • 1

    似乎Apache POI处理列组的方式被破坏并产生副作用,但我认为有一种方法可以删除表中的所有列组,如下所示:

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

    如果仅在大纲级别上,则将删除所有组 . 如果有n个大纲级别,您可能需要重复n次以确保每个组都被删除 .

相关问题