2012-01-29 11 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

この方法の修正はあなたの問題を解決する:

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

ありがとう@msi。提案されたコードは問題を修正し、完全に機能しました。私はプログラミングに比較的新しいです、あなたに尋ねることができます:1.なぜあなたはwhileステートメントを変更し、2. forループの戻り値= 0.なぜなら、もう一度ありがとう! – lv10

+1

'while'ループを使うと、 'total-cell'の左のすべてのセルがstringで埋められていると仮定しています。たとえば、次のようなセルの場合:| | 1 |合計| 'while'は1の値で中断するため、whileと一緒に見つけることはできません。 'total-cell'が見つからない場合に備えて0を返します。 – msi

+1

2つの文字列を比較するには、equalsメソッドを使用する必要があります。 '=='はオブジェクトではなくプリミティブ型を比較す​​るために使われます。 getString()はObjectを返します。 Stringsについての詳細は、String poolとinternメソッドを参照してください。これは、 '=='を使って比較したときに、正しいものが見つかる場所です。 私はまた、ユーザー入力が文字列の最後に余分なスペースを入れるのが好きなので、トリムメソッドを使用しました。 – msi

2

あなたのif文の後にセミコロンを持っていることを意味し、あなたのifはしません作品:

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

これで問題が解決しない場合でも、私はあなたのwhile文はここに適切ではないかもしれないと思います。

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

私が覚えている限り、POIには他のセルタイプがあります。これらの行にブレークポイントを置き、正しいCellTypeを持っているかどうか確認してください。

+0

ありがとうございました。あなたの提案は正しかった、whileステートメントは何か間違っていた。私はそれを削除し、以下の@msiのようにif文のために変更しました。 – lv10

関連する問題