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

时间:2013-06-22 14:32:34

标签: 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.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个小时以来我一直在尝试做这件事。提前谢谢!

2 个答案:

答案 0 :(得分:6)

当任何行为空时,会有两种情况。

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

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

答案 1 :(得分:0)

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

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

一些注意事项:Line 1引发IOException的{​​{1}}和java.io.IOException的{​​{1}}两个例外InvalidFormatException。因此,要么抛出异常,要么根据需要使用try-catch包围。

现在,如果文件始终存在,则不需要if-else语句。但是,要正确打开所需的工作簿,我将使用org.apache.poi.openxml4j.exceptions.InvalidFormatException

最后,您可以通过简单地添加:

来简化文件保存
WorkbookFactory

请注意,您还将保存的文件写入其他位置。因此,原始工作簿不会受到影响,而更正的工作簿位于不同的位置。