如何使用java和apache poi删除excel中的空单元格

时间:2014-08-08 07:13:15

标签: java excel apache-poi

使用Apache POI,我从Excel文件中提取值并写入另一个Excel文件。

但是我在输出Excel文件中得到空单元格。我如何:

  • 检测到哪些行为空
  • 然后删除这些行?

我添加了这部分代码来删除行。我能够检测到空的行但无法将其删除。

Please tell how to implement in the above code I added.

我添加了这个

public class Nlp_health {
private static boolean isRowEmpty;

public static void main(String[] args) throws IOException, ParseException, RowsExceededException, WriteException
{
    XSSFWorkbook wb = new XSSFWorkbook();
    XSSFSheet sheet1 = wb.createSheet("Sheet1");
    XSSFSheet sheet2 = wb.createSheet("Sheet2");
    XSSFSheet sheet3 = wb.createSheet("Sheet3");
    XSSFRow row_1 = sheet1.createRow((char)0);
    XSSFRow row_2 = sheet2.createRow((char)0);
    XSSFRow row_3 = sheet3.createRow((char)0);
    row_1.createCell(0).setCellValue("Column1");
    row_1.createCell(1).setCellValue("Column2");

    row_2.createCell(0).setCellValue("Column1");
    row_2.createCell(1).setCellValue("Column2");

    row_3.createCell(0).setCellValue("Column1");
    row_3.createCell(1).setCellValue("Column2");

    FileOutputStream fileOut = new FileOutputStream("C:\\Users\\Master\\Desktop\\Nlp_health3.xlsx");
    wb.write(fileOut);
    fileOut.close();

Xls_Reader datatable = new Xls_Reader("C:\\Users\\Master\\Desktop\\SMB NLP Projects to Update 20140722.xlsx");
Xls_Reader datatable1 = new Xls_Reader("C:\\Users\\Master\\Desktop\\Nlp_health.xlsx");
int rows_count = datatable.getRowCount("Projects View");
System.out.println("Total number of rows = " + rows_count);
System.out.println();
for(int i=4; i<rows_count;i++)
{
    String milestone = datatable.getCellData("Projects View", "SMB Project Health", i);
    String project = datatable.getCellData("Projects View", "Name", i);
{
    //System.out.println(value);
    if (milestone.equals("Yellow")){
        System.out.println("1st step = " + project);

          datatable1.setCellData("Sheet1", "Column1", i, project);
          datatable1.setCellData("Sheet1", "Column2", i, "Yellow");
          //System.out.println(project);
    }
    if(milestone.equals("Red")){
        System.out.println("2nd step = " + project);
        datatable1.setCellData("Sheet1", "Column2", i, "Red");
        datatable1.setCellData("Sheet1", "Column1", i, project);

    }

    }
}

int rows_count_new = datatable1.getRowCount("Sheet1");
System.out.println("Number of rows are" + rows_count_new );
for (int j = 0; j <= rows_count_new; j++){
    String empty_cells = datatable1.getCellData("Sheet1", "Column1", j);
    System.out.println("Empty step1 = " + empty_cells);
     if(sheet1.getRow(j)==null){
            sheet1.shiftRows(j + 1, sheet1.getLastRowNum(), -1);
            j--;
        continue;
        }
        for(int k =0; k<sheet1.getRow(j).getLastCellNum();k++){
            if(sheet1.getRow(j).getCell(k).toString().trim().equals("")){
                isRowEmpty=true;
            }else {
                isRowEmpty=false;
                break;
            }
        }
        if(isRowEmpty==true){
            sheet1.shiftRows(j + 1, sheet1.getLastRowNum(), -1);
            j--;
        }


}





}

}

2 个答案:

答案 0 :(得分:3)

POI Javadoc清楚地记录了XSSFSheet#removeRow(),它将从工作表中删除整行。

还有XSSFRow#removeCell(cell)删除单个细胞。

答案 1 :(得分:0)

假设:根据您的问题,您似乎担心空白行,而不是空行单元格中没有所有单元格空白的行。

可以通过两种方式找到空白行。

  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){
               // condition of blank row so do whatever you want to do in this case
               // for example I have done nothing just removed that row.
                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){
             // condition of blank row so do whatever you want to do in this case
             // for example I have done nothing just removed that row.
                sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
                i--;
            }
        }