У меня есть эта электронная таблица
Я хотел бы перебрать все строки, содержащие ключевые слова "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);
}
}
}
Результат выглядит следующим образом
Когда я запускаю в режиме отладки, я могуобратите внимание, что в моем 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.
Мне интересно, где я могу поступить неправильно?
Спасибо.