在.NET中处理CVErr值是一个非常棘手的问题。问题在于,就错误处理而言,.NET(正确地)认为CVErr已经过时了。然而,在Excel单元格中仍在使用CVErr值,因此这是Excel自动化的一个相当大的遗漏。
幸运的是,有一种解决方法。检查CVErr值的方法是检查单元格所持有的数据类型。如果持有的值被定义为Integer(Int32),则其所持有的值就是CVErr。(请注意,单元格中保存的数值通常被定义为Double,只有CVerr值可以作为整数传递。)
也就是说,在最简单的层面上,要测试CVErr值,你所需要做的就是使用以下函数:
bool IsXLCVErr(object obj)
{
return obj is Int32;
}
如果您需要检查特定的 CVErr 值(例如 #N/A),那么您首先需要检查数据类型是否为 Integer(Int32),然后根据此表格检查单元格持有的特定值:
- -2146826281 = #DIV/0!
- -2146826246 = #N/A
- -2146826245 = #GETTING_DATA
- -2146826259 = #NAME?
- -2146826288 = #NULL!
- -2146826252 = #NUM!
- -2146826265 = #REF!
- -2146826273 = #VALUE!
例如,您的代码可能如下所示:
enum CVErrEnum : Int32
{
ErrDiv0 = -2146826281,
ErrGettingData = -2146826245,
ErrNA = -2146826246,
ErrName = -2146826259,
ErrNull = -2146826288,
ErrNum = -2146826252,
ErrRef = -2146826265,
ErrValue = -2146826273
}
bool IsXLCVErr(object obj)
{
return (obj) is Int32;
}
bool IsXLCVErr(object obj, CVErrEnum whichError)
{
return (obj is Int32) && ((Int32)obj == (Int32)whichError);
}
我几年前写了一篇详细的两部分文章:
这些文章是针对VB.NET编写的,但原理与C#完全相同。
(sheet.Cells[1,1] as Range).Text
看起来更好。 - Pratik Deoghare