How to delete, not clear row in Sheet ? Apache POI

2020-04-08 12:57发布

问题:

I've faced with a problem. I don't know how to delete row without leaving afterwords empty row.

I am using Apache-POI 3.9 and I am getting error using next code :

 public List<MeterInfo> addToList(String patternt) throws ParseException, IOException {
        List<Object> data = new ArrayList<Object>();
        int lastRowNum = sheet.getLastRowNum();
        Row row;
        for(int i = 0; i < lastRowNum; i++){
            row = sheet.getRow(i);
            if(patternt.equals(getCurrentString(row))){
                data.add(getDataFromRow(row));
                sheet.removeRow(row);
                sheet.shiftRows(row.getRowNum() + 1, row.getRowNum() + 1, -1);
            }
        }
        saveWorkbook(new File("blabla.xlsx"));
        return data;
    }

UPDATER VERSION:

I've found the solution: https://stackoverflow.com/a/3554129/6812826 , but I am getting null pointer because I am decrease lastRowNum by each deleting row.

Here is the new version:

  public List<Object> addToList(String pattern) throws ParseException, IOException {
        List<Object> data= new ArrayList<Object>();
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i);
            if (pattern.equals(getCurrentString(row))) {
                data.add(getMeterInfo(row));
                deleteRow(row);
            }
        }
        saveWorkbook(new File("blabla.xlsx"));
        return data;
    }



private void deleteRow(Row row) {
        int lastRowNum = sheet.getLastRowNum();
        int rowIndex = row.getRowNum();
        if(rowIndex >= 0 && rowIndex < lastRowNum){
            sheet.shiftRows(rowIndex + 1, lastRowNum, -1);
        }
        if(rowIndex == lastRowNum){
            Row removingRow = sheet.getRow(rowIndex);
            if(removingRow != null){
                sheet.removeRow(removingRow);
            }
        }
    }

LAST UPDATE: ManishChristian helped me resolve this problem !

回答1:

Try this code, it should work:

for(int i = 0; i < sheet.getLastRowNum(); i++)
{
    row = sheet.getRow(i);
    if(patternt.equals(getCurrentString(row)))
    {
        data.add(getDataFromRow(row));
        // sheet.removeRow(row);    NO NEED FOR THIS LINE
        sheet.shiftRows(row.getRowNum() + 1, sheet.getLastRowNum() + 1, -1);
        i--;
    }
}

You need to decrease i by one every time you delete one row. And get the last row number again by using getLastRowNum().