Apache POI锁定标题行


82

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


2
POI 3.7现在有点旧了,是否有理由不使用最新版本?
Gagravarr

2
是的,这是我的雇主授权的。

Answers:


128

如果需要冻结工作表中任何位置的任何特定行(在范围内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

我只想冻结第1列和第17行,请建议我如何实现此目标。提前致谢。
Ashish Burnwal '17

17

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

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

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

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

50884-XSSF和HSSF冻结窗格现在表现相同(POI开发人员)

我不知道细节,但是如果您在那条船上,那值得调查。


1

您不能冻结中间的行而不冻结上面的行。

假设您有100行,而标题行在第50行。您可能希望只有第50行被锁定,因此从1-49行滚动时,所有内容都会向上滚动,到达50行时,第50行会滚动到当滚动第51-100行时,它会停留在顶部并停留在那里。

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.