Как удалить содержимое листа 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));