NPOI 遇到公式时的取值情况

普通情况

假如:Excel 单元格 D1 为公式:=B1+C1

那么 NPOI.SS.UserModel.ICell 的:

  • CellType 为 NPOI.SS.UserModel.CellType.Formula。

  • CellFormulaB1+C1,注意:没有等于号;同时会格式化(比如本来公式 + 前后有空格,这里取出来是没有空格的)。

  • NumericCellValue 为 B1+C1 计算后的数值

  • 而 BooleanCellValueErrorCellValueStringCellValue 这些则会触发 System.InvalidOperationException 异常。

异常情况

比如公式中除以 0 了,不论是直接除以 0,还是因为单元格值为 0 而引发的。

那么 NPOI.SS.UserModel.ICell 的:

  • CellType 仍然为 NPOI.SS.UserModel.CellType.Formula,并不是 Error。

  • NumericCellValue 会触发异常。

  • ErrorCellValue 反而可用了,这里为数字 7。

嵌套公式

假如:Excel 单元格 C1 为公式:=A1+B1,D1 为公式:=C1+2。

此时取 D1 的 CellFormula 为 C1+2,并不是 A1+B1+c2。

总结

不管公式计算是否出错,其 CellType 均是 NPOI.SS.UserModel.CellType.Formula。

CellFormula 取出来的是公式,但是没有等号,比如:A1+B1。

如果公式计算错误,可以使用 ErrorCellValue 取出一个 byte,这个数字表示错误代码一类的。

如果公式计算不出错,可以使用 NumericCellValue 取出一个 double,这个数字表示计算结果值。

还没完

假如我们给某个单元格赋值为 #DIV/0!。注意:是我们赋的字符串,并不是公式错误时的结果。此时:

  • CellType 为 NPOI.SS.UserModel.CellType.Error。

  • UserModel.ErrorCellValue 为数字 7。

天啊,看来 NPOI 并没有把 #DIV/0! 当成字符串,而当成 ERROR 了。

继续总结


你可能感兴趣的