Ado.Net讀取Excel常見問題總結(jié)_第1頁
Ado.Net讀取Excel常見問題總結(jié)_第2頁
Ado.Net讀取Excel常見問題總結(jié)_第3頁
Ado.Net讀取Excel常見問題總結(jié)_第4頁
Ado.Net讀取Excel常見問題總結(jié)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、ado.net讀取excel常見問題總結(jié) 經(jīng)常需要在數(shù)據(jù)庫與execl之間互導數(shù)據(jù)。net時代,ado.net可以使用使用microsoft.jet.oledb訪問訪問excel,網(wǎng)上已經(jīng)有很多類似的資源,最典型也是最簡單的可能如下:(環(huán)境) / 連接字符串 string xlspath = server.mappath(/app_data/somefile.xls); / 絕對物理路徑 string connstr = provider=microsoft.jet.oledb.4.0; + extended properties=excel 8.0; + data source

2、= + xlspath; / 查詢語句 string sql = select * from sheet1$; dataset ds = new dataset(); oledbdataadapter da = new oledbdataadapter(sql, connstr); da.fill(ds); / 填充dataset / 在這里對dataset中的數(shù)據(jù)進行操作 / 輸出,綁定數(shù)據(jù) gridview1.datasource = ds.tables0; gridview1.databind(); 很簡單吧?!一切就像操作數(shù)據(jù)庫一樣,只是需要注意的是: 1。數(shù)據(jù)提供程序使用jet,同時

3、需要指定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 工作簿,請使用 ex

4、cel 3.0。 ref:/librar . dataintodataset.asp 2。數(shù)據(jù)源路徑使用物理絕對路徑(同access) 3。如何引用表名? 對 excel 工作簿中表(或范圍)的有效引用。 若要引用完全使用的工作表的范圍,請指定后面跟有美元符號的工作表名稱。例如: select * from sheet1$ 若要引用工作表上的特定地址范圍,請指定后面跟有美元符號和該范圍的工作表名稱。例如: select * from sheet1$a1:b10 若要引用指定的范圍,請使用該范圍的名稱。例如: select * from mynam

5、edrange ref:/librar . dataintodataset.asp 說明: 可以引用excel 工作簿中的三種對象: 整張工作表:sheet1$ ,sheet1 就是工作表的名稱 工作表上的命名單元格區(qū)域:mynamedrange (不需要指定工作表,因為整個xls中命名區(qū)域只能唯一) xls命名方法:選中單元格范圍插入名稱定義 工作表上的未命名單元格區(qū)域 :sheet1$a1:b10 (在關系數(shù)據(jù)庫提供的各種對象中(表、視圖、存儲過程等),excel 數(shù)據(jù)源僅提供相當于表的對象,它由指定工作簿中的工作表和定義的命名區(qū)域組成。命名

6、區(qū)域被視為“表”,而工作表被視為“系統(tǒng)表”) 注意: 必須使用(方括號),否將報: from 子句語法錯誤 必須跟$(美元符號),否則報: microsoft jet 數(shù)據(jù)庫引擎找不到對象sheet2。請確定對象是否存在,并正確地寫出它的名稱和路徑。 如果工作表名稱不對,或者不存在,將報: sheet2$ 不是一個有效名稱。請確認它不包含無效的字符或標點,且名稱不太長。 在 如何在 visual basic 或 vba 中使用 ado 來處理 excel 數(shù)據(jù) 中提到可以使用 和 (波浪線和單引號)代替,使用ado。net測試沒有成功,報: from 子句語法錯誤 當引用工作表明名(sheet

7、1$)時,數(shù)據(jù)提供程序認為數(shù)據(jù)表從指定工作表上最左上方的非空單元格開始。比如,工作表從第 3 行,c 列開始,第3行,c列之前以及第1、2行全為空,則只會顯示從第3行,c列開始的數(shù)據(jù);以最后表最大范圍內(nèi)的非空單元結(jié)束; 因此,如需要精確讀取范圍,應該使用命名區(qū)域 namedrange,或者指定地址:sheet1$a1:c10 4。如何引用列名? 根據(jù)默認連接字符串中,數(shù)據(jù)提供程序會將有效區(qū)域內(nèi)的第一行作為列名,如果此行某單元格為空則用f1、f2表示,其中序數(shù),跟單元格的位置一致,從1開始; 如果希望第一行作為數(shù)據(jù)顯示,而非列名,可以在連接串的 extended properties 屬性指定:

8、hdr=no 默認值為:hdr=no 格式如下: string connstr = provider=microsoft.jet.oledb.4.0; + extended properties=excel 8.0;hdr=no; + data source= + xlspath; 注意: excel 8.0;hdr=no 需要使用雙引號(這里的反斜扛,是c#中的轉(zhuǎn)義) ref: ms-help:/ms.vscc.v80/ms.msdn.v80/ms.visualstudio.v80.chs/wd_adonet/html/745c5f95-2f02-4674-b378-6d51a7ec2490

9、.htm 中 連接excel節(jié)(說明:在我自己的msdn中,它的例子使用了兩個雙引號是錯的,測試沒有通過,原文這樣說的: 注意,extended properties 所需的雙引號必須還要加雙引號。 ) 在這種情況下,所有的列名都是以f開頭,然后跟索引,從f1開始,f2,f3。 5。為什么有效單元格數(shù)據(jù)不顯示出來? 出現(xiàn)這種情況的可能原因是,默認連接中,數(shù)據(jù)提供程序根據(jù)前面單元格推斷后續(xù)單元個的數(shù)據(jù)類型。 可以通過 extended properties 中指定 imex=1 “imex=1;”通知驅(qū)動程序始終將“互混”數(shù)據(jù)列作為文本讀取 ref:同4 ps:在baidu這個問題的時候,有網(wǎng)友

10、說,將每個單元都加上引號,這固然是格方案,但是工作量何其大啊,又不零活,慶幸自己找到”治本藥方“ more ref: 如何在 visual basic 或 vba 中使用 ado 來處理 excel 數(shù)據(jù) http:/dotnet.aspx.cc/showdetail . 9-8ce0-d69b894a0599 注意: 在網(wǎng)上有很多同志說是加上hdr或imex這兩個屬性值后會報“找不到可安裝的isam ”的錯誤。這時解決方法很簡單: 就是把連接串寫成如下形式: provider=microsoft.jet.oledb.4.0;data source=0;extended properties=

11、excel 8.0;hdr=1; imex=1; (注意紅色標注的單引號) 而不要寫成這樣的形式: provider=microsoft.jet.oledb.4.0;data source=0;extended properties=excel 8.0;hdr=1; imex=1; 應用程序經(jīng)常需要與excel進行數(shù)據(jù)交互,在上一篇文章ado.net 如何讀取 excel (上)闡述了基于ado.net 讀取excel的基本方法與技巧。今天這里要介紹是如何動態(tài)的讀取excel數(shù)據(jù),這里的動態(tài)指的是事先不知道excel文件的是什么樣的結(jié)構,或者無法預測,比如一張.xls文件有多少張sheet,而

12、且每張sheet的結(jié)構可能都不一樣等等。 其實我們可以通過獲取excel的“架構信息”來動態(tài)的構造查詢語句。這里的“架構信息”與數(shù)據(jù)庫領域的“數(shù)據(jù)庫架構信息”意義相同(也稱“元數(shù)據(jù)”),對于整個數(shù)據(jù)庫,這些“元數(shù)據(jù)”通常包括數(shù)據(jù)庫或可通過數(shù)據(jù)庫中的數(shù)據(jù)源、表和視圖得到的目錄以及所存在的約束等;而對于數(shù)據(jù)庫中的表,架構信息包括主鍵、列和自動編號字段等。 在ado.net 如何讀取 excel (上)提到 在關系數(shù)據(jù)庫提供的各種對象中(表、視圖、存儲過程等),excel 數(shù)據(jù)源僅提供相當于表的對象,它由指定工作簿中的工作表和定義的命名區(qū)域組成。命名區(qū)域被視為“表”,而工作表被視為“系統(tǒng)表”) 這里

13、我們將excel也當作一個“數(shù)據(jù)庫”來對待,然后利用oledbconnection.getoledbschematable 方法 要獲取所需的架構信息,該方法獲取的架構信息與ansi sql-92是兼容的: 注意:對于那些不熟悉 ole db 架構行集的人而言,它們基本上是由 ansi sql-92 定義的數(shù)據(jù)庫構造的標準化架構。每個架構行集具有為指定構造提供定義元數(shù)據(jù)的一組列(稱作 .net 文檔中的“限制列”)。這樣,如果請求架構信息(例如,列的架構信息或排序規(guī)則的架構信息),則您會明確知道可以得到哪種類型的數(shù)據(jù)。如果希望了解更多信息,請訪問 appendix b: schema rows

14、ets。 ref:/china/m . anet2.mspx?mfr=true 以下是讀取excel文件內(nèi)“表”定義元數(shù)據(jù),并顯示出來的的程序片斷: / 讀取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; + / 指定擴展屬性為 micro

15、soft 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 tblnames = null; / 初始化連接,并打開 conn = new oledbconnection(connstr); conn.open(); / 獲取數(shù)據(jù)源的表定

16、義元數(shù)據(jù) /tblschema = conn.getschema(tables); tblschema = conn.getoledbschematable(oledbschemaguid.tables, new object null, null, null, table ); gridview1.datasource = tblschema; gridview1.databind(); / 關閉連接 conn.close(); getoledbschematable 方法的詳細說明可以參考: /zh-cn . edbschematable.

17、aspx 接著是一段利用“架構信息”動態(tài)讀取excel內(nèi)部定義的表單或者命名區(qū)域的程序片斷: / 讀取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; + / 指定擴展屬性為 microsoft excel 8.0 (97) 9.0 (2000) 10.0 (2002),并且第一行作為數(shù)

18、據(jù)返回,且以文本方式讀取 data source= + xlspath; string sql_f = select * from 0; oledbconnection conn = null; oledbdataadapter da = null; datatable tblschema = null; ilist tblnames = null; / 初始化連接,并打開 conn = new oledbconnection(connstr); conn.open(); / 獲取數(shù)據(jù)源的表定義元數(shù)據(jù) /tblschema = conn.getschema(tables); tblschema

19、 = conn.getoledbschematable(oledbschemaguid.tables, new object null, null, null, table ); /gridview1.datasource = tblschema; /gridview1.databind(); / 關閉連接 /conn.close(); tblnames = new list(); foreach (datarow row in tblschema.rows) tblnames.add(string)rowtable_name); / 讀取表名 / 初始化適配器 da = new oledbd

20、ataadapter(); / 準備數(shù)據(jù),導入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)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論