通过POI在Excel工作表的标题上设置过滤器

And*_*sen 35 excel autofilter apache-poi

我生成一个工作表,非常沼泽的标准标题和数据列.

我想打开工作表的"过滤器"功能,这样用户就可以轻松地对数据进行排序和过滤.

我可以这样使用POI吗?

Vic*_*tor 59

保存过滤区域中的第一个和最后一个单元格,然后执行:

sheet.setAutoFilter(new CellRangeAddress(firstCell.getRow(), lastCell.getRow(), firstCell.getCol(), lastCell.getCol()));
Run Code Online (Sandbox Code Playgroud)

例如,从下面的表格中.

>x         (x, y)
  0123456  
0|--hhh--|   h = header
1|--+++--|   + = values
2|--+++--|   - = empty fields
3|--+++--|
4|-------|
Run Code Online (Sandbox Code Playgroud)

第一个单元格将是第一个+(2,1)单元格上方的标题.最后一个是最后一个+单元格(5,3)

  • 尼斯.看来我可以通过以下方式逃脱:s.setAutoFilter(CellRangeAddress.valueOf("A1:E1")); 此范围仅为标题单元格,不包括数据单元格.结果仍然是我想要的. (6认同)
  • 你的意思是最后的+细胞是(4,3)? (6认同)
  • 我认为单元格的API可能已更改。我必须使用这个范围:`new CellRangeAddress(firstCell.getRowIndex(),lastCell.getRowIndex(),firstCell.getColumnIndex(),lastCell.getColumnIndex())`。现在,getRow返回一行而不是索引,并且getCol不再存在。 (2认同)

Tia*_*ici 5

在标头上添加过滤器的最简单方法:

sheet.setAutoFilter(new CellRangeAddress(0, 0, 0, numColumns));
sheet.createFreezePane(0, 1);
Run Code Online (Sandbox Code Playgroud)

  • 小修正:这将是“numColumns - 1”(否则你会在最后得到一个额外的过滤列)。 (5认同)
  • 这更多的是概念性的评论,而不是逐字代码:)。要点是“CellRangeAddress”的构造函数是零索引且包含边界的。因此,如果您根据某些内容计算“numColumns”,则需要考虑到这一点。 (2认同)
  • 我同意@PriiduNeemre 的观点。我认为 `lastIndex` 比 `numColumns` 更合适(或者我会使用 `numColumns - 1`) (2认同)