如何删除Java中的Excel工作表的内容?

如何使用Java SE和Apache POI删除Excel工作簿中Excel工作表的内容?

正如前面的评论所述

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

我知道这是一个古老的线程,但我认为我find了最好的解决scheme

我所做的只是创build一个相同types的新工作簿,并将其保存在我想要删除的文件上。

这里是代码

 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)

我也得到了并发修改exception,也使用了更“现代”的方式:

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

来自@Thirupathi S的基于迭代器的解决scheme显然工作,但由于原因,我不完全知道它是创buildxslx文件,这是苹果的数字和OSX预览(也可能是其他软件)无法读取。

我怀疑这与迭代器没有删除某些东西有关:removeRow方法的代码比简单的迭代器删除操作更复杂。

使用反向索引的旧平原循环就像一个魅力:

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

其他迭代器方法似乎工作,但Excel然后拒绝打开文件。 这个为我工作:

 int rownum; while ((rownum=sheet.getLastRowNum()) > 0) sheet.removeRow(sheet.getRow(rownum)); 

这个解决scheme适用于我。 还要考虑特殊情况,例如表单为空白,或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"); } }