2017-03-24 97 views
2

我遇到了問題。 我不知道如何刪除行而不留空字行。如何刪除,不清除表格中的行? Apache POI

我使用Apache的POI 3.9和我使用下面的代碼得到錯誤:

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版本:

我已經找到了解決辦法:https://stackoverflow.com/a/3554129/6812826,但是我得到空指針,因爲我減少了每個刪除行的lastRowNum。

這是新版本:

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

最後更新: ManishChristian幫我解決這個問題!

+0

爲什麼你使用這樣一箇舊版本的Apache POI?升級時會發生什麼? – Gagravarr

+0

現在,我已經更新到3.15和下一次迭代後刪除行產生空指針異常(@Gagravarr – Andrew

回答

3

試試這個代碼,它應該工作:

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

您需要通過每次你刪除一個行時間減少1 i。然後使用getLastRowNum()再次獲取最後一個行號。

+0

現在我想要刪除的所有行移動到文件的末尾( – Andrew

+0

,我在線程中獲得異常「main」java .lang.IllegalArgumentException:firstMovedIndex,lastMovedIndex不按順序排列 – Andrew

+0

multiple。if「if」爲true我們添加rowData來列出並從表中刪除 – Andrew