Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 三级在线观看网站,91在线激情在线观看,日韩视频精品

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          VBA抓取動態(tài)網(wǎng)頁,緊盯股票主力資金

          一篇文章用VBA下載一部完整小說,VBA除了可以輕松下載一部《水滸傳》小說,還有什么用途?VBA獲取網(wǎng)頁信息(即爬蟲技術(shù))其用處可多了。今天介紹各位小伙用來監(jiān)控的自選股票的主力資金變動的情況,愿大伙在2022年股票市場長紅!也是把上期一個網(wǎng)友評論的內(nèi)容(有些數(shù)據(jù)藏得很深,怎么找真正的地址……)回應(yīng)一下。

          東富的主力資金流入圖

          有一個理論我們會經(jīng)常聽到,A股的票漲漲跌跌主要是因為有大資金在活動、在操作,一些股票不斷上漲是因為有主力資金不斷買入,反而不斷下跌是因為主力資金不斷流出。喜歡做短線的,我們實時觀察這些主力資金就變得很有意義,很多網(wǎng)站都有主力資金的數(shù)據(jù),但是要對多支股票進(jìn)行觀察,則需要一個個打開網(wǎng)頁、APP或者電腦程序查看數(shù)據(jù),這樣耗時也不能多支股票同框?qū)Ρ取_€有一些小伙正上班,打開股票軟件給老板或同事看到,總覺得怪怪的,當(dāng)然這不是鼓勵一些小伙上班玩股票,純屬用項目和大家一起交流學(xué)習(xí)。

          用VBA就可以很輕松解決上述兩個問題。大伙先看看效果吧!

          點擊按鈕更新數(shù)據(jù):2022年12月21日數(shù)據(jù)

          完整代碼如下:

          Sub maincapital()
          
          Application.DisplayAlerts = False
          '循環(huán)A列數(shù)據(jù),解析出相應(yīng)股票代碼
          For Each cl In Range("a2:a" & Range("a2").End(xlDown).Row)
          stock_code = Right(cl, 6) '取右邊6位字符
          Dim strText, stcok_code As String
          '拼接構(gòu)造網(wǎng)址
          URL = "https://push2.eastmoney.com/api/qt/ulist.np/get?cb=fltt=2&secids=1." + stock_code + "&fields=f62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf64%2Cf65%2Cf70%2Cf71%2Cf76%2Cf77%2Cf82%2Cf83%2Cf164%2Cf166%2Cf168%2Cf170%2Cf172%2Cf252%2Cf253%2Cf254%2Cf255%2Cf256%2Cf124%2Cf6%2Cf278%2Cf279%2Cf280%2Cf281%2Cf282&ut=b2884a393a59ad64002292a3e90d46a5&_=1641268581776"
          With CreateObject("MSXML2.XMLHTTP")
              .Open "GET", URL, False
              .send
              strText = .responseText
          End With
          
          '判斷是有null,解決深A(yù)股和上A股網(wǎng)址不同拼接問題,secids=0.是深A(yù);secids=1.是上A。
          Dim regStrTest As Object
          With CreateObject("VBScript.Regexp")
              .Pattern = "null"
              Set regStrTest = .Execute(strText)
          End With
          If regStrTest.Count > 0 Then
          '如果出現(xiàn)null則拼接構(gòu)造一個新網(wǎng)址
          URL = "https://push2.eastmoney.com/api/qt/ulist.np/get?cb=fltt=2&secids=0." + stock_code + "&fields=f62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf64%2Cf65%2Cf70%2Cf71%2Cf76%2Cf77%2Cf82%2Cf83%2Cf164%2Cf166%2Cf168%2Cf170%2Cf172%2Cf252%2Cf253%2Cf254%2Cf255%2Cf256%2Cf124%2Cf6%2Cf278%2Cf279%2Cf280%2Cf281%2Cf282&ut=b2884a393a59ad64002292a3e90d46a5&_=1641268581776"
          With CreateObject("MSXML2.XMLHTTP")
              .Open "GET", URL, False
              .send
              strText = .responseText
          End With
          End If
          
          Rnum = cl.Row '股票名稱所在行號
          '利用正則表達(dá)式得到我們想要的內(nèi)容,并寫相應(yīng)的表格
          With CreateObject("VBScript.Regexp")
              .Pattern = """f62"":(.*?),"
          Cells(Rnum, 2) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '主力凈流進(jìn)
              .Pattern = """f184"":(.*?),"
          Cells(Rnum, 3) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '主力凈比
              .Pattern = """f66"":(.*?),"
          Cells(Rnum, 4) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2)  '超大單凈流進(jìn)
              .Pattern = """f69"":(.*?),"
          Cells(Rnum, 5) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '超大單凈比
              .Pattern = """f72"":(.*?),"
          Cells(Rnum, 6) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2)  '大單凈流進(jìn)
              .Pattern = """f75"":(.*?),"
          Cells(Rnum, 7) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '大單凈比
              .Pattern = """f78"":(.*?),"
          Cells(Rnum, 8) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2)  '中單凈流進(jìn)
              .Pattern = """f81"":(.*?),"
          Cells(Rnum, 9) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '中單凈比
              .Pattern = """f84"":(.*?),"
          Cells(Rnum, 10) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2)  '小單凈流進(jìn)
              .Pattern = """f87"":(.*?),"
          Cells(Rnum, 11) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '小單凈比
              .Pattern = """f64"":(.*?),"
          Cells(Rnum, 12) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '超大單流入
              .Pattern = """f65"":(.*?),"
          Cells(Rnum, 13) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '超大流出
              .Pattern = """f70"":(.*?),"
          Cells(Rnum, 14) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '大單流入
              .Pattern = """f71"":(.*?),"
          Cells(Rnum, 14) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '大單流出
              
          End With
          Next
          Application.DisplayAlerts = True
          End Sub

          這個項目用到的幾個重要知識:

          1. 獲取動態(tài)網(wǎng)頁加載數(shù)據(jù)的真正網(wǎng)址;
          2. 使用CreateObject("MSXML2.XMLHTTP")對象獲取網(wǎng)頁信息,基本框架可以參考用VBA下載一部完整小說;
          3. 使用CreateObject("VBScript.Regexp")正則表達(dá)式對象,處理網(wǎng)頁信息并寫入表格;
          4. 點擊按鈕調(diào)用函數(shù)

          獲取動態(tài)網(wǎng)頁加載數(shù)據(jù)的真正網(wǎng)址

          我們在目標(biāo)網(wǎng)頁點擊右鍵,并點擊“查看網(wǎng)頁源代碼”后,當(dāng)使用cttl+f鍵查看我們想要獲取的信息進(jìn)行查看(這里我輸入主力凈比數(shù)據(jù)-42.76),發(fā)現(xiàn)并沒有相關(guān)的數(shù)據(jù)。

          在源代碼網(wǎng)頁同時按cttl+f鍵查看

          通過這個方法基本可以判斷目標(biāo)網(wǎng)頁的部分?jǐn)?shù)據(jù)是使用動態(tài)加載的方式。簡單的動態(tài)加載數(shù)據(jù),可以通過以下兩步獲取真正的網(wǎng)址:

          第一步:打開瀏覽器控制臺。演示使用的瀏覽器是chrome,按下F12鍵打開瀏覽器控制臺,再次刷新網(wǎng)頁,在控制臺找到并點擊擴(kuò)大鏡小按鈕,打開search對話框,這里輸入想找的數(shù)據(jù)(這里我輸入主力凈比數(shù)據(jù)42.76)后,按下回車鍵或輸入框旁邊的刷新按鍵,就會彈出一個“get”字符及一些類似網(wǎng)址的內(nèi)容,點擊彈出的內(nèi)容,右下面對話框會彈出相應(yīng)的內(nèi)容(對話框的菜單有Headers,Preview,Response……)

          圖中主力凈比數(shù)據(jù)為-42.73和在輸入框的數(shù)據(jù)不一致,是因為資金數(shù)據(jù)動態(tài)變化了

          第二步:找到加載數(shù)據(jù)的網(wǎng)址。點擊Headers可以看到Resquest URl字符,后面網(wǎng)址就是加載數(shù)據(jù)真正的網(wǎng)址,復(fù)制網(wǎng)址在瀏覽器打開,我們可以看到相應(yīng)的數(shù)據(jù)內(nèi)容。獲得這網(wǎng)址后,就可以通過VBA訪問這個網(wǎng)址獲取相應(yīng)的數(shù)據(jù),按下來的工作就好辦了。

          目標(biāo)數(shù)據(jù)的網(wǎng)址


          使用CreateObject("MSXML2.XMLHTTP")對象獲取網(wǎng)頁信息

          stock_code = Right(cl, 6) '取右邊6位字符
          Dim strText, stcok_code As String '
          '拼接構(gòu)造網(wǎng)址
          URL = "https://push2.eastmoney.com/api/qt/ulist.np/get?cb=fltt=2&secids=1." + stock_code + "&fields=f62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf64%2Cf65%2Cf70%2Cf71%2Cf76%2Cf77%2Cf82%2Cf83%2Cf164%2Cf166%2Cf168%2Cf170%2Cf172%2Cf252%2Cf253%2Cf254%2Cf255%2Cf256%2Cf124%2Cf6%2Cf278%2Cf279%2Cf280%2Cf281%2Cf282&ut=b2884a393a59ad64002292a3e90d46a5&_=1641268581776"
          With CreateObject("MSXML2.XMLHTTP")
              .Open "GET", URL, False
              .send
              strText = .responseText
          End With
          
          '判斷是有null,解決深A(yù)股和上A股網(wǎng)址不同拼接問題,secids=0.是深A(yù);secids=1.是上A。
          Dim regStrTest As Object
          With CreateObject("VBScript.Regexp")
              .Pattern = "null"
              Set regStrTest = .Execute(strText)
          End With
          If regStrTest.Count > 0 Then
          '如果出現(xiàn)null則拼接構(gòu)造一個新網(wǎng)址
          URL = "https://push2.eastmoney.com/api/qt/ulist.np/get?cb=fltt=2&secids=0." + stock_code + "&fields=f62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf64%2Cf65%2Cf70%2Cf71%2Cf76%2Cf77%2Cf82%2Cf83%2Cf164%2Cf166%2Cf168%2Cf170%2Cf172%2Cf252%2Cf253%2Cf254%2Cf255%2Cf256%2Cf124%2Cf6%2Cf278%2Cf279%2Cf280%2Cf281%2Cf282&ut=b2884a393a59ad64002292a3e90d46a5&_=1641268581776"
          With CreateObject("MSXML2.XMLHTTP")
              .Open "GET", URL, False
              .send
              strText = .responseText
          End With
          End If

          上面代碼的說明:

          1、使用right(目標(biāo)字符串,字符個數(shù))函數(shù)獲取目標(biāo)字符串從右邊數(shù)起第幾個字符。

          2、做兩次網(wǎng)址請求是因為深A(yù)股和上A股的數(shù)據(jù)網(wǎng)址是有區(qū)別,網(wǎng)址的參數(shù)“secids=0.+ 股票代碼”是深A(yù);“secids=1.+股票代碼”是上A。如果人為對每支股票判斷是上A還深A(yù)會很復(fù)雜,所以使用正則表達(dá)式,對請求數(shù)據(jù)內(nèi)容出現(xiàn)“null”字樣的網(wǎng)址,則更換網(wǎng)址參數(shù)。如下圖:

          上A網(wǎng)址請求結(jié)果

          深A(yù)網(wǎng)址請求結(jié)果


          使用CreateObject("VBScript.Regexp")正則表達(dá)式對象獲取數(shù)據(jù)

          For Each cl In Range("a2:a" & Range("a2").End(xlDown).Row)
          ……
          Rnum = cl.Row '股票名稱所在行號
          '利用正則表達(dá)式得到我們想要的內(nèi)容,并寫相應(yīng)的表格
          With CreateObject("VBScript.Regexp")
              .Pattern = """f62"":(.*?)," 'VBA的英文的雙引號
          Cells(Rnum, 2) = Round(.Execute(strText)(0).submatches.Item(0) / 100000000, 2) '主力凈流入
              .Pattern = """f184"":(.*?),"
          Cells(Rnum, 3) = Round(.Execute(strText)(0).submatches.Item(0) / 100, 2) '主力凈比
              .Pattern = """f66"":(.*?),"
          ……

          上面代碼的說明:

          1、Range("a2").End(xlDown)是表示定位從A2單元往下最后一個不空值的單元格。

          2、cl.Row是表示單元格的行數(shù),Range("A1").Row,Cells(1, 1).Row都可以獲取單元格行數(shù),列值則是Range("A1").Column和Cells(1, 1).Column。

          3、.Pattern = """f62"":(.*?)," 是正則表達(dá)式(網(wǎng)頁的內(nèi)容是:"f62":-15043563520.0),VBA的英文的雙引號用正則表式表示則是兩個雙引號,即是""。"f62":后面數(shù)據(jù)就是主力凈流入的數(shù)據(jù),用(.*?)表示。再用.submatches.Item(0)得到目標(biāo)數(shù)據(jù),這個數(shù)據(jù)是以元為單位,網(wǎng)頁顯示的是億,所以要/100000000。

          4、Round(目標(biāo)數(shù)據(jù),小數(shù)點位數(shù))是取多少位小數(shù)的方法。


          點擊按鈕調(diào)用函數(shù)

          Private Sub CommandButton1_Click()
          Call maincapital '調(diào)用函數(shù)
          End Sub



          在這總結(jié)一下VBA抓取數(shù)據(jù)主要步驟:

          分析網(wǎng)站->>分析網(wǎng)頁數(shù)據(jù)->>處理網(wǎng)頁數(shù)據(jù)->>儲存網(wǎng)頁數(shù)據(jù)

          歡迎大家評論及提意見,相互學(xué)習(xí),提高效率,創(chuàng)造價值。

          TML <script> 標(biāo)簽被用來向 HTML 中插入 VBScript。


          HTML 中的 VBScript

          如需在 HTML 中插入 VBScript,腳本必須寫在標(biāo)準(zhǔn)的 <script> 和 </script> 標(biāo)簽之間。

          在 <script> 標(biāo)簽中,請使用 type 屬性來定義腳本語言 "text/vbscript":

          <html>

          <body>

          <script type="text/vbscript">

          ...

          </script>

          </body>

          </html>

          IE 將解釋和執(zhí)行 <script> 和 </script> 之間的 VBScript 代碼。


          VBScript 輸出

          當(dāng) VBScript 被用在 Web 服務(wù)器上的 ASP 頁面時,語句 response.write() 產(chǎn)生輸出。

          當(dāng)我們使用 Internet Explorer 來測試 VBScript,我們使用 document.write() 來產(chǎn)生輸出:

          實例(僅適用于 Internet Explorer)

          <html>

          <body>

          <script type="text/vbscript">

          document.write("Hello World!")

          </script>

          </body>

          </html>

          在上面的實例中,瀏覽器輸出 "Hello World!" 到 HTML 頁面。

          VBScript 不應(yīng)該被用作客戶端腳本語言!

          在這里,我們使用僅適用于 IE 的 VBScript 的用于學(xué)習(xí)。

          能是將一個html 表格變成 Microsoft Excel 格式的最快方法。ContentType 屬性通知
          瀏覽器數(shù)據(jù)要被格式化為何種格式,在這里我們要的格式是Microsoft Excel。當(dāng)瀏覽器看到這個屬性的值是Excel時,它就提示用戶保存或打開這個文件。如果用戶選擇打開文件,
          就啟動了Excel并在其中觀看數(shù)據(jù)。為使其工作正確,必須在向Response對象寫入任何內(nèi)容之前設(shè)置ContentType 。此語法的例子如下:
             Line 1: 〈 %@ LANGUAGE="VBSCRIPT" % 〉
             Line 2: Response.ContentType = "application/msexcel"
             Line 3: % 〉
             點擊這里可以得到有關(guān)ASP的Response 對象的ContentType屬性的更多信息。
             當(dāng)我試圖用Internet Explorer 4.x.測試時發(fā)現(xiàn)了一個問題,在Microsoft文章 Q185978曾經(jīng)提到過。 這篇知識庫文章的內(nèi)容可以概括如下:
             “如果Internet Explorer 與一個動態(tài)生成Word、 Excel或其它活動文檔的Web服務(wù)器
          資源相連接時,Internet Explorer會為此資源發(fā)出兩個GET 請求。第二個GET 通常沒有ses
          sion 狀態(tài)信息、臨時 cookies或者已經(jīng)為客戶指定的證明信息。這個錯誤可能影響到任何
          寄宿在Internet Explorer 結(jié)構(gòu)窗口內(nèi)的本地服務(wù)器(EXE) 的活動文檔應(yīng)用程序。它在ISAP
          I、 ASP或 CGI 應(yīng)用程序中發(fā)生最為頻繁,它們校驗HTTP "Content Type" 頭文件以識別所
          安裝的應(yīng)用程序”。
             因此如果你嘗試使用session 變量或 cookies, 并使用IE4,就有可能遭遇到這個錯
          誤。經(jīng)證實,在IE5中這個問題已經(jīng)得到解決。
             一個用逗號分隔開的值文件是將web頁面輸出到Excel可讀格式的第二種選擇。這種格
          式比ContentType 屬性有更大的靈活性。相對于其它方法,CSV還有兩個優(yōu)勢:首先,不需
          要任何客戶機(jī)或服務(wù)器上的 軟件去創(chuàng)建它,第二,文件通常要比一個Excel 文件小。
             CSV格式的定義如下:逗號分隔列,回車分隔行。逗號作為分隔符, 也會與包含逗號
          的 域(如,234)引發(fā)一個問題; 這會在將要創(chuàng)建的行中導(dǎo)致一個額外的列。這個問題也
          很容易矯正, 方法是在每個結(jié)尾處用逗號將域封閉起來。
             在提供的例子中把 CreateCSVFile()函數(shù)過一遍,就能了解CSV文件是如何創(chuàng)建的。
             Line 1: strFile = GenFileName()
             Line 2: Set fs = CreateObject("Scripting.FileSystemObject")
             Line 3: Set a = fs.CreateTextFile(server.MapPath(".") & "" & strFile &
          Line 4: ".csv",True)
             Line 5: If Not oRS.EOF Then
             Line 6: strtext = chr(34) & "Year" & chr(34) & ","
             Line 7: strtext = strtext & chr(34) & "Region" & chr(34) & ","
             Line 8: strtext = strtext & chr(34) & "Sales" & chr(34) & ","
             Line 9: a.WriteLine(strtext)
             Line 10: Do Until oRS.EOF
             Line 11: For i = 0 To oRS.fields.Count-1
             Line 12: strtext = chr(34) & oRS.fields(i) & chr(34) Line 13: & ","
             Line 14: a.Write(strtext)
             Line 15: Next
             Line 16: a.Writeline()
             Line 17: oRS.MoveNext
             Line 18: Loop
             Line 19: End If
             Line 20: a.Close
             Line 21: Set fs=Nothing
            Line 22:Response.Write("Click〈 A HREF=" & strFile & ".csv 〉Here〈 /A 〉
             Line 23: to get CSV file")
             第一行調(diào)用GenFileName() 函數(shù)創(chuàng)建一個唯一的文件名,有關(guān)GenFileName() 函數(shù)將
          在稍后討論。
             第2行到第4行,用FileSystemObject 對象和CreateTextFile函數(shù)將要寫入的文本文
          件。在這個例子中, 所寫入的文件與源文件在同一個路徑下,在實際工作中,你也許想要
          創(chuàng)建一個單獨(dú)的路徑存儲這些文件。
             第5-9行產(chǎn)生第一行的標(biāo)題。因為報告通常都是相同的,我就把列名的代碼固定下來,
          雖然也有可能讀 數(shù)據(jù)庫的列名并使用它們。注意我在各個域中是如何包含逗號的。使用Wri
          teLine 函數(shù)將它們與一個回 車一起發(fā)送到文件中。
             第10行到18行在記錄集中循環(huán),用引號給每個域做出標(biāo)志,后面跟著一個逗號。然后W
          rite函數(shù)將每個 域發(fā)送到文件。WriteLine 用回車結(jié)束每一行。
             最后幾行關(guān)閉文件、釋放對象、在頁面上放置一個鏈接以便能夠找回它。
             當(dāng)你點擊生成的鏈接時,就會被提示保存或打開。如果選擇打開,文件就在Excel 中
          打開(假設(shè)計算機(jī) 上已經(jīng)安裝)。如果選擇了保存,就將這個文本文件保存到存儲設(shè)備上
          并將它輸入各個應(yīng)用程序中。
             我所討論的最后一種方法是用Microsoft Excel 對象創(chuàng)建一個實際的Excel(.xls ) 文
          件。要使用這些對象要求在Web 服務(wù)器上安裝Excel。使用這些控制可以對格式化有更多的
          控制(如字體、顏色等), 并允許你進(jìn)行一切在真正的Excel 應(yīng)用程序中可以進(jìn)行的操
          作。一定要監(jiān)視你的服務(wù)器的性能,因為 Excel 可能成為一個相當(dāng)大的對象并對性能造成
          沖擊,這取決于你如何使用它以及服務(wù)器有多忙。
             我發(fā)現(xiàn)在Excel 對象上得到更多信息的最快最簡便的方法是使用Visual Basic對象瀏
          覽器,觀看對象 并使用上下文敏感幫助來得到更多細(xì)節(jié)。使用這個對象瀏覽器時:啟動Vis
          ual Basic, 創(chuàng)建一個工程文件, 增加一個對Microsoft Excel對象庫的引用。在 View 菜
          單下,可以選擇一個對象瀏覽器然后指定Excel 庫,看到所有可用的對象。按 F1可得到當(dāng)
          前標(biāo)題的上下文敏感幫助。
             在所提供的樣本中把CreateXlsFile() 函數(shù)過一遍,就可以看到如何創(chuàng)建一個Excel文
          件。 基本步驟與 創(chuàng)建 CSV文件的基本相同,只是所創(chuàng)建的是一個Excel工作表。
          Line 1: Dim xlWorkSheet
          Line 2: Dim xlApplication
          Line 3: Set xlApplication = Server.CreateObject("Excel.Application")
          Line 4: xApplication.Visible = False
          Line 5: xlApplication.Workbooks.Add
          Line 6: Set xlWorksheet = xlApplication.Worksheets(1)
          Line 7: xlWorksheet.Cells(1,1).Value = "Year"
          Line 8: xlWorksheet.Cells(1,1).Interior.ColorIndex = 5
          Line 9: xlWorksheet.Cells(1,2).Value = "Region"
          Line 10: xlWorksheet.Cells(1,2).Interior.ColorIndex = 5
          Line 11: xlWorksheet.Cells(1,3).Value = "Sales"
          Line 12: xlWorksheet.Cells(1,3).Interior.ColorIndex = 5
          Line 13: iRow = 2
          Line 14: If Not oRS.EOF Then
          Line 15: Do Until oRS.EOF
          Line 16: For i = 0 To oRS.fields.Count-1
          Line 17: xlWorksheet.Cells(iRow,i + 1).Value = oRS.fields(i)
          Line 18: xlWorkSheet.Cells(iRow,i + 1).Interior.ColorIndex = 4
          Line 19: Next
          Line 20: iRow = iRow + 1
          Line 21: oRS.MoveNext
          Line 22: Loop
          Line 23: End If
          Line 24: strFile = GenFileName()
          Line 25: xlWorksheet.SaveAs Server.MapPath(".") & "" & strFile & ".xls"
          Line 26: xlApplication.Quit ' Close the Workbook
          Line 27: Set xlWorksheet = Nothing
          Line 28: Set xlApplication = Nothing
          Line 29: Response.Write("Click 〈 A HRef=" & strFile & ".xls 〉Here〈 /A 〉
          to Line 30: get XLS file")
             第1行和第2行,確定所使用的 Excel對象的維數(shù)。
             第3行,創(chuàng)建Excel對象。同樣,為了工作正確,web服務(wù)器上也必須有Excel。
             第4行,將Excel的可見性設(shè)置為false,這樣它就沒有界面了。
             第5行和第6行,增加一個容納工作表的工作簿,然后將當(dāng)前工作表設(shè)置成第一個工作
          表(這是Excel 在默認(rèn)狀態(tài)下創(chuàng)建的)。 還可以用 Worksheet對象的Add 函數(shù)增加一個新的
          工作表, 這就允許你的 Excel 文件中有多個工作表。
             第8-12行,創(chuàng)建工作表的標(biāo)題。在這個例子中,我們把每個單元的值都設(shè)置成適當(dāng)?shù)?br>標(biāo)題,而且把內(nèi)部 顏色設(shè)置成蘭色。你還可以用Range對象同時修改多個單元。
             第13-23行,提供從記錄集裝載所有數(shù)據(jù)的循環(huán)。因為第一行中包含標(biāo)題,我就在電子
          數(shù)據(jù)表的 第二行開始數(shù)據(jù)。里面的 For循環(huán)把每一列裝載到行中,并把內(nèi)部顏色設(shè)置為綠
          色。外部循環(huán)則為 每一行在記錄集中進(jìn)行循環(huán)。
             第24行, 通過調(diào)用GenFileName()函數(shù),與CSV用同樣的函數(shù)來創(chuàng)建唯一的文件名。
             第25行,進(jìn)行電子表格的實際保存。可以將表格存儲為 Excel中指定的多種格式。
             下面的3行進(jìn)行對象的整理。作為一個好的ASP程序員,就一定要整理所有的對象。
             最后,我把到 Excel文件的鏈接放在頁面上以便下載。
             我創(chuàng)建了一個樣本,對以上討論過的每個技巧進(jìn)行示范。要安裝樣本,只需要把所有
          的文件復(fù)制到服務(wù)器上,用 main.html 啟動應(yīng)用程序。在服務(wù)器上需要有 Excel以使用"Na
          tive Excel" 選項。 樣本使用一個Access數(shù)據(jù)庫 (無DSN鏈接)來存儲銷售數(shù)據(jù)。
             你可以選擇一年或一個地區(qū)進(jìn)行銷售報告。最后的選項是你希望如何返回數(shù)據(jù)。可以
          看到以下的屏幕映象:
          <p align="center">
             下面的表格中是對樣本中提供的所有文件的描述。
          文件名 描述
          DSN-SQL.asp 包含無DSN鏈接字符串
          adovbs.inc 包含ADO常量
          TestDB.mdb 包含銷售數(shù)據(jù)的一個Access97數(shù)據(jù)庫。包含的銷售表格有3個域:year--Tex
          t, region--Text,sales-amt--numeric
          main.html 本文件創(chuàng)建畫面的框架并裝載初始頁
          welcome.html 本文件只在第一次創(chuàng)建結(jié)果通常所在的畫面框架時使用
          request.html 包含一個表單,用來收集用戶的選擇來建立報告
          runquery.asp 應(yīng)用程序的內(nèi)臟。本文件建立SQL聲明、確定客戶機(jī)如何請求將被返回的數(shù)
          據(jù)、執(zhí)行SQL并按照請求返回數(shù)據(jù)
             大部分代碼都相當(dāng)容易理解。但是我還是要討論runquery.asp 文件中的一些函數(shù)。我
          已經(jīng)演示過如何創(chuàng)建CSV和Excel 文件。
             GenHTML()函數(shù)建立一個被請求數(shù)據(jù)的HTML表格。這個函數(shù)既用來作為HTML返回也用于
          ContentType請求。為了 ContentType請求工作,你要注意 Response.ContentType = "appl
          ication/msexcel" 是將要執(zhí)行的最初幾行之一。
             GenFileName()函數(shù)使用系統(tǒng)日期建立文件名的第一部分。這個文件名將是唯一的,這
          樣當(dāng)你試圖存儲 文件時就可以避免許多麻煩。擴(kuò)展名( CSV或XLS )在存儲文件時應(yīng)用,這
          樣就允許同一個函數(shù)產(chǎn)生兩種類型的文件。
             BuildSQL()函數(shù)使用表單變量來建立一個SQL聲明,與用戶的請求相匹配,并將其返回
          調(diào)用者。
             Recordset在腳本的最頂部被打開,因為它對于所選擇的顯示類型是獨(dú)立的。recordse
          t處理從BuildSQL()函數(shù)調(diào)用生成的SQL聲明,使用一個到Access 97的無DSN鏈接。
             〈 BODY 〉標(biāo)記中包含的代碼僅僅是兩個 "if….then" 聲明,確定用戶所要求的顯示
          方法。 if聲明分流到生成正確返回類型的函數(shù),該返回類型是基于用戶的"ReturnAS" 選
          擇。接著清除鏈接和記錄集對象。
             注意: 這個樣本沒有涉及到用戶下載web服務(wù)器上創(chuàng)建的文件之后,對這些文件的維護(hù)
          問題。我建議 這種維護(hù)要基于一段時間,時間到期后就刪除這些文件。 我不主張把移走這
          些文件的負(fù)擔(dān)轉(zhuǎn)嫁到客戶身上(通過頁面上的鏈接),因為他們很容易忘記這些事情。


             結(jié)論
             本文演示了將數(shù)據(jù)輸出到一個Excel可讀格式的三種方法。 我相信根據(jù)用戶的不同需
          要,這三種方法都有其可用之地。如果你愿意快速但不漂亮地輸出到Excel,就用ContentTy
          pe好了。如果你想要一個格式有限但能夠裝載到許多不同應(yīng)用程序中的文件,那么CSV格式
          適合你。如果你更喜歡包含完整格式、圖標(biāo)或特殊Excel功能,那么創(chuàng)建一個完全的Excel電
          子表格是適合的途徑。 但愿這些方法能幫助其他程序員滿足客戶的要求或者至少幫助你選
          擇正確的途徑。


          主站蜘蛛池模板: 一区二区三区国产| 亚洲一区二区三区影院| 久久高清一区二区三区| 久久中文字幕无码一区二区| 丝袜美腿高跟呻吟高潮一区| 久久er99热精品一区二区| 视频一区视频二区在线观看| 亚洲一区二区三区精品视频| 无码视频一区二区三区| 中文字幕人妻第一区| 日本福利一区二区| 亚洲av成人一区二区三区| 99精品国产一区二区三区| 无码av不卡一区二区三区| 日本一区中文字幕日本一二三区视频| 亚洲AV本道一区二区三区四区| 国模无码人体一区二区| 久久亚洲中文字幕精品一区四| 国产乱码精品一区二区三区四川 | 日韩视频免费一区二区三区| 久久精品黄AA片一区二区三区| 国产色综合一区二区三区| 久久影院亚洲一区| 亚洲一区二区三区香蕉| 伊人精品视频一区二区三区| 中文字幕一区二区三区视频在线| 无码少妇一区二区浪潮av| 国产在线一区二区视频| 视频在线观看一区二区三区| 波多野结衣在线观看一区二区三区 | 一区二区三区在线观看免费| 综合激情区视频一区视频二区| 国产一区在线观看免费| 精品91一区二区三区| 国产99精品一区二区三区免费 | 欧美日韩精品一区二区在线视频| 影音先锋中文无码一区| 国产香蕉一区二区精品视频| 亚洲av永久无码一区二区三区| 欧美亚洲精品一区二区| 福利一区福利二区|