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

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

}

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

还有XSSFRow#removeCell(cell)去除单个单元格。

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

空行可以通过两种方式find。

  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){ // 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--; } }