【问题标题】:Unable to delete the Empty Rows Excel File using Apache POI无法使用 Apache POI 删除空行 Excel 文件
【发布时间】:2013-06-19 13:34:23
【问题描述】:

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

【问题讨论】:

    标签: java excel row apache-poi


    【解决方案1】:

    好的,我不确定您遇到问题的确切原因,但我认为这是由于您访问工作簿的方式。假设您发送的文件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 抛出 2 个异常 IOException 来自 java.io.IOException 和 InvalidFormatException 来自 org.apache.poi.openxml4j.exceptions.InvalidFormatException。因此,要么抛出异常,要么根据需要使用 try-catch 包围。

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

    最后,您可以通过简单地输入以下内容来简化文件保存:

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

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

    【讨论】:

      【解决方案2】:

      任意一行为空会有两种情况。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多