ado.net如何读取Excel

// 连接字符串             
        string xlspath = server.mappath("~/app_data/somefile.xls"); // 绝对物理路径 
        string connstr = "provider=microsoft.jet.oledb.4.0;" + 
                        "extended properties=excel 8.0;" +  
                        "data source=" + xlspath; 
        // 查询语句 
        string sql = "select * from [sheet1$]"; 

        dataset ds = new dataset(); 
        oledbdataadapter da = new oledbdataadapter(sql, connstr); 
        da.fill(ds);    // 填充dataset         
         
        // 在这里对dataset中的数据进行操作         

        // 输出,绑定数据 
        gridview1.datasource = ds.tables[0];  
        gridview1.databind(); 

        //附带段可以获取excel表明的代码

mycnn.Open();

DataSet myds=new DataSet();
DataTable mytable=new DataTable();


//所有表的名称
mytable=mycnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"TABLE"});
myds.Tables.Add(mytable);

 

1。数据提供程序 使用jet,同时需要指定extended properties 关键字设置 excel 特定的属性,不同版本的excel对应不同的属性值:用于 extended properties 值的有效 excel 版本。  
对于 microsoft excel 8.0 (97)、9.0 (2000) 和 10.0 (2002) 工作簿,请使用 excel 8.0。  

对于 microsoft excel 5.0 和 7.0 (95) 工作簿,请使用 excel 5.0。  

对于 microsoft excel 4.0 工作簿,请使用 excel 4.0。  

对于 microsoft excel 3.0 工作簿,请使用 excel 3.0。  

ref:http://msdn.microsoft.com/library/chs/default.asp?url=/library/chs/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp  

 

2。数据源路径使用物理绝对路径(同access) 

 

3。如何引用表名? 

对 excel 工作簿中表(或范围)的有效引用。  
若要引用完全使用的工作表的范围,请指定后面跟有美元符号的工作表名称。例如:  

select * from [sheet1$] 
若要引用工作表上的特定地址范围,请指定后面跟有美元符号和该范围的工作表名称。例如:  

select * from [sheet1$a1:b10] 
若要引用指定的范围,请使用该范围的名称。例如:  

select * from [mynamedrange] 
ref:http://msdn.microsoft.com/library/chs/default.asp?url=/library/chs/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp  
说明: 
可以引用excel 工作簿中的三种对象: 
• 整张工作表:[sheet1$]  ,sheet1 就是工作表的名称 
• 工作表上的命名单元格区域:[mynamedrange] (不需要指定工作表,因为整个xls中命名区域只能唯一) 
xls命名方法:选中单元格范围》插入》名称》定义 
• 工作表上的未命名单元格区域 :[sheet1$a1:b10] 
(在关系数据库提供的各种对象中(表、视图、存储过程等),excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”) 

注意: 
•必须使用[](方括号),否将报: 
from 子句语法错误 
•必须跟$(美元符号),否则报: 
microsoft jet 数据库引擎找不到对象’sheet2’。请确定对象是否存在,并正确地写出它的名称和路径。 
•如果工作表名称不对,或者不存在,将报: 
’sheet2$’ 不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长。 
•在 如何在 visual basic 或 vba 中使用 ado 来处理 excel 数据   中提到可以使用 
~  和 ’(波浪线和单引号)代替[],使用ado。net测试没有成功,报: 
from 子句语法错误 
•当引用工作表明名([sheet1$])时,数据提供程序 认为数据表从指定工作表上最左上方的非空单元格开始。比如,工作表从第 3 行,c 列开始,第3行,c列之前以及第1、2行全为空,则只会显示从第3行,c列开始的数据;以最后表最大范围内的非空单元结束; 
•因此,如需要精确读取范围,应该使用命名区域 [namedrange],或者指定地址:[sheet1$a1:c10] 

 

4。如何引用列名? 
•根据默认连接字符串中,数据提供程序 会将有效区域内的第一行作为列名,如果此行某单元格为空则用f1、f2表示,其中序数,跟单元格的位置一致,从1开始; 
•如果希望第一行作为数据显示,而非列名,可以在连接串的 extended properties 属性指定:hdr=no 
默认值为:hdr=no 格式如下: 

        string connstr = "provider=microsoft.jet.oledb.4.0;" + 
                        "extended properties=/"excel 8.0;hdr=no/";" +  
                        "data source=" + xlspath; 
注意: excel 8.0;hdr=no  需要使用双引号(这里的反斜扛,是C#中的转义) 

ref:ms-help://ms.vscc.v80/ms.msdn.v80/ms.visualstudio.v80.chs /wd_adonet/html/745c5f95-2f02-4674-b378-6d51a7ec2490.htm 中 《连接excel》节(说明:在我自己的msdn中,它的例子使用了两个双引号是错的,测试没有通过,原文这样说的: 

注意,extended properties 所需的双引号必须还要加双引号。 
) 

在这种情况下,所有的列名都是以f开头,然后跟索引,从f1开始,f2,f3。。。。。。。 

 

5。为什么有效单元格数据不显示出来? 
出现这种情况的可能原因是,默认连接中,数据提供程序 根据前面单元格推断后续单元个的数据类型。 
可以通过 extended properties 中指定 imex=1  

“imex=1;”通知驱动程序 始终将“互混”数据列作为文本读取 
ref:同4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值