经常需要在数据库与Execl之间互导数据。net时代,ADO.NET可以使用使用Microsoft.Jet.OleDb访问访问Excel,网上已经有很多类似的资源,最典型也是最简单的可能如下:(asp.net环境)

ADO.NET 如何读取 Excel // 连接字符串            
ADO.NET 如何读取 Excel        string xlsPath 
= Server.MapPath("~/app_data/somefile.xls"); // 绝对物理路径
ADO.NET 如何读取 Excel
        string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
ADO.NET 如何读取 Excel                        
"Extended Properties=Excel 8.0;" + 
ADO.NET 如何读取 Excel                        
"data source=" + xlsPath;
ADO.NET 如何读取 Excel
        // 查询语句
ADO.NET 如何读取 Excel        string sql 
= "SELECT * FROM [Sheet1$]";
ADO.NET 如何读取 Excel

ADO.NET 如何读取 Excel        DataSet ds 
= new DataSet();
ADO.NET 如何读取 Excel
        OleDbDataAdapter da = new OleDbDataAdapter(sql, connStr);
ADO.NET 如何读取 Excel
        da.Fill(ds);    // 填充DataSet        
ADO.NET 如何读取 Excel
        
ADO.NET 如何读取 Excel        // 在这里对DataSet中的数据进行操作        
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel        // 输出,绑定数据
ADO.NET 如何读取 Excel        GridView1.DataSource 
= ds.Tables[0]; 
ADO.NET 如何读取 Excel
        GridView1.DataBind();

很简单吧?!ADO.NET 如何读取 Excel一切就像操作数据库一样,只是需要注意的是:
1。数据提供程序使用Jet,同时需要指定Extended Properties 关键字设置 Excel 特定的属性,不同版本的Excel对应不同的属性值:
ADO.NET 如何读取 Excel用于 Extended Properties 值的有效 Excel 版本。 
ADO.NET 如何读取 Excel对于 Microsoft Excel 
8.0 (97)、9.0 (2000) 和 10.0 (2002) 工作簿,请使用 Excel 8.0。 
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel对于 Microsoft Excel 
5.0 和 7.0 (95) 工作簿,请使用 Excel 5.0。 
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel对于 Microsoft Excel 
4.0 工作簿,请使用 Excel 4.0。 
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel对于 Microsoft Excel 
3.0 工作簿,请使用 Excel 3.0。 
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel
ref:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp

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

3。如何引用表名?
ADO.NET 如何读取 Excel对 Excel 工作簿中表(或范围)的有效引用。 
ADO.NET 如何读取 Excel若要引用完全使用的工作表的范围,请指定后面跟有美元符号的工作表名称。例如: 
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excelselect * from 
[Sheet1$]
ADO.NET 如何读取 Excel若要引用工作表上的特定地址范围,请指定后面跟有美元符号和该范围的工作表名称。例如: 
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excelselect * from 
[Sheet1$A1:B10]
ADO.NET 如何读取 Excel若要引用指定的范围,请使用该范围的名称。例如: 
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excelselect * 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应该为 HDR=YES,即默认将第一行作为列名,竟然一直没有发现这个错误,汗ADO.NET 如何读取 Excelupadted 2007年8月18日)格式如下:

ADO.NET 如何读取 Excel        string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
ADO.NET 如何读取 Excel                        
"Extended Properties=\"Excel 8.0;HDR=NO\";" + 
ADO.NET 如何读取 Excel                        
"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中,它的例子使用了两个双引号是错的,测试没有通过,原文这样说的:ADO.NET 如何读取 Excel

ADO.NET 如何读取 Excel注意,Extended Properties 所需的双引号必须还要加双引号。



在这种情况下,所有的列名都是以F开头,然后跟索引,从F1开始,F2,F3。。。。。。。

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

ADO.NET 如何读取 Excel“IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取

ref:同4

PS:在baidu这个问题的时候,有网友说,将每个单元都加上引号,这固然是格方案,但是工作量何其大啊,又不零活,庆幸自己找到”治本药方“ADO.NET 如何读取 Excel
 
more ref:
如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据
http://dotnet.aspx.cc/ShowDetail.aspx?id=C673E2CD-3F1E-4919-8CE0-D69B894A0599

 

ADO.NET 如何读取 Excel在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”)


 

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

 

