Как удалить содержимое листа Excel в Java? - PullRequest
2 голосов
/ 04 августа 2011

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

Ответы [ 9 ]

4 голосов
/ 05 марта 2014

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

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();
}
4 голосов
/ 22 февраля 2012

Я обнаружил, что 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));
    }
2 голосов
/ 07 июня 2013

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

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

Вот код

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();
    }

}
2 голосов
/ 04 августа 2011

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

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

Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
   sheet.removeRow(row);
}
1 голос
/ 12 июля 2016

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

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

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

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

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

for (int i = sheet.getLastRowNum(); i >= 0; i--) {
  sheet.removeRow(sheet.getRow(i));
}
1 голос
/ 04 августа 2011

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

0 голосов
/ 28 апреля 2017

Это решение отлично работает со мной. А также рассмотрим особые случаи, например, лист пустой или имеются пробелы между 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");
    }       
}
0 голосов
/ 07 апреля 2017

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

int rownum;
while ((rownum=sheet.getLastRowNum()) > 0) sheet.removeRow(sheet.getRow(rownum));
0 голосов
/ 14 мая 2013

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

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