更新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
です。オンラインドキュメントを通過した後、私は私の問題への説明を見つけることができなかった、問題上の任意の洞察力をいただければ幸いです。
乾杯。
で
ファイルに格納されているスプレッドシートの最後の行が実際にスプレッドシートの最後の行であると確信していますか?あなたは確かに行番号を印刷してみましたか? – Gagravarr
行/セルのインデックスは0から始まるので、行 "1"はインデックス0になります。 cell.toString()を見て、実際に式を返すかどうか確認してください。 – centic
はい、私はすでにこれらのトラブルシューティングの手順を行っています。セルで保持されている数式、正しい行と列の番号を印刷できますが、実際の値は計算式@Gagravarr –