从POI中的WorkBook中删除工作表

时间:2012-12-14 03:14:36

标签: java apache-poi

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

这是我的代码

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

2 个答案:

答案 0 :(得分:7)

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

关于工作表A,B,C和D的情况。你迭代到i = 1,得到B.你删除B.如果你没有在1处重新获取行,继续前进到i = 2,你将在D上,并且会跳过C!反向迭代可以避免这个问题。

答案 1 :(得分:-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();