Невозможно удалить отдельные строки и пустые строки в электронной таблице xlsx с помощью Apache POI - PullRequest
0 голосов
/ 05 марта 2019

У меня есть эта электронная таблица

enter image description here

Я хотел бы перебрать все строки, содержащие ключевые слова "USED" и пустые строки (пробелы), сохранить всеномера строк, которые соответствуют этим критериям для ArrayList, затем зациклите мою электронную таблицу и удалите все номера строк, перечисленные в моем ArrayList.

Я попробовал и изменил некоторые решения из Stackoverflow (одно из них здесь ).Мои коды выглядят так

 // Remove "USED" and empty string from spreadsheet
    private static void cleanUpSheet(String sheetName, String pathToExcel) throws IOException, InvalidFormatException {

        FileInputStream fileInput = new FileInputStream(pathToExcel);
        Workbook workbook = WorkbookFactory.create(fileInput);

        List<Integer> toRemove = new ArrayList<>();

        int index = workbook.getSheetIndex(sheetName);
        if (index == -1)
            System.out.println("No sheet Found");
        else {
            System.out.println("Index " + index);
            Sheet sheet = workbook.getSheetAt(index);
            Iterator<Row> rowItr = sheet.iterator();
            DataFormatter formatter = new DataFormatter();
            System.out.println("Total ROW " + sheet.getLastRowNum());
            while (rowItr.hasNext()) {
                Row row = rowItr.next();
                if (containsValue(row, row.getFirstCellNum(), row.getLastCellNum())) {
                    //Row contains value
                    System.out.println("Value Cell 0 " + formatter.formatCellValue(row.getCell(0)));
                    if (formatter.formatCellValue(row.getCell(0)).equals("USED")) {
                        System.out.println("Value cell 0 should contain USED " + formatter.formatCellValue(row.getCell(0)));
                        toRemove.add(row.getRowNum());
                        System.out.println("What I am removing "+ row.getCell(4).getRichStringCellValue());
                    }
                    continue;
                } else {
                    //Row does not contain value
                    System.out.println("Empty row " + formatter.formatCellValue(row.getCell(0)));
                    toRemove.add(row.getRowNum());
                    System.out.println("What I am removing "+ row.getCell(4).getRichStringCellValue());
                }
            }
            for (int i = 0 ; i<toRemove.size() ; i++) {
                System.out.println("To Remove " + toRemove.get(i));
                removeRow(pathToExcel,toRemove.get(i),false,sheet);
            }

            System.out.println("New Total Row " + sheet.getLastRowNum());
        }

        fileInput.close();

        FileOutputStream outFile = new FileOutputStream(new File(pathToExcel));
        workbook.write(outFile);
        outFile.close();
    }

    private static void removeRow(String pathToExcel, int rowToBeRemoved, boolean removeIndexOneOnly, Sheet sheet) throws IOException, InvalidFormatException {

        if (removeIndexOneOnly == true) rowToBeRemoved = 1;

        int lastRowNum = sheet.getLastRowNum();
        Row row = sheet.getRow(rowToBeRemoved);
        if (row != null && rowToBeRemoved != lastRowNum) {
            //System.out.println(row.getCell(3).getRichStringCellValue()); //For Testing
            //System.out.println(row.getCell(4).getRichStringCellValue()); //For Testing
            System.out.println("row to be removed " + rowToBeRemoved);
            System.out.println("last row " + lastRowNum);

            sheet.removeRow(row);
            sheet.shiftRows(rowToBeRemoved + 1, lastRowNum, -1);
        }

        if (rowToBeRemoved == lastRowNum) {
            System.out.println("Very Last Row");
            Row removingRow = sheet.getRow(rowToBeRemoved);
            if (removingRow != null) {
                sheet.removeRow(removingRow);
            }
        }


    }

Результат выглядит следующим образом

enter image description here

Когда я запускаю в режиме отладки, я могуобратите внимание, что в моем List<Integer> toRemove указаны правильные номера строк, которые я хочу удалить (т. е. содержащие «USED» и пустые пробелы).Все идет нормально.

Но когда я выполняю эту часть кодов

    for (int i = 0 ; i<toRemove.size() ; i++) {
                System.out.println("To Remove " + toRemove.get(i));
                removeRow(pathToExcel,toRemove.get(i),false,sheet);
            }

Просто не удаляются все строки, перечисленные в List<Integer> toRemove.

Я использую POI 3.17.

Мне интересно, где я могу поступить неправильно?

Спасибо.

...