Удаление нескольких пустых строк в XLS с помощью Apache POI HSSF с увеличивающимся циклом

Мне нужно удалить несколько строк листа Excel xls. Эти строки всегда содержат одну и ту же первую ячейку, поэтому я проверяю первую ячейку всех строк, чтобы найти эти строки

SSFCell myCell = myRow.getCell(0);
            myCell.setCellType(Cell.CELL_TYPE_STRING);
            String foundString = myCell.getStringCellValue();
            if(foundString.equals(searchString)){
                foundRows.add(rowCount);
            }
            rowCount++;

Затем я продолжаю и «удаляю» эти строки с помощью removeRow, которая обнуляет все значения.

public static void removeRows() {

    List<Integer> foundRowsToDelete = new ArrayList<Integer>();
    //Copy values to another list
    for(int i=0; i<foundRows.size(); i++){
        foundRowsToDelete.add(foundRows.get(i));
    }
    //Delete values from rows, leaving empty rows
    while(foundRowsToDelete.size()!=0){
        int rowIndex = foundRowsToDelete.get(0);
        Row removingRow = mySheet.getRow(rowIndex);
        if (removingRow != null) {
            mySheet.removeRow(removingRow);
            foundRowsToDelete.remove(0);
    }
}
    //Move empty rows to bottom of the sheet
    for(int i = 0; i < mySheet.getLastRowNum(); i++){
        if(isRowEmpty(i)){
            mySheet.shiftRows(i+1, mySheet.getLastRowNum(), -1);
            i--;
        }
    }
}

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

//Comparision of previously detected empty rows and given row count
public static boolean isRowEmpty(int suspectedRowNumber) {
    for(int i=0;i<foundRows.size();i++){
        if (suspectedRowNumber == foundRows.get(i)){
            foundRows.remove(i);
            return true;
        }
    }
    return false;
}

Однако удаляется только первая из этих строк. Остальное останется пустым. Поэтому я предполагаю, что что-то не так с некоторым приращением, сделанным мной, но я просто не могу точно понять, почему.

Заранее благодарны за Вашу помощь.


person Chris Arenz    schedule 05.01.2016    source источник
comment
@sidgate Используя цикл for, я получил бы список, состоящий из {1,2,3,4,5 ... n}. Я хочу получить индекс этих пустых строк, скопировав его из списка foundRows. Поскольку i является инкрементным, это недопустимый подход. Изменить: он предложил использовать foundRowsToDelete.add(i); вместо foundRowsToDelete.add(foundRows.get(i));   -  person Chris Arenz    schedule 05.01.2016
comment
Также я считаю, что ошибка находится в перемещении пустых строк в нижнюю часть цикла листа   -  person Chris Arenz    schedule 05.01.2016


Ответы (1)


Не сразу понятно, почему ваш код не работает, но я смотрю на пару вещей для отладки

  1. Ваш foundRowsToDelete ArrayList заполняется значениями, содержащимися в массиве foundRows. Вы уверены, что то, что вы ожидаете найти в foundRows, действительно есть.

  2. Есть ли причина, по которой вы не удаляете строку при первоначальном просмотре строк на листе? Может быть, примерно так:

Sheet sheet = workbook.getSheetAt(0);
    For (Row row : sheet) {
        SSFCell myCell = row.getCell(0);
        if(myCell.getCellType() == Cell.CELL_TYPE_STRING){
            String foundString = myCell.getStringCellValue();
            if(foundString.equalsIgnoreCase(searchString){         
                // why not just remove here?
                sheet.removeRow(row);

            }
        }
    }
}

person zmelvin    schedule 05.01.2016