在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
// 连接字符串 复制代码 代码如下: // 连接字符串 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(); 很简单吧?!一切就像操作数据库一样,只是需要注意的是: 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: 2。数据源路径使用物理绝对路径(同Access) 3。如何引用表名? select * from [Sheet1$] select * from [Sheet1$A1:B10] select * from [MyNamedRange] 注意: 4。如何引用列名? string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + ref: 注意,Extended Properties 所需的双引号必须还要加双引号。 在这种情况下,所有的列名都是以F开头,然后跟索引,从F1开始,F2,F3。。。。。。。 5。为什么有效单元格数据不显示出来? “IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取 PS:在baidu这个问题的时候,有网友说,将每个单元都加上引号,这固然是格方案,但是工作量何其大啊,又不零活,庆幸自己找到”治本药方“ more ref: 应 在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”)
这里我们将Excel也当作一个“数据库”来对待,然后利用OleDbConnection.GetOleDbSchemaTable 方法 注 以下是读取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(); 这里我们就不需要对SELEC 语句进行“硬编码”,可以根据需要动态的构造FROM 字句的“表名”。 不仅可以,获取表明,还可以获取每张表内的字段名、字段类型等信息: tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, null, null }); 在ADO.nET SELECT * 而在ADO.NET 2.0中每个xxxConnenction都实现了基类System.Data.Common.DbConnection的 GetSchemal 方法 //--------------------------------------------------------------------------- 复制代码 代码如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { string strconn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"D:/last.xls" + ";Extended Properties=Excel 8.0;"; //HDR=no";//IMEX=1 OleDbConnection conn = new OleDbConnection(strconn); DataSet myset = new DataSet(); try { conn.Open(); string mysql = "select * from [Sheet1$] ";//where chs <> '' OleDbDataAdapter aper = new OleDbDataAdapter(mysql, conn); myset.Tables.Clear(); aper.Fill(myset, "book"); conn.Close(); GridView1.DataSource = myset.Tables["book"]; GridView1.DataBind(); } catch (Exception ex) { conn.Close(); this.lb_msg.Text = ex.Message; return; // return ex.Message; } } } |
请发表评论