2012-01-29 1 views
7

'Total'문자열이있는 스프레드 시트에서 셀을 찾고 있는데 해당 셀이 항상 동일한 셀/열 (0 기반 인덱스의 10 번째 셀) 인 다른 셀의 전체 값을 찾으려는 행을 사용하십시오.Java POI : 문자열 값이있는 Excel 셀을 찾고 해당 위치를 사용하여 다른 셀을 찾는 위치 (행)를 얻는 방법

나는 오류 (구문)가없는 다음 코드,하지만 findCell 방법은 반환하지 않습니다 않은 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); 
    } 
} 

답변

17

이 방법의 수정 문제에 대한 솔루션입니다.

+0

감사합니다. @ msi. 제안 된 코드가 문제를 해결하여 완벽하게 작동했습니다. 나는 상대적으로 프로그래밍에 익숙하지 않고 다음과 같은 질문을 할 수있다. 1. 왜 while 문을 변경 했는가? 2. for 루프의 반환 = 0. 왜 다시 한번 감사하라! – lv10

+1

'while' 루프를 사용하면 'total-cell'의 왼쪽에있는 모든 셀이 string으로 채워져 있다고 가정합니다. 예를 들어 다음과 같은 셀의 경우 : | | 1 | 합계 | 'while'은 1의 값에서 깨질 것이기 때문에 while과 함께 발견 될 것입니다. 'total-cell'이없는 경우를 대비해서 0을 반환합니다. – msi

+1

두 문자열을 비교하려면 equals 메서드를 사용해야합니다. '=='는 객체가 아닌 원시 타입을 비교하는 데 사용됩니다. 그리고 getString()은 Object를 반환합니다. 문자열에 대해 더 자세히 알고 싶다면 문자열 풀 및 인턴 방법을 읽어보십시오. 이것은 '=='를 사용하여 비교할 때 올바른 경우를 찾을 수있는 곳입니다. 사용자 입력이 문자열의 끝에 추가 공백을 포함하기를 좋아하기 때문에 trim 메소드도 사용했습니다. – msi

2

당신은 당신의 if 문 다음에 세미콜론을 의미하여 if은하지 않습니다 작업 :

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

이 문제가 해결되지 않더라도, 당신의 while 문이 여기에 대한 적절한하지 않을 수 있습니다 생각;

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

내가 아는 한 POI에 다른 셀 유형이 있습니다. 이 줄에 중단 점을 넣고 셀 유형이 올바른지 확인하십시오.

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

당신의 colnr 여전히 고정 된 값을 유의하십시오 :

+0

대단히 감사합니다. 당신의 제안은 옳았습니다, while 진술은 뭔가 잘못되었습니다. 나는 그것을 제거하고 아래에 @msi에 제안 된 if 문을 위해 그것을 변경했다. – lv10