Как удалить содержимое листа Excel в Java?

Как удалить содержимое листа Excel в книге Excel, используя Java SE и Apache POI?

9 ответов

Как уже упоминалось в предыдущих комментариях

Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
   sheet.removeRow(row);
}

этот код вызывает исключение ConcurrentModificationException для меня. Итак, я изменил код, и он работает нормально. Вот код:

Sheet sheet = wb.getSheetAt(0);
Iterator<Row> rowIte =  sheet.iterator();
while(rowIte.hasNext()){
    rowIte.next();              
    rowIte.remove();
}

Я обнаружил, что removeSheetAt / createSheet не совсем приемлемый ответ, потому что вы не можете поместить новый лист в правильную позицию в рабочей книге, не столкнувшись с ошибкой в WorkSheet.setSheetOrder

Этот фрагмент кода

Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
   sheet.removeRow(row);
}

в моем мире кидает ConcurrentModificationException

Мне пришлось прибегнуть к

    for (int index = crnt.getLastRowNum(); index >= crnt.getFirstRowNum(); index--) {
        crnt.removeRow( crnt.getRow(index));
    }

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

Слишком стереть весь лист, перебрать все строки и удалить его.

Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
   sheet.removeRow(row);
}

Я знаю, что это старая тема, но я думаю, что нашел лучшее решение

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

Вот код

private void clearOldFile(){
    FileOutputStream out = null;
    try{
        oldFile = new XSSFWorkbook();    
        Sheet sheet = oldFile.createSheet("temp data");

        out = new FileOutputStream(AbsolutePathForTempExcelFile);
        oldFile.write(out);
        out.close();

    } catch(Exception e){
        e.printStackTrace();
    }

}

Вы, вероятно, хотите использовать HSSFWorkbook.removeSheetAt(index),

Моя причина не удалять и не воссоздавать лист: сохранить работоспособность ссылок на имена в области видимости листа.

for(int i = sheet.getLastRowNum(); i >= 0; i--)
{
  Row row = sheet.getRow(i);
  if(row != null)
  {
    sheet.removeRow(row);
  }
}

Я также получил исключение одновременной модификации, также используя более "современный" способ сделать это:

sheet.forEach(r->sheet.remove(r));

Решение, основанное на итераторах от @Thirupathi S, очевидно, работало, но по причинам, которые я точно не знаю, было создание файлов xslx, которые не могли быть прочитаны Apple Numbers и OSX Preview (и, вероятно, другими программами тоже).

Я подозреваю, что это как-то связано с тем, что итератор не удаляет что-то: код метода removeRow намного сложнее, чем простая операция удаления итератора.

Использование старого простого цикла for с обратным индексом работало как прелесть:

for (int i = sheet.getLastRowNum(); i >= 0; i--) {
  sheet.removeRow(sheet.getRow(i));
}

Я предполагаю, что это старый поток, но я также получаю ConcurrentModificationException. Основываясь на VoiceOfUnreason, я обнаружил, что это работает:

        while (xlsSheet.getPhysicalNumberOfRows() > 0) {
          xlsSheet.removeRow(xlsSheet.getRow(xlsSheet.getLastRowNum()));
        }
        if (xlsSheet.getDrawingPatriarch() != null) {
          xlsSheet.getDrawingPatriarch().clear();
        }

Это решение прекрасно работает со мной. А также рассмотрим особые случаи, например, лист пуст или присутствуют пробелы между firstRow и lastRow.

public void cleanSheet(Sheet sheet) {
    int numberOfRows = sheet.getPhysicalNumberOfRows();

    if(numberOfRows > 0) {
        for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {
            if(sheet.getRow(i) != null) {
                sheet.removeRow( sheet.getRow(i));
            } else {
                System.out.println("Info: clean sheet='" + sheet.getSheetName() + "' ... skip line: " + i);
            }
        }               
    } else {
        System.out.println("Info: clean sheet='" + sheet.getSheetName() + "' ... is empty");
    }       
}

Другие методы итератора работали, но Excel отказался открыть файл. Этот работал для меня:

int rownum;
while ((rownum=sheet.getLastRowNum()) > 0) sheet.removeRow(sheet.getRow(rownum));
Другие вопросы по тегам