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

我一直在尝试我的代码删除我的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小时。 提前致谢!

任何一行都是空白的,会有两种情况。

  1. 首先,行位于其他行之间,但不会被初始化或创build。 在这种情况下, Sheet.getRow(i)将为null。
  2. 其次,行被创build,其单元格可能会或可能不会被使用,但现在它的所有单元格都是空白的。 在这种情况下, Sheet.getRow(i)不会为空 。 (你可以通过使用Sheet.getRow(i).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--; } } 

好吧,我不确定为什么你有问题,但我认为这是由于您访问工作簿的方式。 假设您发送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抛出了两个exception,即来自java.io.IOException IOException和来自org.apache.poi.openxml4j.exceptions.InvalidFormatException InvalidFormatException 。 所以要么抛出exception,要么围绕着try-catch,就像你喜欢的那样。

现在,如果文件总是存在,那么if-else语句并不是真的需要。 但是,要正确打开所需的工作簿,我将使用WorkbookFactory

最后一句话,你可以简化你的文件保存:

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

请注意,您还将保存的文件写入其他位置。 因此,您的原始工作簿是不变的,而纠正的工作簿是在不同的地方。