Apache POI 锁定表头行

96

有没有人熟悉使用Apache POI 3.7创建的电子表格中锁定行的方法?锁定的意思是当用户在浏览行时,要求列的标题行始终可见。我创建的电子表格将有500行,如果列名始终可见将会很有益。


3
POI 3.7现在有点过时了,您为什么不使用最新版本? - Gagravarr
2
是的,那是我的雇主授权的。 - user1795755
3个回答

160

如果您需要在工作表中的任何位置冻结特定行,您可以使用(在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

我想要冻结第一列和行号#17, 请建议如何实现。先行谢过。 - Ashish Burnwal
你不能冻结中间一行而不使它上面的行也被冻结。唯一能做的就是:sheet1.createFreezePane(0, 17); - Ákos Kozák

20

为此,您可以按以下步骤创建冻结窗格:

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

这将使第一行固定在原位。另有一种方法具有更多选项,因此请查看API

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

50884 - XSSF和HSSF现在具有相同的冻结窗格行为(poi-developers)

我不知道详情,但如果您使用的是该工具,请调查一下。


2
您不能冻结中间的一行而不使上面的行也被冻结。
比如说您有100行,表头在第50行。您可能期望只有第50行被锁定,这样从第1行到第49行滚动时,所有内容都会向上滚动,当滚动到第50行时,第50行会滚动到顶部,并保持在第51行到第100行滚动时不变。
但是,有一个解决方法。您可以将行分组,然后再将其冻结。
首先,将第1行到第49行分组,然后将第1行到第50行冻结。现在用户可以最小化该组并使用带有锁定表头并位于顶部的表格。
sheet.groupRow(0, 49);
sheet.createFreezePane(0, 50);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接