具体做法
方式一
导入时关于空行得处理,可直接遍历导入得row,判断为空行时直接跳过
//判断row是否为空
public static boolean isRowEmpty(Row row) {
if (null == row) {
return true;
}
int firstCellNum = row.getFirstCellNum(); //第一个列位置
int lastCellNum = row.getLastCellNum(); //最后一列位置
int nullCellNum = 0; //空列数量
for (int c = firstCellNum; c < lastCellNum; c++) {
Cell cell = row.getCell(c);
if (null == cell || Cell.CELL_TYPE_BLANK == cell.getCellType()) {
nullCellNum ++;
continue;
}
cell.setCellType(Cell.CELL_TYPE_STRING);
String cellValue = cell.getStringCellValue().trim();
if (StringUtils.isEmpty(cellValue)) {
nullCellNum ++;
}
}
//所有列都为空
if (nullCellNum == (lastCellNum - firstCellNum)) {
return true;
}
return false;
}
参考思路
方式二
根据自己实际操作,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();
}