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那樣的“強型別”。