ADO.NET 如何读取 Excel注意:对于那些不熟悉 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文件内“表”定义元数据,并显示出来的的程序片断:

ADO.NET 如何读取 Excel        // 读取Excel数据,填充DataSet
ADO.NET 如何读取 Excel        
// 连接字符串            
ADO.NET 如何读取 Excel
        string xlsPath = Server.MapPath("~/app_data/somefile.xls");
ADO.NET 如何读取 Excel        
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
ADO.NET 如何读取 Excel                        
"Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\";" + // 指定扩展属性为 Microsoft Excel 8.0 (97) 9.0 (2000) 10.0 (2002),并且第一行作为数据返回,且以文本方式读取
ADO.NET 如何读取 Excel
                        "data source=" + xlsPath;
ADO.NET 如何读取 Excel        
string sql_F = "SELECT * FROM [{0}]";
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel        OleDbConnection conn 
= null;
ADO.NET 如何读取 Excel        OleDbDataAdapter da 
= null;
ADO.NET 如何读取 Excel        DataTable tblSchema 
= null;
ADO.NET 如何读取 Excel        IList
<string> tblNames = null;
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel        
// 初始化连接,并打开
ADO.NET 如何读取 Excel
        conn = new OleDbConnection(connStr);
ADO.NET 如何读取 Excel        conn.Open();
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel        
// 获取数据源的表定义元数据                        
ADO.NET 如何读取 Excel        
//tblSchema = conn.GetSchema("Tables");
        conn.Close();

GetOleDbSchemaTable 方法的详细说明可以参考:
http://msdn2.microsoft.com/zh-CN/library/system.data.oledb.oledbconnection.getoledbschematable.aspx

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

ADO.NET 如何读取 Excel        // 读取Excel数据,填充DataSet
ADO.NET 如何读取 Excel        
// 连接字符串            
ADO.NET 如何读取 Excel
        string xlsPath = Server.MapPath("~/app_data/somefile.xls");
ADO.NET 如何读取 Excel        
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
ADO.NET 如何读取 Excel                        
"Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\";" + // 指定扩展属性为 Microsoft Excel 8.0 (97) 9.0 (2000) 10.0 (2002),并且第一行作为数据返回,且以文本方式读取
ADO.NET 如何读取 Excel
                        "data source=" + xlsPath;
ADO.NET 如何读取 Excel        
string sql_F = "SELECT * FROM [{0}]";
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel        OleDbConnection conn 
= null;
ADO.NET 如何读取 Excel        OleDbDataAdapter da 
= null;
ADO.NET 如何读取 Excel        DataTable tblSchema 
= null;
ADO.NET 如何读取 Excel        IList
<string> tblNames = null;
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel        
// 初始化连接,并打开
ADO.NET 如何读取 Excel
        conn = new OleDbConnection(connStr);
ADO.NET 如何读取 Excel        conn.Open();
ADO.NET 如何读取 Excel
ADO.NET 如何读取 Excel        
// 获取数据源的表定义元数据                        
ADO.NET 如何读取 Excel        
//tblSchema = conn.GetSchema("Tables");

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

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

);


在ADO.nET 1.x 时候只有OleDb提供了GetOleDbSchemaTable 方法,而SqlClient或者OrcaleClient没有对应的方法,因为对应数据库已经提供了类似功能的存储过程或者系统表供应用程序访问,比如对于Sql Server:

ADO.NET 如何读取 ExcelSELECT *
ADO.NET 如何读取 Excel
FROM Northwind.INFORMATION_SCHEMA.COLUMNS
ADO.NET 如何读取 Excel
WHERE TABLE_NAME = N'Customers'
ADO.NET 如何读取 Excel


而在ADO.NET 2.0中每个xxxConnenction都实现了基类System.Data.Common.DbConnection的 GetSchemal 方法
来获取数据源的架构信息。
http://msdn2.microsoft.com/zh-cn/library/system.data.common.dbconnection.getschema.aspx

refs:
从 .NET 应用程序访问 Microsoft Office 数据
HOW TO:使用 GetOleDbSchemaTable 和 Visual C# .NET 检索架构信息
从数据库中获取架构信息

相关文章:

  • 2022-12-23
  • 2021-09-15
  • 2022-03-06
  • 2021-09-09
  • 2022-12-23
  • 2021-10-17
猜你喜欢
  • 2022-01-04
  • 2021-09-06
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案