根据自己实际操作,poi中lastRowNum方法获取行数的是excel最后有数据的一行,从0开始
而physicalNumberOfRows方法获取的行数是excel最后有数据的一行减去最后一行之前的空白行
工作中有一个需求是,上传excel文件导入数据,但是需要将成功的数据的条数,和失败条数返回,这种情况我的做法就是将成功的条数从excel中删除,使用
sheet.removeRow(sheet.getRow(40));
但是这个方法我们删除的只是数据,当前行并没有删除,所以留下来的是一个空行
这种情况就需要将空行后边的数据全部向前移一行,用到的方法是
sheet.shiftRows(i+1,physicalNumberOfRows,-1);
- 二个参数为需要移动的行的区间,第三个参数负数代表向前移,正数代表向后移
具体代码:
FileInputStream fileInputStream = new FileInputStream("D:\\MyDocuments\\itw_renzm\\桌面\\file.xls"); HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream); HSSFSheet sheet = workbook.getSheetAt(0); int physicalNumberOfRows = sheet.getPhysicalNumberOfRows(); int lastRowNum = sheet.getLastRowNum(); //清除excel当前行 sheet.removeRow(sheet.getRow(10)); sheet.removeRow(sheet.getRow(20)); sheet.removeRow(sheet.getRow(21)); sheet.removeRow(sheet.getRow(22)); sheet.removeRow(sheet.getRow(23)); sheet.removeRow(sheet.getRow(24)); sheet.removeRow(sheet.getRow(40)); System.out.println(lastRowNum+"------"+physicalNumberOfRows); for(int i =1;i<lastRowNum;i++){ Row row = sheet.getRow(i); Cell cell = null; String cellValue = ""; if (row!=null){ cell = row.getCell(0); cellValue = POIUtil.getCellValue(cell); } if (row==null||cell==null||cellValue==""){ sheet.shiftRows(i+1,lastRowNum,-1); i--; //减去一条空行,总行数减一。 lastRowNum--; } } FileOutputStream fileOutputStream = new FileOutputStream("D:\\MyDocuments\\itw_renzm\\桌面\\file1.xls"); workbook.write(fileOutputStream); fileOutputStream.close(); workbook.close(); fileInputStream.close(); }