2012-01-29 18 views
7

Szukam komórki w arkuszu kalkulacyjnym, który ma ciąg "Razem", a następnie użyj wiersza, w którym komórka ma znaleźć całkowitą wartość w innej komórce, która jest zawsze tą samą komórką/kolumną (10. komórka w indeksie 0).Jawne POI: Jak znaleźć komórkę Excel z wartością ciągu i uzyskać jej pozycję (wiersz), aby użyć tej pozycji do znalezienia innej komórki

Mam następujący kod, który nie ma błędów (składni), ale metoda findCell nie zwraca wartość ROWNUM:

public static void main(String[] args) throws IOException{ 

     String fileName = "C:\\file-path\\report.xls"; 
     String cellContent = "Total"; 
     int rownr=0, colnr = 10; 

     InputStream input = new FileInputStream(fileName); 

     HSSFWorkbook wb = new HSSFWorkbook(input); 
     HSSFSheet sheet = wb.getSheetAt(0); 

     rownr = findRow(sheet, cellContent); 

     output(sheet, rownr, colnr); 

     finish(); 
    } 

    private static void output(HSSFSheet sheet, int rownr, int colnr) { 
     /* 
     * This method displays the total value of the month 
     */ 

     HSSFRow row = sheet.getRow(rownr); 
     HSSFCell cell = row.getCell(colnr); 

       System.out.println("Your total is: " + cell);   
    } 

    private static int findRow(HSSFSheet sheet, String cellContent){ 
     /* 
     * This is the method to find the row number 
     */ 

     int rowNum = 0; 

     for(Row row : sheet) { 
      for(Cell cell : row) { 

       while(cell.getCellType() == Cell.CELL_TYPE_STRING){ 

        if(cell.getRichStringCellValue().getString() == cellContent);{ 

          rowNum = row.getRowNum(); 
          return rowNum; 
        } 
       } 
      } 
     }    
     return rowNum; 
    } 

    private static void finish() { 

     System.exit(0); 
    } 
} 

Odpowiedz

17

Metoda ta poprawka jest rozwiązanie problemu:

private static int findRow(HSSFSheet sheet, String cellContent) { 
    for (Row row : sheet) { 
     for (Cell cell : row) { 
      if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
       if (cell.getRichStringCellValue().getString().trim().equals(cellContent)) { 
        return row.getRowNum(); 
       } 
      } 
     } 
    }    
    return 0; 
} 

Pamiętaj, że colnr nadal jest wartością stałą.

+0

Bardzo dziękuję @ msi. Sugerowany kod naprawił problem, działał idealnie. Jestem względnie nowy w programowaniu, mogę zapytać: 1. dlaczego zmieniono instrukcję while i 2. Dlaczego zwrot pętli for = 0. ponownie dzięki! – lv10

+1

Kiedy używasz pętli 'while' zakładasz, że wszystkie Komórki po lewej od" total-cell "są wypełnione łańcuchem. Na przykład komórki takie jak to: | | 1 | Razem | Znalezienie FAIL zostanie znalezione, ponieważ 'while' złamie się na wartości 1. Powracanie 0 na wypadek, gdyby nie znaleziono" total-cell ". – msi

+1

Aby porównać dwa łańcuchy, należy użyć metody równości. '==' służy do porównywania typów pierwotnych, a nie obiektów. I getString() zwraca obiekt. Jeśli chcesz dowiedzieć się więcej o łańcuchach, przeczytaj o pule łańcuchów i metody stażu. Tutaj można znaleźć przypadki, w których porównanie z użyciem '==' jest poprawne. Użyłem również metody przycinania tylko dlatego, że dane wejściowe użytkownika zawierają dodatkowe spacje na końcu łańcucha. – msi

2

Masz średnik po wyciągu if która oznacza, że ​​nie będzie if praca:

if(cell.getRichStringCellValue().getString() == cellContent);{ 

Nawet jeśli to nie rozwiąże problemu, myślę, że oświadczenie while nie może być właściwa dla tutaj;

while(cell.getCellType() == Cell.CELL_TYPE_STRING) 

O ile pamiętam, istnieją inne typy komórek w UM. Spróbuj umieścić punkt przerwania na tych liniach i sprawdź, czy mają poprawny CellType.

+0

Dziękuję bardzo. Twoja sugestia była słuszna, oświadczenie o czasie miało coś nie tak. Usunąłem go i zmieniłem na instrukcję if, zgodnie z sugestią poniżej @msi. – lv10