Рядки заголовка Apache POI


84

Хтось там знайомий із способом зафіксувати рядок у електронній таблиці, створеній за допомогою Apache POI 3.7? Під блокуванням я маю на увазі, що хочу, щоб рядок заголовка стовпців залишався видимим, коли користувач прокручує рядки. Моя створена електронна таблиця матиме 500 рядків, і було б корисно, якщо б імена стовпців були завжди видимими.


2
POI 3.7 трохи старий, чи є причина, чому ви не використовуєте останню версію?
Gagravarr

2
Так, це те, що дозволив мій роботодавець.

Відповіді:


130

Якщо вам потрібно заморозити будь-який конкретний рядок в будь-якому місці аркуша, який ви можете використовувати (всередині org.apache.poi.ss.usermodel.Sheet) (також доступно в POI 3.7)

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

У вашому випадку, якщо ви хочете заморозити лише перші x рядків, тоді int leftmostColumn, int topRowрозділ буде видалено, і ви можете використовувати just

Sheet.createFreezePane(int colSplit, int rowSplit)

наприклад

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

Я хочу заморозити лише 1-й стовпець і номер рядка №17, будь ласка, підкажіть мені, як цього досягти. Заздалегідь спасибі.
Ashish Burnwal

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 не дозволяє розгорнути / згорнути групу, якщо аркуш захищений. Для цього потрібно написати макрос.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.