Java 无法使用Apache POI删除空行Excel文件

Java 无法使用Apache POI删除空行Excel文件,java,excel,row,apache-poi,Java,Excel,Row,Apache Poi,我一直在尝试用我的代码删除excel文件中的空行!我的代码是: private void shift(File f){ File F=f; HSSFWorkbook wb = null; HSSFSheet sheet=null; try{ FileInputStream is=new FileInputStream(F); wb= new HSSFWorkbook(is); sheet = wb.getShe

我一直在尝试用我的代码删除excel文件中的空行!我的代码是:

private void shift(File f){
    File F=f;
    HSSFWorkbook wb = null;
    HSSFSheet sheet=null;
    try{
        FileInputStream is=new FileInputStream(F);

         wb= new HSSFWorkbook(is);
         sheet = wb.getSheetAt(0);
         for(int i = 0; i < sheet.getLastRowNum(); i++){
if(sheet.getRow(i)==null){
    sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
    i--;
}
}

FileOutputStream fileOut = new FileOutputStream("C:/juni1.xls");
wb.write(fileOut);
fileOut.close();
        //Here I want to write the new update file without empty rows! 
    }
    catch(Exception e){
        System.out.print("SERRO "+e);
    }

}

该守则完全无效。有人能告诉我问题出在哪里吗?请帮助我,从过去10个小时以来,我一直在努力做这件事。提前谢谢

好吧,我不确定你为什么会有问题,但我认为这是由于你访问工作簿的方式造成的。假设您发送的文件是您要使用的XLS工作簿的位置。您需要检查的第一件事是,该工作簿是否存在,因为POI对现有工作簿和不存在工作簿的处理不同。这是这样完成的:

HSSFWorkbook wb;
HSSFSheet sheet;
if(file.exists()) {//The workbook has been created already
    wb = (HSSFWorkbook) WorkbookFactory.create(new FileInputStream(file));//Line 1
    sheet = wb.getSheetAt(0);
} else {//No workbook exists at the location the "file" specifies
    wb = new HSSFWorkbook();
    sheet = wb.createSheet();
}
注意:第1行抛出2个异常:java.io.IOException中的IOException和org.apache.poi.openxml4j.exceptions.InvalidFormatException中的InvalidFormatException。因此,要么抛出异常,要么围绕try-catch

现在,如果文件始终存在,则实际上不需要if-else语句。但是,要正确打开所需的工作簿,我将使用WorkbookFactory

最后一句话,您可以通过简单地放置以下内容来简化文件保存:

wb.write(new FileOutputStream("C:/juni1.xls");

请注意,您还将保存的文件写入其他位置。因此,您的原始工作簿未被触动,而更正的工作簿位于不同的位置。

有两种情况下,任何一行为空

首先,该行位于其他行之间,但从未初始化或创建。在这种情况下,Sheet.getRowi将为null。 第二,行被创建了,它的单元格可能会被使用,也可能不会被使用,但是现在它的所有单元格都是空的。在这种情况下,Sheet.getRowi将不为null。您可以使用Sheet.getRowi.getLastCellNum检查它,它将始终显示与其他行相同的计数。 一般情况下,出现第二种情况。也许在你的情况下,这应该是原因。为此,您需要添加附加条件以检查所有单元格是否为空

    for(int i = 0; i < sheet.getLastRowNum(); i++){
        if(sheet.getRow(i)==null){
            sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
            i--;
        continue;
        }
        for(int j =0; j<sheet.getRow(i).getLastCellNum();j++){
            if(sheet.getRow(i).getCell(j).toString().trim().equals("")){
                isRowEmpty=true;
            }else {
                isRowEmpty=false;
                break;
            }
        }
        if(isRowEmpty==true){
            sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
            i--;
        }
    }