Перейти к основному содержимому

Поиск последней строки в электронной таблице Excel из Java

· 4 мин. чтения

1. Обзор

В этом руководстве мы обсудим, как найти последнюю строку в электронной таблице Excel с помощью Java и Apache POI .

Во-первых, мы увидим, как получить одну строку из файла с помощью Apache POI. Затем мы рассмотрим методы подсчета всех строк на листе. Наконец, мы объединим их, чтобы получить последнюю строку данного листа.

2. Получить одну строку

Как мы уже знаем, Apache POI предоставляет абстрактный слой для представления документов Microsoft , включая Excel , на языке Java. Мы можем получить доступ к листам в файле и даже прочитать и изменить каждую ячейку.

Давайте начнем с извлечения одной строки из нашего файла Excel. Прежде чем двигаться дальше, нам нужно получить рабочий лист из файла:

Workbook workbook = new XSSFWorkbook(fileLocation);
Sheet sheet = workbook.getSheetAt(0);

Workbook — это Java - представление файла Excel, а Sheet — это основная структура Workbook . Рабочий лист — наиболее распространенный подтип Листа , представляющий сетку ячеек.

Когда мы открываем наш рабочий лист в Java, мы можем получить доступ к содержащимся в нем данным, т. е. к данным строки. Чтобы получить одну строку, мы можем использовать метод getRow(int) :

Row row = sheet.getRow(2);

Метод возвращает объект Row — высокоуровневое представление одной строки из файла Excel или null, если строка не существует.

Как мы видим, нам нужно предоставить единственный параметр, индекс (начиная с 0) запрошенной строки. К сожалению, нет доступного API для прямого получения последней строки.

3. Найдите количество строк

Мы только что узнали, как получить одну строку из файла Excel с помощью Java. Теперь давайте найдем индекс последней строки на данном листе.

Apache POI предоставляет два метода, которые помогают подсчитывать строки: getLastRowNum() и getPhysicalNumberOfRows() . Давайте посмотрим на каждый из них.

3.1. Использование getLastRowNum()

Согласно документации, метод getLastRowNum() возвращает номер (на основе 0) последней инициализированной строки на листе или -1, если строки не существует:

int lastRowNum = sheet.getLastRowNum();

После того, как мы получили lastRowNum , теперь мы должны легко получить доступ к последней строке с помощью метода getRow() .

Мы должны отметить, что строки, которые ранее имели содержимое и были установлены как пустые позже, могут по-прежнему считаться строками . Поэтому результат может быть не таким, как ожидалось. Чтобы понять это, нам нужно больше узнать о физических строках.

3.2. Использование getPhysicalNumberOfRows()

Изучая документацию Apache POI, мы можем найти специальный термин, относящийся к строкам — физическая строка.

Строка всегда интерпретируется как физическая, если она содержит какие-либо данные. Строка инициализируется не только в том случае, если какие-либо ячейки в этой строке содержат текст или формулы, но также и в том случае, если в них есть некоторые данные о форматировании , например, цвет фона, высота строки или используемый шрифт не по умолчанию. Другими словами, каждая инициализируемая строка также является физической .

Чтобы получить количество физических строк, Apache POI предоставляет метод getPhysicalNumberOfRows() :

int physicalRows = sheet.getPhysicalNumberOfRows();

Согласно объяснению физической строки, результат может отличаться от числа, полученного с помощью метода getLastRowNum() .

4. Получить последнюю строку

Теперь давайте проверим оба метода на более сложной сетке Excel:

./d2c27495fd3d2d0b2239361c1227d4c9.jpg

Здесь ведущие строки содержат текстовые данные, значение, рассчитанное по формуле ( =A1 ), и соответственно измененный цвет фона. Затем 4-й ряд изменил высоту, а 5-й и 6-й ряды остались нетронутыми. 7-я строка снова содержит текст. В 8-й строке текст был предварительно отформатирован, но позже очищен. 9-я и последующие строки не редактировались.

Давайте проверим результаты методов подсчета:

assertEquals(7, sheet.getLastRowNum());
assertEquals(6, sheet.getPhysicalNumberOfRows());

Как мы упоминали ранее, номер последней строки и физическое количество строк в некоторых случаях различаются .

Давайте теперь выберем строки на основе их индекса:

assertNotNull(sheet.getRow(0)); // data
assertNotNull(sheet.getRow(1)); // formula
assertNotNull(sheet.getRow(2)); // green
assertNotNull(sheet.getRow(3)); // height
assertNull(sheet.getRow(4));
assertNull(sheet.getRow(5));
assertNotNull(sheet.getRow(6)); // last?
assertNotNull(sheet.getRow(7)); // cleared later
assertNull(sheet.getRow(8));
...

Как мы видим, getPhysicalNumberOfRows() возвращает общее количество ненулевых (то есть инициализированных) строк на листе. Значение getLastRowNum() — это индекс последней ненулевой строки .

Следовательно, мы можем получить последнюю строку на листе:

Row lastRow = null;
int lastRowNum = sheet.getLastRowNum();
if (lastRowNum >= 0) {
lastRow = sheet.getRow(lastRowNum);
}

Однако мы должны помнить, что последняя строка, возвращаемая Apache POI, не всегда является той, в которой отображается текст или формула , особенно в некоторых редакторах пользовательского интерфейса, таких как Microsoft Excel.

5. Вывод

В этой статье мы проверили API Apache POI и извлекли последнюю строку из заданного файла Excel.

Мы начали с пересмотра некоторых основных методов открытия электронной таблицы в Java. Затем мы представили метод getRow(int) для получения одной строки . После этого мы проверили значения getLastRowNum() и getPhysicalNumberOfRows() и объяснили их разницу. Наконец, мы проверили все методы на сетке Excel, чтобы получить последнюю строку.

Как всегда, полная версия кода доступна на GitHub .