アプリケーションでApachepoi-3.1-FINAL-20080629を使用しています。ここで、数式の使用に1つの問題があります...
私のセルには数式(sheet2!C10)があり、このセル内のデータは文字列型($ 3,456など)です...そのセルにアクセスする方法も数式を表示したいと考えています。
私のコードは次のようになります:
HSSFWorkbook wb = new HSSFWorkbook(file);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb);
Iterator rows = sheet.rowIterator();
while (rows.hasNext()) {
HSSFRow row = (HSSFRow) rows.next();
System.out.println("\n");
Iterator cells = row.cellIterator();
while (cells.hasNext()) {
HSSFCell cell = (HSSFCell) cells.next();
int cellType = cell.getCellType();
if (HSSFCell.CELL_TYPE_NUMERIC == cellType)
System.out.print(cell.getNumericCellValue() + " ");
else if (HSSFCell.CELL_TYPE_STRING == cellType)
System.out.print(cell.getStringCellValue() + " ");
else if (HSSFCell.CELL_TYPE_BOOLEAN == cellType)
System.out.print(cell.getBooleanCellValue() + " ");
else if (HSSFCell.CELL_TYPE_BLANK == cellType)
System.out.print("BLANK ");
else if (HSSFCell.CELL_TYPE_FORMULA == cellType) {
System.out.print(evaluator.evaluateInCell(cell).toString() ); } else
System.out.print("Unknown cell type " + cellType);
}
}
evaluator.evaluateInCell(cell).toString()がnullポインター例外をスローしています。助けてください!!!
さて、最初に、Apache POI3.1はかなり古いです。手がかりは瓶の名前にあります- poi-3.1-FINAL-20080629
2008年からの日付なので、6年前です!アップグレードする価値は十分にあります。それ以降のバグ修正の数はかなり膨大です。
あなたの問題に関しては、私はあなたが電話をかけたくないとかなり確信していますevaluator.evaluateInCell
。それはほとんど決して正しい呼び出し方法ではありません
数式セルで何をしたいかに応じて、3つのオプションを利用できます。
数式文字列が欲しい
コールCell.getCellFormulaあなたは、式の文字列が返されます
Excelで計算された最後の数式値が欲しい
Excelがファイルを書き出すとき、通常、数式の最後に評価された値をキャッシュに保存して、すばやくすばやく開くことができるようにします。存在する場合は、ApachePOIからこれを読むことができます。これは単なるキャッシュであるため、常に正しいとは限りませんが、通常は正しいです。
Cell.getCachedFormulaResultTypeを呼び出してからそれをオンにし、通常のゲッターを使用して値を読み取る必要があります。
int cellType = cell.getCellType();
handleCell(cell, cellType);
private void handleCell(Cell cell, int cellType) {
if (HSSFCell.CELL_TYPE_NUMERIC == cellType)
System.out.print(cell.getNumericCellValue() + " ");
else if (HSSFCell.CELL_TYPE_STRING == cellType)
System.out.print(cell.getStringCellValue() + " ");
else if (HSSFCell.CELL_TYPE_BOOLEAN == cellType)
System.out.print(cell.getBooleanCellValue() + " ");
else if (HSSFCell.CELL_TYPE_BLANK == cellType)
System.out.print("BLANK ");
else if (HSSFCell.CELL_TYPE_FORMULA == cellType)
handleCell(cell, cell.getCachedFormulaResultType());
else
System.out.print("Unknown cell type " + cellType);
}
ApachePOIで数式の結果を計算してほしい
ここでの最善の策は、FormulaEvaluatorオブジェクトを取得し、evaluateを呼び出すことです。
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
// suppose your formula is in B3
CellReference cellReference = new CellReference("B3");
Row row = sheet.getRow(cellReference.getRow());
Cell cell = row.getCell(cellReference.getCol());
CellValue cellValue = evaluator.evaluate(cell);
switch (cellValue.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
System.out.println(cellValue.getBooleanValue());
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.println(cellValue.getNumberValue());
break;
case Cell.CELL_TYPE_STRING:
System.out.println(cellValue.getStringValue());
break;
case Cell.CELL_TYPE_BLANK:
break;
case Cell.CELL_TYPE_ERROR:
break;
// CELL_TYPE_FORMULA will never happen
case Cell.CELL_TYPE_FORMULA:
break;
}
ApacheのPOI式の評価ページには、これらのすべての詳細を持っています
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加