Блокировка строк заголовков 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раздел будет удален, и вы можете использовать только

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-developers)

Я не знаю подробностей этого, но стоит разобраться, если вы в той лодке.

Акокскис
источник
1

Вы не можете заморозить средний ряд, не заморозив ряды над ним.

Предположим, у вас есть 100 строк, а ваша строка заголовка находится в строке 50. Вы можете ожидать, что только строка 50 будет заблокирована, так что при прокрутке от строки 1-49 все прокручивается вверх, а когда она достигает строки 50, 50-я строка прокручивается до вверху и остается там при прокрутке строк 51-100.

Но есть обходной путь. Что вы можете сделать, так это сгруппировать строки, а затем заморозить их.

Сначала сгруппируйте строки от 1 до 49, а затем закрепите панели от 1 до 50. Теперь пользователь может свернуть группу, а затем работать с таблицей с заблокированным заголовком таблицы вверху.

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

Однако есть небольшая загвоздка. MS Excel не позволит развернуть / свернуть группу, если лист защищен. Для этого вам нужно написать макрос.

Митхун П. Джон
источник