1. 程式人生 > >Excel互操作中讀取資料的方法(Range.Value2屬性)

Excel互操作中讀取資料的方法(Range.Value2屬性)

1. Range.Value2屬性

MSDN:Returns or sets the cell value. Read/write Variant.

使用該屬性讀取某一範圍內的資料。

1.1 返回值

返回值將返回Range.Value2屬性的副本,而非內部物件的引用。
object[,] value = (object[,])range.Value2;   
object v11 = value[1, 1];//v11 = "aaa"  
v11 = 10;//v11 = 10  
object v11new = ((object[,])range.Value2).GetValue(1, 1);//v11new = "aaa" 


1.2 範圍型別

對於單個單元格來說,返回的是單元格型別。例如,Excel中的數字1.4返回的是double型別。

對於多個單元格來說,返回的是object二維陣列(object[,])型別。而且需要注意的是,這些陣列的維數下限(下標)是從1開始的。

Excel.Range range1 = sheet.get_Range("A1", "A1");   
object value1 = range1.Value2;//value1 = "aaa"  
object[,] value11 = (object[,])range1.Value2;//引發InvalidCastException         

Excel.Range range2 = sheet.get_Range("A1", "E3");   
object value2 = range2.Value2;//value2 is object[1...3, 1...5]  
object[,] value22 = (object[,])range2.Value2;//value22與value2同  
1.3 單元格型別

Excel支援2種資料型別:Numbers和Strings(參考Data Types Used By Excel)。

1.3.1 空白單元格 
空白單元格返回null。

1.3.2 數字單元格 
數字單元格返回double型別。

bool isDouble = value[1, 3] is double;//isDouble = true

表示日期和時間的數字單元格仍然返回double,而不是DateTime。例如double值2000.0表示1905年6月22日。要將double轉換為DateTime,您需要呼叫DateTime.FromOADate靜態方法。

DateTime dt = DateTime.FromOADate((double)value[4, 1]);//(double)value[4, 1] = 1.0

string s = dt.ToString();//s = "1899-12-31 0:00:00"

1.3.3 文字單元格 
文字單元格返回string。

2. Range.Text屬性

MSDN:Returns or sets the text for the specified object. Read-only String.

2.1 返回型別

對於單個單元格來說,返回的始終是在Excel中顯示的文字常量。例如,數字單元格的值2000.0顯示為1905年6月22日,則Range.Text返回"1905年6月22日"。另外,對於空白單元格,返回空字串。

對於多個單元格來說,返回的始終是DBNull.Value。

3. Range.Value屬性(C#不支援)

4. 小結

使用Range.Value2屬性和Range.Text屬性均可以獲取Excel中的資料,但我們應該儘量避免Range.Text屬性。因為Range.Text無法讀取多個單元格的值,而且它不支援像Range.Value2那樣的“強型別”。