web-dev-qa-db-fra.com

Lignes d'en-tête verrouillables Apache POI

Quelqu'un connaît-il un moyen de verrouiller une ligne dans une feuille de calcul créée avec Apache POI 3.7? Par verrouillage, je veux dire que je veux que la ligne de titre des colonnes reste visible lorsque l'utilisateur fait défiler les lignes. Ma feuille de calcul créée contiendra 500 lignes et il serait avantageux que les noms de la colonne soient toujours visibles.

68
user1795755

Dans le cas où vous devez figer une ligne particulière n'importe où dans la feuille, vous pouvez utiliser (Dans org.Apache.poi.ss.usermodel.Sheet) (Également disponible dans POI 3.7)

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

Dans votre cas, si vous souhaitez figer uniquement vos x premières lignes, le int leftmostColumn, int topRow la section sera supprimée et vous pouvez utiliser simplement

Sheet.createFreezePane(int colSplit, int rowSplit)

par exemple

sheet1.createFreezePane(0, 5); // this will freeze first five rows
111
Sankumarsingh

Pour ce faire, vous pouvez créer un volet d'arrêt comme suit:

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

Cela gèle la première ligne en place. Il existe une autre méthode avec plus d'options, alors consultez le API .

La seule chose à noter serait si vous utilisez des classeurs XSSF - il y a une mention d'un bug dans la version 3.8-beta3 qui corrigeait le comportement de gel des volets à l'aide des feuilles de calcul XSSF:

50884 - Les volets de blocage XSSF et HSSF se comportent désormais de la même manière (développeurs poi)

Je ne connais pas les détails de cela, mais il vaudrait la peine d'enquêter si vous êtes dans ce bateau.

13
akokskis

Vous ne pouvez pas geler une rangée du milieu sans que les rangées au-dessus ne soient également gelées.

Supposons que vous avez 100 lignes et que votre ligne d'en-tête se trouve à la ligne 50. Vous pouvez vous attendre à ce que seule la ligne 50 soit verrouillée de sorte que lors du défilement de la ligne 1-49, tout défile vers le haut et lorsqu'il atteint la ligne 50, la 50e ligne défile jusqu'à haut et y reste lorsque les lignes 51-100 défilent.

Mais, il existe une solution de contournement. Ce que vous pouvez faire est de regrouper les lignes, puis de les figer.

Tout d'abord, regroupez les lignes de 1 à 49, puis figez les volets de 1 à 50. L'utilisateur peut maintenant réduire le groupe, puis travailler avec la table avec l'en-tête de table verrouillé et en haut.

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

Il y a cependant un petit hic. MS Excel ne vous permet pas de développer/réduire un groupe si la feuille est protégée. Pour cela, vous devez écrire une macro.

1
Mithun P John