Apache POI-Sperrkopfzeilen

82

Ist jemand da draußen mit einer Möglichkeit vertraut, eine Zeile in einer mit Apache POI 3.7 erstellten Tabelle zu sperren? Mit Sperren meine ich, dass die Titelzeile für die Spalten sichtbar bleiben soll, wenn der Benutzer durch die Zeilen blättert. Meine erstellte Tabelle hat 500 Zeilen und es wäre vorteilhaft, wenn die Namen der Spalte immer sichtbar wären.

Winzig
quelle
2
POI 3.7 ist jetzt etwas alt. Gibt es einen Grund, warum Sie nicht die neueste Version verwenden?
Gagravarr
2
Ja das, was mein Arbeitgeber autorisiert hat.

Antworten:

128

Falls Sie eine bestimmte Zeile an einer beliebigen Stelle im Blatt einfrieren müssen, können Sie (Innerhalb org.apache.poi.ss.usermodel.Sheet) verwenden (auch in POI 3.7 verfügbar).

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

In Ihrem Fall, wenn Sie nur Ihre ersten x Zeilen einfrieren möchten, wird der int leftmostColumn, int topRowAbschnitt entfernt und Sie können nur verwenden

Sheet.createFreezePane(int colSplit, int rowSplit)

zum Beispiel

sheet1.createFreezePane(0, 5); // this will freeze first five rows
Sankumarsingh
quelle
Ich möchte nur meine erste Spalte und Zeilennummer Nr. 17 einfrieren. Bitte schlagen Sie mir vor, wie ich dies erreichen kann. Danke im Voraus.
Ashish Burnwal
17

Dazu können Sie einen Einfrierbereich wie folgt erstellen:

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

Dadurch wird die erste Reihe eingefroren. Es gibt eine andere Methode mit mehr Optionen. Schauen Sie sich also die API an .

Das einzige, was Sie beachten sollten, ist, wenn Sie XSSF-Arbeitsmappen verwenden. In Version 3.8-beta3 wird ein Bugfix erwähnt, der das Verhalten von Freeze-Fenstern mithilfe von XSSF-Tabellen korrigiert hat:

50884 - XSSF- und HSSF-Einfrierfenster verhalten sich jetzt gleich (Poi-Entwickler)

Ich kenne die Details nicht, aber es lohnt sich zu untersuchen, ob Sie in diesem Boot sind.

Akokskis
quelle
1

Sie können eine mittlere Reihe nicht einfrieren, ohne dass die darüber liegenden Reihen ebenfalls eingefroren werden.

Angenommen, Sie haben 100 Zeilen und Ihre Kopfzeile befindet sich in Zeile 50. Sie können davon ausgehen, dass nur Zeile 50 gesperrt wird, sodass beim Scrollen von Zeile 1-49 alles nach oben gescrollt wird und die 50. Zeile bei Erreichen von Zeile 50 zu Zeile 50 gescrollt wird oben und bleibt dort, wenn die Zeilen 51-100 gescrollt werden.

Es gibt jedoch eine Problemumgehung. Sie können die Zeilen gruppieren und dann einfrieren.

Gruppieren Sie zuerst die Zeilen von 1 bis 49 und frieren Sie dann die Fenster von 1 bis 50 ein. Jetzt kann der Benutzer die Gruppe minimieren und dann mit der Tabelle arbeiten, wobei der Tabellenkopf gesperrt und oben ist.

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

Es gibt jedoch einen kleinen Haken. In MS Excel können Sie eine Gruppe nicht erweitern / reduzieren, wenn das Blatt geschützt ist. Dazu müssen Sie ein Makro schreiben.

Mithun P John
quelle