web-dev-qa-db-ja.com

Apache POIのヘッダー行のロック

Apache POI 3.7で作成されたスプレッドシートの行をロックする方法を知っている人はいますか?ロックとは、ユーザーが行をスクロールしているときに列のタイトル行を表示したままにすることを意味します。作成したスプレッドシートには500行あり、列の名前が常に表示されていると便利です。

68
user1795755

使用できるシート内の特定の行をフリーズする必要がある場合(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
111
Sankumarsingh

これを行うには、次のようにフリーズペインを作成できます。

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

これにより、最初の行が固定されます。より多くのオプションを持つ別のメソッドがあるので、 [〜#〜] api [〜#〜] をチェックしてください。

XSSFブックを使用している場合にのみ注意する必要があります-XSSFスプレッドシートを使用してフリーズペインの動作を修正したバージョン3.8-beta3のバグ修正についての言及があります。

50884-XSSFとHSSFのフリーズペインが同じように動作するようになりました(poi-developers)

私はこれの詳細を知りませんが、あなたがその船に乗っているかどうかを調査する価値があるでしょう。

13
akokskis

上の行もフリーズしない限り、中央の行をフリーズすることはできません。

100行あり、ヘッダー行が50行目にあるとします。行50のみがロックされるため、行1-49からスクロールするとすべてが上にスクロールし、行50に達すると50行目が行51〜100がスクロールされたときにtopのままになります。

しかし、回避策があります。できることは、行をグループ化してから凍結することです。

最初に、1〜49の行をグループ化し、1〜50のペインを固定します。これで、ユーザーはグループを最小化してから、テーブルヘッダーをロックして上部にあるテーブルを操作できます。

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

ただし、ちょっとした問題があります。 MS Excelでは、シートが保護されている場合、グループの展開/折りたたみはできません。このためには、マクロを記述する必要があります。

1
Mithun P John