普通情况
假如:Excel 单元格 D1 为公式:=B1+C1
那么 NPOI.SS.UserModel.ICell 的:
CellType 为 NPOI.SS.UserModel.CellType.Formula。
CellFormula 为 B1+C1,注意:没有等于号;同时会格式化(比如本来公式 + 前后有空格,这里取出来是没有空格的)。
NumericCellValue 为 B1+C1 计算后的数值。
而 BooleanCellValue、ErrorCellValue、StringCellValue 这些则会触发 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 了。
继续总结