2017-09-12 87 views
1

Apache POIライブラリを使用して、Excelテーブルをアプリケーション(tableView)にエクスポートします。 Excelのアプリケーションから行を削除する際にいくつか問題があります。行の削除は正常に動作しますが、行を削除してアプリケーションを再起動すると、最後のエントリが2回インポートされます。私が4または5のエントリを削除すると、再起動時に最後のエントリが4または5回表示されます。私は最後の行番号が保存または更新されないと思う。エクセルファイル内の行の削除は、行を削除してファイルをインポートした後、テーブルビューでのみ有効です。最後のエントリは2回表示されます。アプリケーションを開始するlastRowNum()= 6; - >エントリ(行)を削除し、インポートを再スタートする - > lastRowNum()= 6;それはExcelのバグなのでしょうか?私はどんな助けにもとても感謝しています。どうもありがとう。Apache POI - Excelでアプリケーションから行を削除する

削除方法:

のFileInputStreamのINP =新規のFileInputStream( "...")。 (のInputStreamと変数なし)

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

    String selectedid = "4"; 
    int rowIndex = getRowIndexOfId(sheet, selectedid); 

    removeRow(sheet, rowIndex); 

    inp.close(); 

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

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

} 

インポート:

Iterator<Row> rows = sheet.iterator(); 

    System.out.println(sheet.getLastRowNum()); 

    while (rows.hasNext()) { 
     nextRow = rows.next(); 
     Iterator<Cell> cellIterator = nextRow.cellIterator(); 

     while (cellIterator.hasNext()) { 
      cell = (HSSFCell) cellIterator.next(); 

      if (nextRow.getRowNum() == 0) { 
       nextRow = rows.next(); 
       continue; 
      } 

      try { 

       if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING 
         || cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { 

        auftragsnr = nextRow.getCell(0).getStringCellValue(); 
        empfaenger = nextRow.getCell(1).getStringCellValue(); 
        auftrag1 = nextRow.getCell(2).getStringCellValue(); 
        beschreibung = nextRow.getCell(3).getStringCellValue(); 
        zimmernr = nextRow.getCell(4).getNumericCellValue(); 
        datum = nextRow.getCell(5).getDateCellValue(); 
        absender = nextRow.getCell(6).getStringCellValue(); 
        status = nextRow.getCell(7).getStringCellValue(); 

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 

        Instant instant = datum.toInstant(); 
        ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault()); 
        date = zdt.toLocalDate(); 

       } 

      } catch (NullPointerException e) { 
       System.out.println("leer"); 
      } 

     } 

     if (nextRow.getRowNum() <= sheet.getLastRowNum()) { 

      tableview.add(
        new Auftrag(auftragsnr, empfaenger, auftrag1, beschreibung, zimmernr, date, absender, status)); 

      excelFile.close(); 

     } 
    } 

} 

答えて

1

私は同じ問題を抱えていた、と
sheet.removeRow(removingRow);
私が思うに呼び出した後、ライン
sheet.createRow(sheet.getLastRowNum()+1); // adds empty row on last position
を追加することによってそれを解決このコンテキストではgetLastRowNum()メソッドをあまり重大なものにしてはいけません。 Excelのシートを使ったアイデアは、無制限とみなされるべきだということです。

+0

私はlastRowNumberを保存し、この値をクラス間で切り替えるクラス変数で解決しました.....ありがとうzmau! – Yannick

関連する問題