2013-06-22 83 views
2

我一直在尝试我的代码来删除我的Excel文件中的空行!我的代码是:无法删除使用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个小时。提前致谢!

回答

6

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

  1. 首先,行位于其他行之间,但从未被初始化或创建。在这种情况下,Sheet.getRow(i)将为空。
  2. 第二,行被创建,它的单元格可能会或可能不会被使用,但现在它的所有单元格都是空白的。在这种情况下,Sheet.getRow(i)将不为空。 (您可以通过使用Sheet.getRow(我检查).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--; 
     } 
    } 
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抛出从java.io.IOException 2个例外IOExceptionorg.apache.poi.openxml4j.exceptions.InvalidFormatExceptionInvalidFormatException。因此,如果您愿意,可以抛出异常情况或使用try-catch进行环绕。

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

作为最后一个字,你可以通过简单地将简化您的文件保存:

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

请注意,您在保存文件还写入到不同的位置。因此,您的原始工作簿未经修改,而修正后的工作簿位于不同的位置。