ado.net如何读取excel(2)

上一篇 / 下一篇  2009-11-29 17:39:21

这里我们将excel也当作一个“数据库”来对待,然后利用oledbconnection.getoledbschematable 方法 
要获取所需的架构信息,该方法获取的架构信息与ansi sql-92是兼容的: 

注意:对于那些不熟悉 ole db 架构行集的人而言,它们基本上是由 ansi sql-92 定义的数据库构造的标准化架构。每个架构行集具有为指定构造提供定义元数据的一组列(称作 .net 文档中的“限制列”)。这样,如果请求架构信息(例如,列的架构信息或排序规则的架构信息),则您会明确知道可以得到哪种类型的数据。如果希望了解更多信息,请访问 appendix b:schema rowsets。 
ref:http://www.microsoft.com/china/msdn/library/Office/office/odatanet2.mspx?mfr=true 

以下是读取excel文件内“表”定义元数据,并显示出来的的程序片断:  

        // 读取excel数据,填充dataset 
        // 连接字符串             
        string xlspath = server.mappath("~/app_data/somefile.xls"); 
        string connstr = "provider=microsoft.jet.oledb.4.0;" + 
                        "extended properties=\"excel 8.0;hdr=no;imex=1\";" + // 指定扩展属性为 microsoft excel 8.0 (97) 9.0 (2000) 10.0 (2002),并且第一行作为数据返回,且以文本方式读取 
                        "data source=" + xlspath; 
        string sql_f = "select * from [{0}]"; 

        oledbconnection conn = null; 
        oledbdataadapter da = null; 
        datatable tblschema = null; 
        ilist<string> tblnames = null; 

        // 初始化连接,并打开 
        conn = new oledbconnection(connstr); 
        conn.open(); 

        // 获取数据源的表定义元数据                         
        //tblschema = conn.getschema("tables"); 
        tblschema = conn.getoledbschematable(oledbschemaguid.tables, new object[] { null, null, null, "table" }); 

        gridview1.datasource = tblschema; 
        gridview1.databind(); 

        // 关闭连接 
        conn.close(); 
getoledbschematable 方法的详细说明可以参考: 
http://msdn2.microsoft.com/zh-cn/library/system.data.oledb.oledbconnection.getoledbschematable.aspx 

接着是一段利用“架构信息”动态读取excel内部定义的表单或者命名区域的程序片断: 


        // 读取excel数据,填充dataset 
        // 连接字符串             
        string xlspath = server.mappath("~/app_data/somefile.xls"); 
        string connstr = "provider=microsoft.jet.oledb.4.0;" + 
                        "extended properties=\"excel 8.0;hdr=no;imex=1\";" + // 指定扩展属性为 microsoft excel 8.0 (97) 9.0 (2000) 10.0 (2002),并且第一行作为数据返回,且以文本方式读取 
                        "data source=" + xlspath; 
        string sql_f = "select * from [{0}]"; 

        oledbconnection conn = null; 
        oledbdataadapter da = null; 
        datatable tblschema = null; 
        ilist<string> tblnames = null; 

        // 初始化连接,并打开 
        conn = new oledbconnection(connstr); 
        conn.open(); 

        // 获取数据源的表定义元数据                         
        //tblschema = conn.getschema("tables"); 
        tblschema = conn.getoledbschematable(oledbschemaguid.tables, new object[] { null, null, null, "table" }); 

        //gridview1.datasource = tblschema; 
        //gridview1.databind(); 

        // 关闭连接 
        //conn.close(); 

        tblnames = new list<string>(); 
        foreach (datarow row in tblschema.rows) { 
            tblnames.add((string)row["table_name"]); // 读取表名 
        } 

        // 初始化适配器 
        da = new oledbdataadapter(); 
        // 准备数据,导入dataset 
        dataset ds = new dataset(); 

        foreach (string tblname in tblnames) { 
            da.selectcommand = new oledbcommand(string.format(sql_f, tblname), conn); 
            try { 
                da.fill(ds, tblname); 
            } 
            catch { 
                // 关闭连接 
                if (conn.state == connectionstate.open) { 
                    conn.close(); 
                } 
                throw; 
            } 
        } 

        // 关闭连接 
        if (conn.state == connectionstate.open) { 
            conn.close(); 
        } 

        // 对导入dataset的每张sheet进行处理         
        // 这里仅做显示 
        gridview1.datasource = ds.tables[0]; 
        gridview1.databind(); 

        gridview2.datasource = ds.tables[1]; 
        gridview2.databind(); 

        // more codes 
        // . 

这里我们就不需要对selec 语句进行“硬编码”,可以根据需要动态的构造from 字句的“表名”。 

不仅可以,获取表明,还可以获取每张表内的字段名、字段类型等信息: 


tblschema = conn.getoledbschematable(oledbschemaguid.columns, new object[] { null, null, null, null }); 

在ado.net 1.x 时候只有oledb提供了getoledbschematable 方法,而sqlclient或者orcaleclient没有对应的方法,因为对应数据库已经提供了类似功能的存储过程或者系统表供应用程序访问,比如对于sql server:  

select * 
from northwind.information_schema.columns 
where table_name = n’customers’ 


而在ado.net 2.0中每个xxxconnenction都实现了基类system.data.common.dbconnection的 getschemal 方法 
来获取数据源的架构信息。 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jackyxu_2008/archive/2009/04/24/4107013.aspx


TAG:

 

评分:0

我来说两句

日历

« 2024-04-27  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 18958
  • 日志数: 22
  • 文件数: 1
  • 建立时间: 2009-02-20
  • 更新时间: 2012-03-14

RSS订阅

Open Toolbar