全面概括ADO.NET Excel數(shù)據(jù)讀取文件
我們用ADO.NET操作數(shù)據(jù)庫(kù),我們就會(huì)更Excel打交道,這是避免不了的。現(xiàn)在要介紹是如何動(dòng)態(tài)的讀取ADO.NET Excel數(shù)據(jù),這里的動(dòng)態(tài)指的是事先不知道Excel文件的是什么樣的結(jié)構(gòu),或者無(wú)法預(yù)測(cè),比如一張.xls文件有多少?gòu)坰heet,而且每張sheet的結(jié)構(gòu)可能都不一樣等等。其實(shí)我們可以通過(guò)獲取Excel的“架構(gòu)信息”來(lái)動(dòng)態(tài)的構(gòu)造查詢語(yǔ)句。這里的“架構(gòu)信息”與數(shù)據(jù)庫(kù)領(lǐng)域的“數(shù)據(jù)庫(kù)架構(gòu)信息”意義相同(也稱(chēng)“元數(shù)據(jù)”),對(duì)于整個(gè)數(shù)據(jù)庫(kù),這些“元數(shù)據(jù)”通常包括數(shù)據(jù)庫(kù)或可通過(guò)數(shù)據(jù)庫(kù)中的數(shù)據(jù)源、表和視圖得到的目錄以及所存在的約束等;而對(duì)于數(shù)據(jù)庫(kù)中的表,架構(gòu)信息包括主鍵、列和自動(dòng)編號(hào)字段等。
#T#在關(guān)系數(shù)據(jù)庫(kù)提供的各種對(duì)象中(表、視圖、存儲(chǔ)過(guò)程等),ADO.NET Excel數(shù)據(jù)源僅提供相當(dāng)于表的對(duì)象,它由指定工作簿中的工作表和定義的命名區(qū)域組成。命名區(qū)域被視為“表”,而工作表被視為“系統(tǒng)表”)這里我們將Excel也當(dāng)作一個(gè)“數(shù)據(jù)庫(kù)”來(lái)對(duì)待,然后利用OleDbConnection.GetOleDbSchemaTable 方法。注意:對(duì)于那些不熟悉 OLE DB 架構(gòu)行集的人而言,它們基本上是由 ANSI SQL-92 定義的數(shù)據(jù)庫(kù)構(gòu)造的標(biāo)準(zhǔn)化架構(gòu)。每個(gè)架構(gòu)行集具有為指定構(gòu)造提供定義元數(shù)據(jù)的一組列(稱(chēng)作 .NET 文檔中的“限制列”)。這樣,如果請(qǐng)求架構(gòu)信息(例如,列的架構(gòu)信息或排序規(guī)則的架構(gòu)信息),則您會(huì)明確知道可以得到哪種類(lèi)型的數(shù)據(jù)。
以下是讀取ADO.NET Excel數(shù)據(jù)文件內(nèi)“表”定義元數(shù)據(jù),并顯示出來(lái)的的程序片斷:
- // 讀取Excel數(shù)據(jù),填充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\";" +
// 指定擴(kuò)展屬性為 Microsoft Excel 8.0 (97) 9.0 (2000) 10.0 (2002),并且***行作為數(shù)據(jù)返回,且以文本方式讀取- "data source=" + xlsPath;
- string sql_F = "SELECT * FROM [{0}]";
- OleDbConnection conn = null;
- OleDbDataAdapter da = null;
- DataTable tblSchema = null;
- IList<string> tblNames = null;
- // 初始化連接,并打開(kāi)
- conn = new OleDbConnection(connStr);
- conn.Open();
- // 獲取數(shù)據(jù)源的表定義元數(shù)據(jù)
- //tblSchema = conn.GetSchema("Tables");
- tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
- GridView1.DataSource = tblSchema;
- GridView1.DataBind();
- // 關(guān)閉連接
- conn.Close();