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

时间:2011-08-04 06:17:28

标签: java excel excel-2003 apache-poi

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

10 个答案:

答案 0 :(得分:4)

我发现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));
    }

答案 1 :(得分:4)

正如之前的评论所述

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

答案 2 :(得分:2)

根据您要删除的 内容,您可以删除单个单元格或行。

删除所有行上的完整工作表iterate并将其删除。

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

答案 3 :(得分:2)

我知道这是一个老线程,但我认为我找到了最佳解决方案

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

继承代码

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

}

答案 4 :(得分:1)

您可能想要使用HSSFWorkbook.removeSheetAt(index)

答案 5 :(得分:1)

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

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

来自@Thirupathi S的基于迭代器的解决方案显然有效,但由于原因我并不确切知道它是创建了Apple的Numbers和OSX预览(以及可能还有其他软件)无法读取的xslx文件。

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

使用具有反向索引的旧朴素for循环就像一个魅力:

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

答案 6 :(得分:0)

我猜这是一个旧线程,但我也得到了ConcurrentModificationException。根据VoiceOfUnreason,我发现这个工作:

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

答案 7 :(得分:0)

其他迭代器方法似乎有效,但Excel拒绝打开该文件。 这个对我有用:

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

答案 8 :(得分:0)

此解决方案适用于我。并且还考虑特殊情况,例如工作表为空白,或者存在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");
    }       
}

答案 9 :(得分:0)

我不删除和重新创建工作表的原因:保持对工作表作用域名称的引用。

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