知识大全 ado.net 如何读取 excel

Posted

篇首语:与天地兮比寿,与日月兮齐光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ado.net 如何读取 excel相关的知识,希望对你有一定的参考价值。

    经常需要在数据库与Execl之间互导数据 net时代 ADO NET可以使用使用Microsoft Jet OleDb访问访问Excel 网上已经有很多类似的资源 最典型也是最简单的可能如下 (环境)    // 连接字符串    string xlsPath = Server MapPath( ~/app_data/somefile xls ); // 绝对物理路径    string connStr = PRovider=Microsoft Jet OLEDB ; +    Extended Properties=Excel ; +    data source= + xlsPath;    // 查询语句    string sql = SELECT * FROM [Sheet $] ;    DataSet ds = new DataSet();    OleDbDataAdapter da = new OleDbDataAdapter(sql connStr);    da Fill(ds);    // 填充DataSet    // 在这里对DataSet中的数据进行操作    // 输出 绑定数据    GridView DataSource = ds Tables[ ];    GridView DataBind();    很简单吧?!一切就像操作数据库一样 只是需要注意的是     数据提供程序使用Jet 同时需要指定Extended Properties 关键字设置 Excel 特定的属性 不同版本的Excel对应不同的属性值 用于 Extended Properties 值的有效 Excel 版本     对于 Microsoft Excel ( ) ( ) 和 ( ) 工作簿 请使用 Excel     对于 Microsoft Excel 和 ( ) 工作簿 请使用 Excel     对于 Microsoft Excel 工作簿 请使用 Excel     对于 Microsoft Excel 工作簿 请使用 Excel     ref *url=/library/CHS/dv_vbcode//vbtskcodeexamplereadingexceldataintodataset asp    数据源路径使用物理绝对路径(同access)    如何引用表名?    对 Excel 工作簿中表(或范围)的有效引用     若要引用完全使用的工作表的范围 请指定后面跟有美元符号的工作表名称 例如     select * from [Sheet $]    若要引用工作表上的特定地址范围 请指定后面跟有美元符号和该范围的工作表名称 例如     select * from [Sheet $A :B ]    若要引用指定的范围 请使用该范围的名称 例如     select * from [MyNamedRange]    ref *url=/library/CHS/dv_vbcode//vbtskcodeexamplereadingexceldataintodataset asp    说明     可以引用Excel 工作簿中的三种对象     * 整张工作表 [Sheet $]  Sheet 就是工作表的名称    * 工作表上的命名单元格区域 [MyNamedRange] (不需要指定工作表 因为整个xls中命名区域只能唯一)    XLS命名方法 选中单元格范围》插入》名称》定义    * 工作表上的未命名单元格区域 [Sheet $A :B ]    (在关系数据库提供的各种对象中(表 视图 存储过程等) Excel 数据源仅提供相当于表的对象 它由指定工作簿中的工作表和定义的命名区域组成 命名区域被视为 表 而工作表被视为 系统表 )    注意     *必须使用[](方括号) 否将报     FROM 子句语法错误    *必须跟$(美元符号) 否则报     Microsoft Jet 数据库引擎找不到对象 Sheet 请确定对象是否存在 并正确地写出它的名称和路径     *如果工作表名称不对 或者不存在 将报     Sheet $ 不是一个有效名称 请确认它不包含无效的字符或标点 且名称不太长     *在 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据   中提到可以使用    ~  和 (波浪线和单引号)代替[] 使用ADO NET测试没有成功 报     FROM 子句语法错误    *当引用工作表明名([Sheet $])时 数据提供程序认为数据表从指定工作表上最左上方的非空单元格开始 比如 工作表从第 行 C 列开始 第 行 C列之前以及第 行全为空 则只会显示从第 行 C列开始的数据 以最后表最大范围内的非空单元结束     *因此 如需要精确读取范围 应该使用命名区域 [NamedRange] 或者指定地址 [Sheet $A :C ]     如何引用列名?    *根据默认连接字符串中 数据提供程序会将有效区域内的第一行作为列名 如果此行某单元格为空则用F F 表示 其中序数 跟单元格的位置一致 从 开始     *如果希望第一行作为数据显示 而非列名 可以在连接串的 Extended Properties 属性指定 HDR=NO    默认值为 HDR=NO 格式如下     string connStr = Provider=Microsoft Jet OLEDB ; +    Extended Properties=\\ Excel ;HDR=NO\\ ; +    data source= + xlsPath;    注意 Excel ;HDR=NO  需要使用双引号(这里的反斜扛 是C#中的转义)    ref ms help://MS VSCC v /MS MSDN v /MS VisualStudio v chs/WD_ADONET// c f f b 中 《连接Excel》节(说明 在我自己的MSDN中 它的例子使用了两个双引号是错的 测试没有通过 原文这样说的     注意 Extended Properties 所需的双引号必须还要加双引号     )    在这种情况下 所有的列名都是以F开头 然后跟索引 从F 开始 F F     为什么有效单元格数据不显示出来?    出现这种情况的可能原因是 默认连接中 数据提供程序根据前面单元格推断后续单元个的数据类型     可以通过 Extended Properties 中指定 IMEX=     IMEX= ; 通知驱动程序始终将 互混 数据列作为文本读取    ref 同     PS 在baidu这个问题的时候 有网友说 将每个单元都加上引号 这固然是格方案 但是工作量何其大啊 又不零活 庆幸自己找到 治本药方     more ref     如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据    /ShowDetail aspx*id=C E CD F E CE D B A     应用程序经常需要与Excel进行数据交互 以上阐述了基于ADO NET 读取Excel的基本方法与技巧 现在要介绍是如何动态的读取Excel数据 这里的动态指的是事先不知道Excel文件的是什么样的结构 或者无法预测 比如一张 xls文件有多少张sheet 而且每张sheet的结构可能都不一样等等     其实我们可以通过获取Excel的 架构信息 来动态的构造查询语句 这里的 架构信息 与数据库领域的 数据库架构信息 意义相同(也称 元数据 ) 对于整个数据库 这些 元数据 通常包括数据库或可通过数据库中的数据源 表和视图得到的目录以及所存在的约束等 而对于数据库中的表 架构信息包括主键 列和自动编号字段等     在上文中提到    在关系数据库提供的各种对象中(表 视图 存储过程等) Excel 数据源仅提供相当于表的对象 它由指定工作簿中的工作表和定义的命名区域组成 命名区域被视为 表 而工作表被视为 系统表 )    这里我们将Excel也当作一个 数据库 来对待 然后利用OleDbConnection GetOleDbSchemaTable 方法    要获取所需的架构信息 该方法获取的架构信息与ANSI SQl 是兼容的     注意 对于那些不熟悉 OLE DB 架构行集的人而言 它们基本上是由 ANSI SQL 定义的数据库构造的标准化架构 每个架构行集具有为指定构造提供定义元数据的一组列(称作 NET 文档中的 限制列 ) 这样 如果请求架构信息(例如 列的架构信息或排序规则的架构信息) 则您会明确知道可以得到哪种类型的数据 如果希望了解更多信息 请访问 Appendix B:Schema Rowsets     ref x*mfr=true    以下是读取Excel文件内 表 定义元数据 并显示出来的的程序片断     // 读取Excel数据 填充DataSet    // 连接字符串    string xlsPath = Server MapPath( ~/app_data/somefile xls );    string connStr = Provider=Microsoft Jet OLEDB ; +    Extended Properties=\\ Excel ;HDR=No;IMEX= \\ ; + // 指定扩展属性为 Microsoft Excel ( ) ( ) ( ) 并且第一行作为数据返回 且以文本方式读取    data source= + xlsPath;    string sql_F = SELECT * FROM [ ] ;    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 );    GridView DataSource = tblSchema;    GridView DataBind();    // 关闭连接    conn Close();    GetOleDbSchemaTable 方法的详细说明可以参考     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 ; +    Extended Properties=\\ Excel ;HDR=No;IMEX= \\ ; + // 指定扩展属性为 Microsoft Excel ( ) ( ) ( ) 并且第一行作为数据返回 且以文本方式读取    data source= + xlsPath;    string sql_F = SELECT * FROM [ ] ;    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 );    //GridView DataSource = tblSchema;    //GridView 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进行处理    // 这里仅做显示    GridView DataSource = ds Tables[ ];    GridView DataBind();    GridView DataSource = ds Tables[ ];    GridView DataBind();    // more codes    //     这里我们就不需要对SELEC 语句进行 硬编码 可以根据需要动态的构造FROM 字句的 表名     不仅可以 获取表明 还可以获取每张表内的字段名 字段类型等信息     tblSchema = conn GetOleDbSchemaTable(OleDbSchemaGuid Columns new object[] null null null null );    在ADO nET x 时候只有OleDb提供了GetOleDbSchemaTable 方法 而SqlClient或者OrcaleClient没有对应的方法 因为对应数据库已经提供了类似功能的存储过程或者系统表供应用程序访问 比如对于Sql Server     SELECT *    FROM Northwind INFORMATION_SCHEMA COLUMNS    WHERE TABLE_NAME = N Customers     而在ADO NET 中每个xxxConnenction都实现了基类System Data Common DbConnection的 GetSchemal 方法    来获取数据源的架构信息 cha138/Article/program/net/201311/13390

相关参考

知识大全 C#怎样用excel.dll读取excel文件

C#怎样用excel.dll读取excel文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   

知识大全 C#Win窗体读取Excel存入SQL数据库

C#Win窗体读取Excel存入SQL数据库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Wi

知识大全 ADO.NET和ADO的比较

ADO.NET和ADO的比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 处理ADO与ADO.NET对比介绍

处理ADO与ADO.NET对比介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ADONET统

知识大全 在 ADO 和 ADO.NET 中管理离线数据

在ADO和ADO.NET中管理离线数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  您可以使用

知识大全 ADO.Net与ADO在数据内存中的差异讨论

ADO.Net与ADO在数据内存中的差异讨论  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据

知识大全 Asp.Net中创建和使用Ado.net

Asp.Net中创建和使用Ado.net  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 ADO.NET中的.NET数据提供者

ADO.NET中的.NET数据提供者  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ADONET

知识大全 ASP.NET项目开发指南:ADO.NET概述

ASP.NET项目开发指南:ADO.NET概述  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &

知识大全 ASP.NET项目开发指南:ADO.NET结构

ASP.NET项目开发指南:ADO.NET结构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &