2016-08-22 33 views
0

更新2:何らかの理由で、私がアクセスしようとしているセルが実際に式を含むセルを合計しているということを完全に忘れてしまった。だから、Apache POI 3.14を使用してExcelで数式の計算値を取得

= SUMIF(E4 'Sheet1の' B2::!:B4、DATE(2016,8,31)、 'シート1' E2)これらの細胞は、次のようなSUMIF式が含まれています私の推論は、私は私が必要とする実際のセルを評価する前に、これらの細胞を評価しなければならなかったということでした、とFormulaEvaluatorが正しく動作していない場所です。言い換えると、単純なSUM関数は意図したとおりに評価されていますが、SUMIF関数を含むセルからは0.0を誤って合計しています。私はSUMIF関数を含むセルを更新するたびにevaluator.sumInCell()を使ってみましたが、それは0.0にも評価されています。

それは図書館がSUMIF機能をサポートしていないとしなければならないのか?あるいは、条件を変えるべきでしょうか?

============================================== ===========================

更新:わかりましたので、私は手動でのみExcelを開いて、正しい値を得ることができましたファイルを開き、直後に閉じます。実際に私が何もしていないときにファイルに変更を保存するためのプロンプトが表示されます。私はファイルを生成して操作する方法に何か問題があると思います。

private void createDataFile(File dataFile) throws IOException { 
    FileOutputStream fos = new FileOutputStream(dataFile); 
    XSSFWorkbook workBook = new XSSFWorkbook(); 

    // 
    // Code to create and populate rows and cells 
    // 

    workBook.write(fos); 
    fos.close(); 
} 

private void updateSheet(File dataFile) throws IOException { 
    Workbook workBook = WorkbookFactory.create(new FileInputStream(dataFile)); 
    Sheet sheet = workBook.getSheet(0); 

    // 
    // Code to update and manipulate cells 
    // 

    FileOutputStream fos = new FileOutputStream(dataFile); 
    workBook.write(fos); 
    fos.close(); 
} 

注:私だけcell.getNumericCellValue()を通じて価値を読むことができるよ、FormulaEvaluatorはまだどちらかのように動作しません。

============================================== ===========================

こんにちは私は、Excelシートに計算式を用いて計算値を読み取るしようとしています。 数式は、次のような単純な合計関数です。SUM(B2:B6)。 ApacheのPOI 3.14ライブラリを使用して

、私は次のコードスニペットを思い付いた:

public Double getCellValue() throws IOException, InvalidFormatException{ 
    Workbook workBook = WorkbookFactory.create(new FileInputStream(new File("data.xlsx"))); 
    Sheet sheet = workBook.getSheetAt(0); 

    // i only need one specific cell, at the last row in my sheet 
    Row row = sheet.getRow(sheet.getLastRowNum()); 
    Cell cell = row.getCell(1); 

    // this is where I am stuck 
    FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator(); 
    CellValue cellValue = evaluator.evaluate(cell); 
    return cellValue.getNumberValue(); 
} 

は私が正しいセルをターゲットにしていますことを確認しました、しかし、この方法ではなく、正しい計算値の0.0返します。

私は最初の代わりにFormulaEvaluatorを使用して別のアプローチを試みましたが、これは私に同じ誤った結果を与えていました0.0です。

オンラインドキュメントを通過した後、私は私の問題への説明を見つけることができなかった、問題上の任意の洞察力をいただければ幸いです。

乾杯。

data.xlsx content

+0

ファイルに格納されているスプレッドシートの最後の行が実際にスプレッドシートの最後の行であると確信していますか?あなたは確かに行番号を印刷してみましたか? – Gagravarr

+1

行/セルのインデックスは0から始まるので、行 "1"はインデックス0になります。 cell.toString()を見て、実際に式を返すかどうか確認してください。 – centic

+0

はい、私はすでにこれらのトラブルシューティングの手順を行っています。セルで保持されている数式、正しい行と列の番号を印刷できますが、実際の値は計算式@Gagravarr –

答えて

1

これは私の作品:

import org.apache.poi.ss.usermodel.*; 

import java.io.File; 
import java.io.FileInputStream; 

public final class Demo { 

    public static void main(final String[] args) throws Exception { 
     System.out.println(getCellValue()); 
    } 

    public static Double getCellValue() throws Exception { 
     final Workbook workBook = WorkbookFactory.create(new FileInputStream(new File("data.xlsx"))); 
     final Sheet sheet = workBook.getSheetAt(0); 

     // i only need one specific cell, at the last row in my sheet 
     final Row row = sheet.getRow(1); 
     final Cell cell = row.getCell(0); // formula in A2 
     System.err.println(cell.getCellFormula()); 

     // this is where I am stuck 
     final FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator(); 
     final CellValue cellValue = evaluator.evaluate(cell); 
     return cellValue.getNumberValue(); 
    } 
} 

出力:

SUM(B2:B6) 
15.0 

だから私は、細胞を得るためにあなたの方法でいくつかの問題があるとし、またはxlsxの内容。デバッガを使用すると、何が間違っているのかを把握できるはずです

関連する問題