2017-09-12 4 views
1

Apache POI libary를 사용하여 가져오고 응용 프로그램 (tableView)으로 Excel 테이블을 내 보냅니다. Excel에서 응용 프로그램의 행을 삭제하는 데 문제가 있습니다. 행의 제거 잘 작동하지만 행을 제거하고 응용 프로그램을 다시 시작하면 마지막 항목을 두 번 가져옵니다. 4 또는 5 개의 항목을 삭제하면 다시 시작할 때 마지막 항목이 4 또는 5 번 표시됩니다. 마지막 줄 번호가 저장되거나 업데이트되지 않는다고 생각합니다. 엑셀 파일의 행 제거는 행을 제거하고 파일을 가져온 후에 내 테이블 뷰에서만 잘 작동합니다. 마지막 엔트리가 두 번 표시됩니다. 응용 프로그램 시작 lastRowNum() = 6; -> 항목 (행)을 제거하고 가져 오기 다시 시작 -> lastRowNum() = 6; Excel Bug입니까? 어떤 도움이든 너무 감사하게 생각합니다. 고마워.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() 메소드를 너무 심각하게 사용해서는 안됩니다. 엑셀의 시트를 사용하는 아이디어는 무제한으로 간주되어야한다는 것입니다.

+0

클래스 변수를 사용하여 lastRowNumber를 저장하고이 값을 클래스간에 전환하면 해결되었습니다 ..... thanks zmau! – Yannick