详解Excel互操作中读取数据的方法
2010-01-27 16:37
387 查看
介绍使用C#和主互操作程序集从Excel读取数据的几个方法,并且指出使用这些方法时的一些细节问题。主互操作程序集使用Microsoft.Office.Interop.Excel,版本12.0.0.0。
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那样的“强类型”。
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那样的“强类型”。
相关文章推荐
- 详解Excel互操作中处理数据的几个方法(上:读取数据)
- 详解Excel互操作中写入数据的方法
- Excel互操作中读取数据的方法(Range.Value2属性)
- 自己封装的Java excel数据读取方法
- POI实战-java开发excel详解(第二章 单元格各类型数据读取)
- Python导出数据到Excel可读取的CSV文件的方法
- 利用QTP调用外部VBS方法读取指定Excel数据的方法
- 用C#编程从数据库中读取图片数据导进Excel文件的方法
- POI实战-java开发excel详解(第四章 常用操作-单元格合并与数据读取)
- VC6.0实现读取Excel数据的方法
- Java+Poi 读取Excel做数据导入时获取cell值的方法
- c# 读取excel数据的两种方法
- OLEDB方式读取Excel丢失数据的原因和解决方法
- SQL Server中从Excel中读取数据的方法
- ThinkPHP框架下读取excel数据的方法示例
- POI实战-java开发excel详解之常用操作-单元格合并与数据读取
- POI实战-java开发excel详解之单元格各类型数据读取
- PHP-Excel读取导入Excel数据到数据库(2003,2007通用)使用方法
- 用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
- node.js读取Excel数据(下载图片)的方法示例