4

我有一个工作簿,我正在尝试删除名称与特定字符串不匹配的工作表。

这是我的代码

XSSFWorkbook book = new XSSFWorkbook(new FileInputStream(excelName));                   
            for(int i=0;i<book.getNumberOfSheets();i++){
                System.out.println(book.getSheetAt(i).getSheetName());
                if(!book.getSheetAt(i).getSheetName().equals(sheetName)){
                    book.removeSheetAt(i);
                }
            }   

代码运行良好,但没有执行所需的任务

编辑

如上所述的解决方案是反转循环顺序。这是一个更干净的代码

private void removeOtherSheets(String sheetName, XSSFWorkbook book) {       
            for(int i=book.getNumberOfSheets()-1;i>=0;i--){
                XSSFSheet tmpSheet =book.getSheetAt(i);
                if(!tmpSheet.getSheetName().equals(sheetName)){
                    book.removeSheetAt(i);
                }
            }       
    }
4

2 回答 2

8

您应该以相反的顺序删除,而不是正向的顺序。否则,您从列表中删除工作表并更改其状态以供将来循环使用。

关于表 A、B、C 和 D 的情况。您迭代到 i=1,并获得 B。您删除 B。如果您不重新获取 1 处的行,然后继续到 i=2,你会在 D 并且会跳过 C!反向迭代避免了这个问题。

于 2012-12-14T04:47:26.373 回答
-1

使用 Apache POI 删除工作表

//Open file
  String filePath = "C:\\filePath\\excelFileName.xlsx";
  String sheetName = "NameOfSheetToBeDeleted";
  FileInputStream inputStream = new FileInputStream(new File(filePath));
  XSSFWorkbook workBook = new XSSFWorkbook(inputStream);

//DELETE SHEET
  workBook.removeSheetAt(resultWorkbook.getSheetIndex(sheetName));

//Save the file
  FileOutputStream outFile =new FileOutputStream(new File(filePath));
  workBook.write(filePath);
  outFile.close();
于 2020-04-25T08:31:34.420 回答