正如@Gagravarr 所说,DataFormatter 现在可以处理大多数错误(我使用 poi-3.11-beta2)。但是,正如我在评论中所说,一些公式错误仍然会引发异常。
例如,当评估一个公式=xxx()
时,比如 xxx 不是一个真正的函数时,Excel 会显示,#NAME?
但我们会收到“不知道如何评估名称 'xxx'”的运行时异常。
幸运的是,它很容易处理:
public String readCellValue(Cell cell)
{
switch (cell.getCellType())
{
case Cell.CELL_TYPE_BLANK:
return "(blank)";
case Cell.CELL_TYPE_BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
case Cell.CELL_TYPE_ERROR:
return String.valueOf(cell.getErrorCellValue());
case Cell.CELL_TYPE_FORMULA:
return readFormattedCellValue(cell);
case Cell.CELL_TYPE_NUMERIC:
return String.valueOf(cell.getNumericCellValue());
case Cell.CELL_TYPE_STRING:
return cell.getStringCellValue();
default:
return "Unknown type!";
}
}
public String readFormattedCellValue(Cell cell)
{
try
{
return formatter.formatCellValue(cell, evaluator);
}
catch (RuntimeException e)
{
return e.getMessage(); // Error from evaluator, for example "Don't know how to evaluate name 'xxx'" if we have =xxx() in cell
}
}
作为记录,formatter
并evaluator
像在转换为 CSV 示例中一样创建:
try (FileInputStream fis = new FileInputStream(file))
{
// Open the workbook and then create the FormulaEvaluator and
// DataFormatter instances that will be needed to, respectively,
// force evaluation of formulae found in cells and create a
// formatted String encapsulating the cells contents.
workbook = WorkbookFactory.create(fis);
evaluator = workbook.getCreationHelper().createFormulaEvaluator();
formatter = new DataFormatter(true);
}
由于某种未知的原因,WorkbookFactory
生命只在 poi-ooml-3.11-beta2.jar 中,而不在 poi-3.11-beta2.jar 中。