?? asp實現(xiàn)在web中顯示電子表格數(shù)據(jù).txt
字號:
asp實現(xiàn)在web中顯示電子表格數(shù)據(jù)(一)顯示數(shù)據(jù)表格的應用
--------------------------------------------------------------------------------
【天啦】 于 2000-07-19 08:57:23 加貼在 Joy ASP ↑:
在用ASP語言開發(fā)的Web數(shù)據(jù)庫應用程序中,ADO (ActiveX Data Objects) 已經(jīng)成為非常流行的工具,而且對于真正的關(guān)系型數(shù)據(jù)庫,比如Oracle、SQL Server,它都不會有局限性。ADO能夠存取多種不同的數(shù)據(jù)格式,MS Excel電子數(shù)據(jù)表格就是其中之一。
關(guān)于這個應用
可供下載的例程代碼中包括一個ASP文件ReadX1.asp,一個Excel文件TheWorkbook.xls。你也可以另外加入一些電子數(shù)據(jù)表文件。
執(zhí)行ReadXl.asp頁面,將顯示出可用的電子數(shù)據(jù)表文件列表。選擇好一個文件,并提交表單后,你將會看到:
一個下拉菜單,其中是工作表名稱
一個下拉菜單,其中是命名的范圍
一個單元格范圍輸入框
第一個工作表的全部內(nèi)容
可以選擇工作簿文件中的另外一個工作表,或者輸入符合Excel格式的單元格范圍數(shù)值,比如:D20:E21 或者 Sheet3!F12:J22。注意:在ADO和ODBC驅(qū)動程序中,要用$符合替換分界符號!。
實現(xiàn)步驟
現(xiàn)在對這個應用程序已經(jīng)有了初步的認識,下面開始討論ASP代碼,看看如何讀取電子數(shù)據(jù)表的數(shù)據(jù),如何找到電子數(shù)據(jù)簿
(workbook)文件中可用的電子數(shù)據(jù)表(worksheet)和范圍,并看看實現(xiàn)文件列表選擇的技術(shù)。這里假設你已經(jīng)熟悉了編寫HTML表單的技術(shù),所以對此不做詳細介紹。
基本條件
下面將涉及到ADO對象、方法、屬性、收集和常量。在服務器上安裝IIS后,ADO就存在了,并且還有相關(guān)文檔,地址是http://YourServer/IisHelp/ado210.chm (版本2.1),或者http://YourServer/IisHelp/ado/docs/(老版本1.5)。如果需要升級ADO,可以從http://www.microsoft.com/Data/download.htm下載最新版本的MDAC工具包進行安裝。
實現(xiàn)“文件列表選擇”使用到了內(nèi)建的VBScript腳本對象,相關(guān)文檔可以查看http://YourServer/IisHelp/vbscript/htm/vbstoc.htm,如果想查看最新的文檔,請訪問http://msdn.microsoft.com/scripting
(版本5)。當然,在服務器端和客戶端,你都不需要安裝MS Excel。
讀取電子數(shù)據(jù)表(Worksheet)數(shù)據(jù)
通過ADO讀取電子數(shù)據(jù)表與讀取數(shù)據(jù)庫表的方法基本是一樣的。從下圖可以看到,電子數(shù)據(jù)表的行被稱作記錄Records,列被稱作字段Fields。電子數(shù)據(jù)表或者單元格的范圍可以被看成表Tables,并按照記錄集recordsets進行存取。
Spreadsheet Database HTML
< table >
< tr >
< th >NameA< /th >
< th >NameB< /th >
< th >NameC< /th >
< /tr >< tr >
< td >1< /td >
< td >2< /td >
< td >3< /td >
< /tr >< tr >
< td >11< /td >
< td >12< /td >
< td >13< /td >
< /tr >
< /table >
執(zhí)行下面的步驟,從數(shù)據(jù)庫表中讀取數(shù)據(jù)并顯示:
連接數(shù)據(jù)庫(同樣:打開數(shù)據(jù)簿文件)
讀取記錄集recordset(同樣:讀取一定范圍的單元格)
循環(huán)每一個記錄(同樣:每一行),經(jīng)過格式化,顯示
建立ADO連接
在連接數(shù)據(jù)庫或者打開文件前,需要了解一些信息。其中只要是設置名叫DSN的ODBC驅(qū)動,但為每一個數(shù)據(jù)表都建立這樣的ODBC驅(qū)動,是非常麻煩的,因為這需要在服務器的控制臺上通過“控制面板/ODBC設置”手工完成。
幸好,ASP提供了替代DSN的其他方法,它可以非常容易地在運行時建立連接。比如,字符串“DRIVER={Microsoft Excel Driver?*.xls)};ReadOnly=1;DBQ=C:dirfile.xls",表示了替代DSN打開文件c:dirfile.xls,因此通過這種方法僅僅需要提供給ASP程序一個文件名即可。執(zhí)行下面的代碼,將從表單中讀取文件名,然后轉(zhuǎn)換為全路徑,接著生成連接字符串,最后建立并打開這個連接。
vXlFile = Request("XlBook")
vXlFilePath = Server.MapPath(vXlFile) ' assumes file in current directory
vConnString = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & _
vXlFilePath
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open vConnString
如果想查看更多的非DSN連接信息,請打開Windows或者NT System目錄下的幫助文件Odbcjet.hlp。
讀取記錄集
連接上電子數(shù)據(jù)簿文件后,讀取一定范圍的單元格數(shù)據(jù)就很簡單了。盡管不是必須的,但還是建議:用符合“[” 和 “]”包含住單元格的范圍定義。只所以這么做,是以防在數(shù)據(jù)庫的操作中產(chǎn)生非法的符合。
vXlRange = Request("XlRange")
Set oRs = oConn.Execute("[" & vXlRange & "]")
執(zhí)行上面的語句,將返回記錄集對象,其中包括范圍內(nèi)單元格的所有可用信息, 記錄集的數(shù)值和描述數(shù)據(jù)的元數(shù)據(jù)。
asp實現(xiàn)在web中顯示電子表格數(shù)據(jù)(二)生成HTML表格(轉(zhuǎn))
--------------------------------------------------------------------------------
【天啦】 于 2000-07-19 08:59:08 加貼在 Joy ASP ↑:
過程的最后一步是格式化數(shù)據(jù)并顯示,就是建立一個HTML輸出,步驟如下:
依次循環(huán)記錄集(Recordset)中每一個字段(Field),寫標題
依次循環(huán)記錄集和每一個字段,寫數(shù)值
例程代碼將整個的HTML表格組合為一個長字符串,最后輸出到HTML頁面。字符串初始化為如下值:
DataTable = "< table >< tr >"
電子數(shù)據(jù)表的列的必要信息由記錄集對象的Field集合產(chǎn)生,它包括了一系列字段對象,可以使用它們的Name屬性建立標題行。
For Each oField in oRs.Fields
DataTable = DataTable & "< th >" & oField.Name & "< /th >"
Next
DataTable = DataTable & "< /tr >"
最新打開的記錄集(recordset)自動將初始位置指向第一行,使用MoveNext方法移動記錄指針,順序存取每一行,直到整個記錄集的末尾。當?shù)接涗浖┪矔r,屬性Eof的值變成True,循環(huán)結(jié)束。在循環(huán)中,通過字段集合的列舉以及對應的Value屬性,從而達到單元格數(shù)據(jù)的存取。
Do While Not oRs.EOF
DataTable = DataTable & "< tr >"
For Each oField in oRs.Fields
DataTable = DataTable & "< td >" & oField.Value & "< /td >"
Next
DataTable = DataTable & "< /tr >"
oRs.MoveNext
Loop
最后,加上HTML的表格結(jié)束標記,輸出整個字符串到頁面,形成了動態(tài)產(chǎn)生的表格。由于記錄集對象不再需要,所以要釋放它。
DataTable = DataTable & "< /table >"
Set oRs = Nothing
Response.Write DataTable
在總結(jié)前,有必要說明一個小的定義在電子數(shù)據(jù)表是如何解釋的。
通常,在ADO中將一定范圍內(nèi)的第一行解釋為一套列標題,盡管在ODBC中有明文定義的選項可以禁止這種解釋,但我也不愿意在ADO中這么做。如果第一行包含數(shù)字信息,那么ADO中將返回通用的字段名,比如:F1,F2,等等...,這樣就不能看到數(shù)字的值。而且,ADO也會將第一行中的“非字母、非數(shù)字”字符替換為符號#。
--------------------------------------------------------------------------------
asp實現(xiàn)在web中顯示電子表格數(shù)據(jù)(三)創(chuàng)建電子數(shù)據(jù)表列表和名字范圍(轉(zhuǎn))
--------------------------------------------------------------------------------
【天啦】 于 2000-07-19 09:00:06 加貼在 Joy ASP ↑:
除了“讀取Excel數(shù)據(jù)形成HTML表格”的技術(shù)外,你可能有興趣想了解怎樣用程序?qū)崿F(xiàn)電子數(shù)據(jù)表和名字范圍的下拉菜單列表。
除了單元格的內(nèi)容,用ADO還能知道更多的信息---在上面,已經(jīng)討論了用它得到字段名的列表。
調(diào)用OpenSchema方法,可以得到當前打開數(shù)據(jù)庫(同樣適用于電子數(shù)據(jù)簿)的特殊記錄集,在這里討論的例程中,是取回了當前電子數(shù)據(jù)簿的電子數(shù)據(jù)表和名字范圍。在數(shù)據(jù)庫的操作中,通過傳遞給ADO一個adSchemaTablesas命令參數(shù),就可以得到所有表的信息。
Set oSchemaRs = oConn.OpenSchema(adSchemaTables)
上述調(diào)用將返回一個記錄集信息,對于文件TheWorkbook.xls,結(jié)果是:
TABLE_NAME TABLE_TYPE
Employees$ SYSTEM TABLE
ListOfProducts$ SYSTEM TABLE
Suppliers$ SYSTEM TABLE
A_Duplicate_Name TABLE
Alphabetical_List_of_Products TABLE
Employees TABLE
ListOfProducts$A_Duplicate_Name TABLE
Product_Totals TABLE
和記錄集相比較,電子數(shù)據(jù)工作簿中的電子數(shù)據(jù)表(worksheets)被當作系統(tǒng)表,名字范圍被當作通常表。通常情況下,無名范圍(可以使用!)不被記錄集報告。
掌握了這些信息,創(chuàng)建字段下拉菜單就成了分離兩個表類型和使用合適的標記的工作了。比如,可以執(zhí)行下面的HTML/ASP代碼段來創(chuàng)建工作表列表的下拉菜單:
< select name="XlSheet" >
< %
vOptions = "< option >< /option >"
Do While Not oSchemaRs.EOF
If oSchemaRs("TABLE_TYPE") = "SYSTEM TABLE" Then
vOptions = vOptions & "< option >" & _
Server.HtmlEncode(oSchemaRs("TABLE_NAME")) & _
"< /option >
End If
oSchemaRs.MoveNext
Loop
Response.Write vOptions
% >
< /select >
實際的ReadX1.asp代碼中可能還復雜一些,因為要處理上一個選項的顯示,同時要使用客戶端的JavaScript腳本檢查輸入的合法性。
asp實現(xiàn)在web中顯示電子表格數(shù)據(jù)(三)創(chuàng)建文件選擇列表(轉(zhuǎn))
--------------------------------------------------------------------------------
【天啦】 于 2000-07-19 09:00:59 加貼在 Joy ASP ↑:
最后介紹創(chuàng)建文件選擇列表的代碼,在這里使用內(nèi)建的FileSystem對象獲得文件和文件夾的信息。
為簡單起見,例程假設電子數(shù)據(jù)表文件和ASP文件位于同一個目錄下。通過vServerFolder= Server.MapPath(".") 獲取當前目錄名稱,并將之轉(zhuǎn)換到folder對象,從而找出目錄中的文件。 FileSystem對象的.GetFolder方法使用如下:
Set oFs = Server.CreateObject("Scripting.FileSystemObject")
Set oFolder = oFs.GetFolder(vServerFolder)
通過Folder對象的.Files集合的列舉,可以獲取文件夾下的文件,并且限制顯示的文件類型為Excel。執(zhí)行下面的HTML/ASP代碼創(chuàng)建文件選擇列表:
< select name="XlBook" >
< %
vOptions = ""
For Each oFile In oFolder.Files
If oFile.Type = "Microsoft Excel Worksheet" Then
vOptions = vOptions & "< option >" & _
Server.HtmlEncode(oFile.Name) & "< /option >
End If
Next
Response.Write vOptions
% >
< /select >
同樣的,實際的ReadX1.asp代碼要復雜些,因為有一些JavaScript腳本要取回上一次的選擇。
總結(jié)
上面介紹了如何通過ADO讀取Excel工作簿的方法,以及內(nèi)建對象FileSystem的使用技巧。除了廣泛地應用于數(shù)據(jù)庫領(lǐng)域,ADO能處理許多不同格式的數(shù)據(jù),其方式就象處理數(shù)據(jù)庫一樣。這里只是接觸到ADO的一點基本功能,還有更多更強大的方面有待開發(fā)。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -