czb

导航

作程序集从Excel

Posted on 2010-01-26 16:53  czb  阅读(246)  评论(0)    收藏  举报

介绍使用C#和主互操作程序集从Excel读取数据的几个方法,并且指出使用这些方法的一些细节问题。主互操作程序集使用Microsoft.Office.Interop.Excel,版本12.0.0.0。

Range.Value2属性

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

实际上Range.Value2属性并没有看上去那么简单。以下是几个需要注意的地方:

返回值


返回值将返回Range.Value2属性的副本,而非内部对象的引用。object[,] value = (object[,])range.Value2;  

object v11 = value[11];//v11 = "aaa"   
v11 = 10;//v11 = 10   
object v11new = ((object[,])range.Value2).GetValue(11);//v11new = "aaa"  
object[,] value = (object[,])range.Value2;
object v11 = value[11];//v11 = "aaa"
v11 = 10;//v11 = 10
object v11new = ((object[,])range.Value2).GetValue(11);//v11new = "aaa" 

 

范围类型


对于单个单元格来说,返回的是单元格类型。例如,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同  
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同 

 

单元格类型


Excel支持2种数据类型:Numbers和Strings(参考Data Types Used By Excel)。

  • 空白单元格
    空白单元格返回null。
  • 数字单元格
    数字单元格返回double类型。
  • bool isDouble = value[13is double;//isDouble = true  
    bool isDouble = value[13is double;//isDouble = true 

     

    表示日期和时间的数字单元格仍然返回double,而不是DateTime。例如double值2000.0表示1905年6月22日。要将double转换为DateTime,您需要调用DateTime.FromOADate静态方法。

 

DateTime dt = DateTime.FromOADate((double)value[41]);//(double)value[4, 1] = 1.0   
string s = dt.ToString();//s = "1899-12-31 0:00:00"  
DateTime dt = DateTime.FromOADate((double)value[41]);//(double)value[4, 1] = 1.0
string s = dt.ToString();//s = "1899-12-31 0:00:00" 

 

文本单元格
文本单元格返回string。

Range.Text属性

 

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

返回类型


对于单个单元格来说,返回的始终是在Excel中显示的文本常量。例如,数字单元格的值2000.0显示为1905年6月22日,则Range.Text返回"1905年6月22日"。另外,对于空白单元格,返回空字符串。

对于多个单元格来说,返回的始终是DBNull.Value。

Range.Value属性(C#不支持)

--------------------------------------------------------------------------------

小结

--------------------------------------------------------------------------------

使用Range.Value2属性和Range.Text属性均可以获取Excel中的数据,但我们应该尽量避免Range.Text属性。因为Range.Text无法读取多个单元格的值,而且它不支持像Range.Value2那样的“强类型”。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Susiria/archive/2009/10/19/4699045.aspx