Подсчет не нулевой строки в файле Excel с использованием Apache POI - PullRequest
4 голосов
/ 08 июня 2011

Предоставляет ли Apache POI какую-либо функцию для подсчета количества «ненулевых» строк в листе файла Excel?
В первый раз у меня есть лист Excel с 10 строками данных, функцияworksheet.getPhysicalNumberOfRows () возвращает точное число (10).Но после этого я удаляю 3 строки, тогда эта функция все еще получает 10 строк.Может быть, общее количество строк было кэшировано в любом месте POI.Что означает getPhysicalNumberOfRows ()?Как описано в его API: «Возвращает количество физически определенных строк (НЕ количество строк в листе)», но я не понимаю, что означает «физически определенный».Можете ли вы помочь мне в этом вопросе?
Большое спасибо!

Ответы [ 5 ]

3 голосов
/ 08 июня 2011

Если вы удалите строки с помощью worksheet.removeRow (Строка строк), то количество физических строк должно быть равно 7.

POI использует карту для хранения строк листа. Эта карта является физической частью. Смотри http://www.google.com/codesearch/p?hl=de#WXzbfAF-tQc/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java

Что касается логически нулевых строк, попробуйте

int notNullCount = 0;
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
    for (Cell cell : row) {
        if (cell.getCellType() != Cell.CELL_TYPE_BLANK) {
            if (cell.getCellType() != Cell.CELL_TYPE_STRING ||
                cell.getStringCellValue().length > 0) {
                notNullCount++;
                break;
            }
        }
    }
}
0 голосов
/ 05 мая 2015

Мы можем написать собственный метод, который будет игнорировать пустые строки для подсчета количества строк. Вероятно, мы можем сделать некоторые предположения на основе нашего требования. Например, в моем случае, строку можно считать пустой, если значение ее первого столбца пустое, а количество необходимо только до первой пустой строки.

Так что следующий фрагмент может быть полезен:

    public int getNonBlankRowCount(String sheetName){
    int rowCount = 0;
    int index = workbook.getSheetIndex(sheetName);
    if(index==-1){
        rowCount = -1;
        return rowCount;
    }else{
        sheet = workbook.getSheetAt(index);
        Iterator<Row> rowIterator = sheet.rowIterator();
        rowCount = 0;
        while (rowIterator.hasNext()) {             
            Row row = (Row) rowIterator.next();
            cell = (HSSFCell) row.getCell(0);
            String cellValue = cell.getStringCellValue();
            if (cellValue.isEmpty()) {
                break;
            }
            rowCount++;
        }
        return rowCount;
    }
}
0 голосов
/ 18 декабря 2013

У меня была такая же проблема. Если я удаляю строки вручную, количество строк не уменьшалось, когда я проверял это с помощью sheet.getPhysicalNumberOfRows ().

Когда я углубился в эту проблему, я нашел точную проблему. В моей строке был столбец электронной почты, и при вводе адреса электронной почты MS Office автоматически определяет его как адрес электронной почты. И когда я удалял всю эту строку вручную, ячейка, в которой находился адрес электронной почты, все еще имела «» в качестве значения (оно не будет видно, но я обнаружил, что это значение инициализируется, когда я читаю его через Java). Таким образом, поскольку эта ячейка имеет ненулевое значение (""), вся эта строка становится объявленной (вроде) и количество строк увеличивается.

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

Наконец-то я решил это, не только добавив нулевую проверку для ячеек, но и

if(cell != "")

Надеюсь, это может быть полезно для вас

0 голосов
/ 09 мая 2013

Если вы удаляете вручную, убедитесь, что вы используете строку удаления, а не просто удаляете данные в ячейках, тогда он вернет правильное значение.

0 голосов
/ 09 июня 2011

Если вы посмотрите на код POI 3.8 beta 3, вы увидите, что удаление строки также должно удалить ее запись.Таким образом, число физических строк в файле тоже должно уменьшиться

Я бы посоветовал вам попробовать более новую версию POI

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

...