2012-03-10 14 views
1

私はブックからデータを取り出すプログラムを持っています。シートの1つに、同じワークブックの別のシートを含む数式からデータを取得するセルがあります。ワークブックは「週11.xls」と呼ばれ、シートは土APと呼ばれます。私がすべきときに週11 sat.xlsをオープンしようとしているかのように外部のワークブック週に思え11 sat.xlsを解決できないというエラーが出るApache POIの数式評価者

HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(myWorkbook); 
    HSSFCell cell = myWorkbook.getSheetAt(11).getRow(10).getCell(3); 
    CellValue cv = fe.evaluate(cell); 

:私は以下のコードを使用しようとしています11.xlsの週を開こう​​としている。 myWorkbookは他の関数で使用されていますので、間違ったファイルを指していないことが分かります。どんな助けでも大歓迎です。ありがとう!

+0

本当にセルを評価する必要はありますか?あなたはファイルを変更していますか、それとも単にファイルを読み込んでいますか? (あなたが変更を加えていない場合は、もっと簡単な方法があります) – Gagravarr

+0

レスポンスのおかげで、私はセルを変更していませんが、他のメソッドでセルの値を取得しようとすると、間違った量、セルの数式は "H7 + 'Fri AP'!D11"ですが、その値を取得しようとすると金AP D11からの値のみが返されます。 – GNic24

答えて

5

必要に応じて、POIで数式セルを処理する方法は2つあります。パフォーマンス上の理由から、Excelが数式セルを書き込むと、現在の値が計算され、数式で保存されます。

ファイルを変更していない場合は、最後にExcelでファイルを処理したときにキャッシュされた値を取得して使用できます。 Excelで表示されるのと同じ値が得られ、評価を行う必要はありません。あなたがある場合はあなたのコードは、そうでない場合

if(cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) { 
switch(cell.getCachedFormulaResultType()) { 
    case HSSFCell.CELL_TYPE_STRING: 
    HSSFRichTextString str = cell.getRichStringCellValue(); 
    if(str != null && str.length() > 0) { 
     text.append(str.toString()); 
    } 
    break; 
    case HSSFCell.CELL_TYPE_NUMERIC: 
    HSSFCellStyle style = cell.getCellStyle(); 
    if(style == null) { 
     text.append(cell.getNumericCellValue()); 
    } else { 
     text.append(
       _formatter.formatRawCellContents(
        cell.getNumericCellValue(), 
        style.getDataFormat(), 
        style.getDataFormatString() 
      ) 
     ); 
    } 
    break; 
    case HSSFCell.CELL_TYPE_BOOLEAN: 
    text.append(cell.getBooleanCellValue()); 
    break; 
    case HSSFCell.CELL_TYPE_ERROR: 
    text.append(ErrorEval.getText(cell.getErrorCellValue())); 
    break; 
} 

(使用中のそれの例を見たい場合は、このコードは、POI、ExcelExtractorでExcelのテキスト抽出コードから取られる)

のようになります。最初にセルの値を変更する場合は、数式の値を再評価する必要があります。これは主にformula evaluation page on the POI siteでカバーされています。エラーメッセージのように外部のワークブック参照がある場合は、POIフォーミュラエバリュエーターに外部のワークブックごとに基礎となるファイルを見つける方法を教えてください。