Как получить количество строк в файле Excel с помощью библиотеки POI?

Ребята, я сейчас использую библиотеку POI 3.9 для работы с файлами excel. Я знаю функцию getLastRowNum(), которая возвращает количество строк в файле Excel.

Единственная проблема в том, что getLastRowNum() возвращает число с отсчетом, начинающимся с 0.

Таким образом, если в файле Excel используются первые 3 строки, getLastRowNum() возвращает 2. Если в файле Excel есть только 1 строка, getLastRowNum() возвращает 0.

Проблема возникает, когда файл Excel полностью пуст. getLastRowNum() по-прежнему возвращает 0, поэтому я не могу определить, есть ли в файле Excel 1 строка данных или он пуст.

Итак, как я могу определить, является ли файл Excel пустым или нет?


person Ahmad    schedule 26.04.2013    source источник


Ответы (7)


Попробуйте Sheet.getPhysicalNumberOfRows()< /а>

person macias    schedule 26.04.2013
comment
+1 Марсиас. Просто если удалить ячейки, просто нажав «Удалить», то кажется, что строки все еще существуют физически, и возвращается старый счет. - person anujin; 18.09.2013
comment
Что ж, я думаю, что если вы хотите подсчитать строки, которые на самом деле имеют какое-то непустое значение, вам нужно будет перебрать его самостоятельно. Я не уверен, но я понимаю, что этот метод возвращает количество строк, которые когда-либо были объявлены. - person macias; 19.09.2013
comment
ПРЕДУПРЕЖДЕНИЕ. Если на листе есть пустые строки, функция getPhysicalNumberOfRows не включает их в возвращаемое число. Однако getLastRowNum также делает именно то, что написано на банке. Таким образом, чтобы перебрать все строки, вам нужно использовать getLastRowNum+1 в качестве верхней границы в вашем цикле итерации, заботясь об обработке строк, которые могут не существовать. - person Tony Eastwood; 15.07.2016

Поскольку Sheet.getPhysicalNumberOfRows() не считает пустые строки, а Sheet.getLastRowNum() возвращает 0, если есть одна строка или нет строк, я использую комбинацию двух методов для точного вычисления общего количества строк.

int rowTotal = sheet.getLastRowNum();

if ((rowTotal > 0) || (sheet.getPhysicalNumberOfRows() > 0)) {
    rowTotal++;
}

Примечание. Это будет рассматривать электронную таблицу с одной пустой строкой как пустую, но для большинства целей это, вероятно, нормально.

person MatthijsM    schedule 23.11.2017

Если вы сделаете проверку

if
(getLastRowNum()<1){
 res="Sheet Cannot be empty";
return
}

Это гарантирует, что у вас есть хотя бы одна строка с данными, кроме заголовка. Ниже моя программа, которая отлично работает. Файл Excel имеет три столбца, т.е. ID, ИМЯ, ФАМИЛИЯ

XSSFWorkbook workbook = new XSSFWorkbook(inputstream);
        XSSFSheet sheet = workbook.getSheetAt(0);
        Row header = sheet.getRow(0);
        int n = header.getLastCellNum();
        String header1 = header.getCell(0).getStringCellValue();
        String header2 = header.getCell(1).getStringCellValue();
        String header3 = header.getCell(2).getStringCellValue();
        if (header1.equals("ID") && header2.equals("NAME")
                && header3.equals("LASTNAME")) {
            if(sheet.getLastRowNum()<1){
                System.out.println("Sheet empty");
                         return;
            }   
                        iterate over sheet to get cell values
        }else{
                          SOP("invalid format");
                          return;
                          }
person JavaGeek    schedule 24.09.2013
comment
В документах указано, что это значение равно нулю. на основе. Таким образом, getLastRowNum() вернет 0, если нет столбцов или когда есть только 1 (заголовок в вашем случае). Поэтому для проверки наличия каких-либо строк также следует использовать getPhysicalNumberOfRows(). - person jl.; 10.03.2016
comment
также лист документов HSSF есть еще материалы по этой теме. - person jl.; 10.03.2016

Есть две вещи, которые вы можете сделать

использовать

int noOfColumns = sh.getRow(0).getPhysicalNumberOfCells();

or

int noOfColumns = sh.getRow(0).getLastCellNum();

Между ними есть приличная разница

  1. Вариант 1 дает количество столбцов, которые фактически заполнены содержимым (если второй столбец из 10 столбцов не заполнен, вы получите 9)

  2. Вариант 2 просто дает вам индекс последнего столбца. Значит сделано 'getLastCellNum()'

person Abhishek Singh    schedule 28.08.2015

getLastRowNum() возвращает индекс последней строки.

Итак, если вы хотите узнать общее количество строк = getLastRowNum() +1.

Надеюсь, это сработает.

int rowTotal = sheet.getLastRowNum() +1;
person Shadab Khan    schedule 05.03.2020

Sheet.getPhysicalNumberOfRows() не содержит пустых строк. Если вы хотите выполнить цикл для всех строк, не используйте это, чтобы узнать размер цикла.

person Steven Shiqi Wang    schedule 06.08.2020

Чтобы найти последнюю строку данных, если вы создали шаблон таблицы в Excel, где она заполнена частично или строки между строк пусты. Логика:

int count = 0;
int emptyrow=0;
int irow=0;
while (rowIterator.hasNext()) {
    row = (Row) rowIterator.next();
    if (count != 0 && !checkIfRowIsEmpty(row)) { }
    else{
        if(count!=0 && emptyrow==irow){
            emptyrow++;
        }else{
            emptyrow=0;
            irow=0;
        }
    }
    if(emptyrow>0){
        irow++;
    }
    if(emptyrow>3){
        break;
    }
    count++;
}
person Singh Ss    schedule 31.01.2019