2017-09-12 12 views
0

Apache POi HSSFライブラリを使用してExcelテーブルをアプリケーション(tableview)にインポートしてエクスポートしています。私はJavaから特定のIDを持つExcelで行を削除したいと思います。できます。私の問題は、私は行を削除した後、空の行があり、それは選択された行以上を削除します。誰も助けてくれますか?ここでApache POI - セルを削除して上に移動

FileInputStream inp = new FileInputStream(
      "..............."; 

    HSSFWorkbook wb = (HSSFWorkbook) WorkbookFactory.create(inp); 
    HSSFSheet sheet = wb.getSheetAt(0); 

    String selectedid = auftragTabelle.getSelectionModel().getSelectedItem().getId(); 

    int rowIndex = 0; 
    int lastRowNum = sheet.getLastRowNum(); 

    for (Row row : sheet) { 
     for (Cell cell : row) { 
      if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
       if (cell.getRichStringCellValue().getString().trim().equals(selectedid)) { 
        rowIndex = cell.getRowIndex(); 
       } 
      } 
     } 
    } 

    if (rowIndex >= 0 && rowIndex < lastRowNum) { 
     sheet.shiftRows(rowIndex, lastRowNum, -1); 
    } 

    if (rowIndex <= lastRowNum) { 
     HSSFRow removingRow = sheet.getRow(rowIndex); 

     if (removingRow != null) { 
      sheet.removeRow(removingRow); 
     } 
    } 

    OutputStream out = new FileOutputStream(
      "............"; 

    wb.write(out); 
    out.close(); 

} 

答えて

0

は、私はそれを行うだろうかの例です:

public static void main(String[] args) throws InvalidFormatException, IOException { 
    FileInputStream inp = new FileInputStream(FILENAME); 

    HSSFWorkbook wb = (HSSFWorkbook) WorkbookFactory.create(inp); 
    HSSFSheet sheet = wb.getSheetAt(0); 

    String selectedid = "3"; 

    int rowIndex = getRowIndexOfId(sheet, selectedid); 

    removeRow(sheet, rowIndex); 

    OutputStream out = new FileOutputStream(FILENAME); 

    wb.write(out); 
    out.close(); 
} 
private static int getRowIndexOfId(HSSFSheet sheet, String selectedid) { 
    DataFormatter formatter = new DataFormatter(); 
    for (Row row : sheet) { 
     for (Cell cell : row) { 
      if (formatter.formatCellValue(cell).trim().equals(selectedid)) { 
       return row.getRowNum(); 
      } 
     } 
    } 
    return -1; 
} 
private static void removeRow(HSSFSheet sheet, int rowIndex) { 
    if (rowIndex >= 0) { 
     sheet.removeRow(sheet.getRow(rowIndex)); 
     if(rowIndex < sheet.getLastRowNum()) { 
      sheet.shiftRows(rowIndex + 1, sheet.getLastRowNum(), -1); 
     } 
    } 
} 

いくつかのコメント:

  1. あなたは、セルの値をフォーマットするクラスDataFormatterを使用することができます(そうすることができます任意のセル値を比較)

  2. I - あなたのように - セル内の任意のセルを比較します。私の典型的な使用例は、idを見つけるために各行の最初の列を検索することです。あなたがそれを望むなら、それに応じてコードを調整してください。

  3. 私は最後にシフト行を行いました。これはうまくいくはずです。

+0

おはよう、ありがとうございました。できます。しかし、私はこのファイルのインポートをreastart、最後のエントリは、テーブルビューで2回表示されます。 lastRowNumberは、行を削除する前と同じですと思います。あなたはこの問題の答えを知っていますか? – Yannick

+0

4または5のエントリを削除すると、再起動時に最後のエントリが4または5回表示されます。私は最後の行番号を保存しないと思う。 – Yannick

+0

これは私のテストデータと一緒に働いています(私はすべての行を1つずつ削除しています)。どのような種類のデータがシートにありますか(行の数、列の数など)? – JensS

関連する問題