你需要使用FormulaEvaluator,如此处所示
here 。这将返回单元格中存在的值或公式结果(如果单元格包含公式)。
FileInputStream fis = new FileInputStream("/somepath/test.xls");
Workbook wb = new HSSFWorkbook(fis);
Sheet sheet = wb.getSheetAt(0);
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
CellReference cellReference = new CellReference("B3");
Row row = sheet.getRow(cellReference.getRow());
Cell cell = row.getCell(cellReference.getCol());
if (cell!=null) {
switch (evaluator.evaluateFormulaCell(cell)) {
case Cell.CELL_TYPE_BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.println(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
System.out.println(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_BLANK:
break;
case Cell.CELL_TYPE_ERROR:
System.out.println(cell.getErrorCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
break;
}
}
如果您需要精确的内容(例如,如果单元格包含公式,则为公式),则可以在此处查看:
这里。
编辑:
添加了一些示例来帮助您。
首先,您需要获取单元格(只是一个示例)。
Row row = sheet.getRow(rowIndex+2);
Cell cell = row.getCell(1);
如果你只想使用公式将值设置到单元格中(而不知道结果):
String formula ="ABS((1-E"+(rowIndex + 2)+"/D"+(rowIndex + 2)+")*100)"
cell.setCellFormula(formula)
cell.setCellStyle(this.valueRightAlignStyleLightBlueBackground)
如果你想在单元格出现错误时更改消息,你需要修改公式,例如:
IF(ISERR(ABS((1-E3/D3)*100));"N/A"; ABS((1-E3/D3)*100))
(这个公式检查评估是否返回错误,如果是则显示字符串“N/A”,否则显示评估结果)。
如果您想获取与公式相对应的值,则必须使用求值器。
希望这有所帮助,
Guillaume
cell.getStringCellValue();
或cell.getNumericCellValue();
获取它们。您的回答适用于单元格包含公式的情况,但是OP并没有表明这种情况。 - posdefevaluateFormulaCell()
会返回-1,因此您仍然需要稍微不同地处理公式和非公式单元格,即从getCellType()
获取单元格类型。我已编辑您的代码以进行额外检查。 - Steve Blackwell