88

有没有人熟悉在使用 Apache POI 3.7 创建的电子表格中锁定一行的方法?通过锁定,我的意思是当用户滚动行时,我希望列的标题行保持可见。我创建的电子表格将有 500 行,如果列的名称始终可见,这将是有益的。

4

3 回答 3

147

如果您需要在工作表的任何位置冻结任何特定行,您可以使用(Within org.apache.poi.ss.usermodel.Sheet)(也可在 POI 3.7 中使用)

Sheet.createFreezePane(int colSplit, int rowSplit, int leftmostColumn, int topRow)

在您的情况下,如果您只想冻结前 x 行,那么该int leftmostColumn, int topRow部分将被删除,您可以只使用

Sheet.createFreezePane(int colSplit, int rowSplit)

例如

sheet1.createFreezePane(0, 5); // this will freeze first five rows
于 2013-07-30T04:54:29.350 回答
18

为此,您可以创建一个冻结窗格,如下所示:

workbook.getSheetAt(workbook.getActiveSheetIndex()).createFreezePane(0, 1);

这将冻结第一行。还有另一种方法具有更多选项,因此请查看API

唯一需要注意的是,如果您使用的是 XSSF 工作簿 - 版本 3.8-beta3 中提到了一个错误修复,该修复使用 XSSF 电子表格修复了冻结窗格的行为:

50884 - XSSF 和 HSSF 冻结窗格现在表现相同(poi-developers)

我不知道这件事的细节,但如果你在那条船上,那将是值得调查的。

于 2013-07-29T19:53:56.110 回答
2

如果不将其上方的行也冻结,则无法冻结中间行。

假设您有 100 行,而标题行位于第 50 行。您可能期望只有第 50 行被锁定,这样当从第 1-49 行滚动时,所有内容都会向上滚动,当到达第 50 行时,第 50 行会滚动到top 并在滚动第 51-100 行时停留在那里。

但是,有一个解决方法。您可以做的是,对行进行分组,然后冻结它们。

首先,将 1-49 的行分组,然后冻结 1-50 的窗格。现在,用户可以最小化该组,然后使用表头锁定并位于顶部的表。

sheet.groupRow(0, 49);
sheet.createFreezePane(0, 50);

不过有一个小问题。如果工作表受到保护,MS Excel 将不允许您展开/折叠组。为此,您需要编写一个宏。

于 2018-02-28T14:08:14.547 回答