人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

用COM與ASP創建動態Word文檔(轉)

用COM與ASP創建動態Word文檔(轉)

更新時間:2020-12-13 文章作者:未知 信息來源:網絡 閱讀次數:

大多數公司由于意識到無文檔的工作過程會成為前進的絆腳石,因此都開發了定義詳細的文檔程序。每個公司都為不同的過程定義自己的一套文檔模板,使它們隨時可被職員使用,用于進行購買請求或申請度假等。
  但是,隨著Internet 逐漸為大家熟悉和逐漸普及,越來越多的功能被移植到“開放空間”,以實現更好的可視性和更有效的通訊。比如說,一個人也許要問:“我可以登錄到Internet / Intranet,填寫一張休假申請表,然后以公司標準模板樣式將它作為Word 文檔發送給我的經理嗎?”答案是肯定的,下面會為你演示如何實現。

關于這個應用程序
  我們的應用程序有一個樣本表格,由訪問web 站點的用戶填寫。一旦提交,ASP文件收集其中信息,使用web 服務器上存放的預先定義的模板,以其內容創建一個Word 文檔。然后顯示一個鏈接,允許用戶查看或者下載這個文檔。

  我們創建一個Visual Basic COM 組件(ActiveX DLL), 通過ASP應用程序調用它,給它傳遞必要的參數。組件從本質上是使用Microsoft Word 對象庫,創建一個對將要傳遞參數的 Word 文檔的引用。所有這些都是在服務器上完成的,因為這種方法有許多優勢。

  其中最重要的是在程序內運行的since.dll (與網絡服務器在同樣的內存中),它們比程序外運行的(如CGI或Perl 腳本)運行更快,使用的資源更少,后者在運行中每次被調用時,都將創建自己本身的實例(如復制)作為單獨的程序,因此要用掉大量的服務器內存。這還意味著為了使程序外組件在服務器上運行(關鍵字:ASPAllowOutOfProcComponents),你不需要修改Metabase (一個存儲Internet信息服務器配置設置的結構,與Windows 注冊相同,但是使用較少的磁盤空間)。

  另一方面,這種方法最明顯的缺點也許是因為它與網絡服務器在同樣的內存空間中運行,任何DLL的問題都有可能使服務器出故障。因此,在開發和執行程序內應用程序時需要十分小心。

程序要求和優點

完成本文所說的功能,需要具備以下條件:
● Visual Basic 5 或 6
● 具備IIS 4的NT服務器 或 工作站,或者有PWS 的任何 Windows 9.x
● MS Word 97 ( Office 97 套裝的一部分)

  本例還可以和MS Word 2000一起執行,但是會有一些問題,在文章最后要提到。其它額外的軟件是不必要的,只需要保證默認站點http://localhost/ 是有效的(點擊這個超鏈接會把你帶到個人的web 服務器或Windows NT 的主頁)。
  我們將把創建的所有文檔都存儲在C:\Inetpub\scripts\documents 文件夾中, 所以一旦文檔被創建之后,我們提供到它的鏈接是很容易的(可以根據需要修改)。一定要創建這個路徑,否則我們的例子就不能工作。所有其它的文件都位于我們的腳本路徑 ( C:\Inetpub\scripts )。我們的dll 將盡可能地靈活,使任何模板的修改都只需要最少的代碼修改。

更深一層的技術

  要設計的模板可以基于一個公司希望在他們的文檔出現的內容:登錄、適當的頁眉和頁腳信息、基本文本等等。另外文檔創建之后,我們希望在其中看到用戶特殊信息的地方還要加入標記(這就使這個應用程序是動態的)。在我們回顧代碼時還會仔細看這些部分。我們的.dll 將包含一個稱為GenerateDocument 的函數(在類文件內部),它要求向它傳遞4個參數,分別是:
● 一個為所有標記用的分界字符串(來自文本模板)
● 一個為所有相應值用的分界字符串(來自 web瀏覽器上用戶填充的表格)
● 模板在服務器上的位置
● 生成的文檔在服務器上被存儲的位置

現在我們可以往下進行了。

組合在一起
文檔模板
  首先創建一個word 模板的樣本,假設它就是我們公司的標準文檔模板。我們要為這個例子獲取職員的信息,我們希望文檔中包含以下的特定信息:名字、地址、Email Id。現在基于這些信息創建模板,一定要在文檔中將要顯示用戶信息的地方包含適當的標記(如. < Name >, < Address >)。

  將文件命名為EmployeeTemplate.dot(記住,在Save As 對話框的文件類型列表中選擇文檔模板,并將其存入C:\Inetpub\Scripts\Templates\。看看可下載材料部分包含的文檔模板樣本,以便對它有個更好的理解。


COM組件
  現在用Visual Basic創建COM組件,按照以下的步驟:
● 啟動 Visual Basic, 選擇 ActiveX DLL 作為工程文件類型。
● 將類名改為DocumentObject, 工程文件名改為 MyDocumen(這是我們在ASP頁中創建COM組件的一個例示時要使用的信息)
● 接著,點擊工程文件菜單選項,到 References。
● 向下滾動直到看見 "Microsoft Word n.0 Object Library " (n 是一個識別服務器上安裝的word對象庫版本的數字).選中這個選項,點擊click OK。

  請參閱本文結尾處可下載文件中的類模塊代碼。GenerateDocument()函數要用到從ASP文件向它傳遞的4個參數。
它返回一個字符串類型,在后面可以看到:
Option Explicit
' Declare a New word application Object
Dim wdApp As New Word.Application
Public Function GenerateDocument(sTags, sValues, sSourcePath, sDestPath) _
As String
On Error GoTo ErrHandler
Dim arrTags() As String, arrValues() As String, iLoop As Integer

  此函數執行的第一個任務是從指定的源路徑(作為參數從ASP文件傳遞過來)打開模板文件。基于在服務器上創建的模板,引用一個新的Word 文檔:
wdApp.Documents.Open sSourcePath

  然后,將從HTML表單中獲取的所有標記,用Split 函數放入arrTags數列中。逗號是一個分界符,在ASP文件中分隔開標記的值:
arrTags = Split(sTags, ", ")

  我們將相應的用戶輸入值存入arrValues數列。pipe 字符( | ) 是分界符,來分隔開這些值:arrValues = Split(sValues, " | ") 代碼在arrTags 中循環 ,用查找和代替操作(用應用程序腳本的Visual Basic)從標記數列中找到標記,在創建的Word文檔中,用arrValues 數列中的相應值代替它們:

For iLoop = 0 To UBound(arrTags) wdApp.ActiveDocument.Content.Find.Execute arrTags(iLoop), , True, , _
, , , , , arrValues(iLoop), 2
Next iLoop

  你看到的一串逗號是Find-Execute 方法的不同屬性,我們沒有設置。我們只對 MatchWholeWord, ReplaceWith和ReplaceAll(用數字常量2代表)的設置選擇感興趣。然后,我們將文檔存入指定的目的路徑和文件名中,退出和釋放之前關閉這個word文檔對象:

wdApp.ActiveDocument.SaveAs sDestPath
wdApp.ActiveDocument.Close
wdApp.Quit
Set wdApp = Nothing
退出函數之前,返回一個'Success' 標志:
GenerateDocument = "Success"
Exit Function
這是一個錯誤處理程序。如果在上面的應用程序執行中遇到錯誤的話,它返回一個錯誤信息。
ErrHandler:
' Quit and release the word document object
wdApp.Quit
Set wdApp = Nothing
' Build the Error Message, and pass it back
Dim ErrMsg As String
ErrMsg = "Error Number: " & Err.Number & "< BR >< BR >"
ErrMsg = ErrMsg & "Error Source: " & Err.Source & "< BR >< BR >"
ErrMsg = ErrMsg & "Error Description: " & Err.Description & "< BR >< BR >"
GenerateDocument = ErrMsg
Exit Function
End Function
Private Sub Class_Terminate()
' Release the reference
Set wdApp = Nothing
End Sub

  在Visual Basic中,保存應用程序(保留類和工程文件名),編譯,看是否產生了什么錯誤。然后,打開File 菜單, 點擊Make MyDocument.dll。保留它的名字,在工程文件所在的文件夾中保存它。

  然后,在web 服務器上注冊dll,如下: ● 將 MyDocument.dll 復制到windows\system 或 winnt\system32路徑(取決于使用的操作系統).
● 在命令提示符下執行以下命令 C:\winnt\system32 >regsvr32 MyDocument.dll
● 你將看到一個成功的信息:DllRegisterServer in MyDocument.dll 。
上面完成了這個應用程序的主要部分。現在進入下一步。

HTML 頁面

  現在需要創建HTML頁面( EmployeeForm.html ),用戶將在其中輸入填充到新Word 文檔中的值。下面是我們使用的HTML頁樣本:
< HTML >
< TITLE > Employee Registration Page < /TITLE >
< BODY BGCOLOR=#ECECEC >
< CENTER >< FONT FACE=arial SIZE=-1 >
< FONT SIZE=5 > Employee Registration Page < /FONT >
< HR ALIGN=center COLOR=black >< BR >
Please complete your details as per the Registration Form...< BR >< BR >
< TABLE CELLSPACING=1 CELLPADDING=5 BGCOLOR="#000000" BORDER=0 ALIGN=center >
< FORM ACTION=CustomDoc.asp METHOD=post >
< TR > < TD BGCOLOR=#00BCA8 COLSPAN=2 ALIGN=center >
< B >
< FONT FACE=arial SIZE=-1 COLOR=black > Employee Details
< /TD >
< /TR >
< TR > < TD BGCOLOR=#C4C2C2 >
< B >< FONT FACE=arial SIZE=-1 COLOR=black >Your Name:
< /TD >
< TD BGCOLOR=#E3E1E1 > < INPUT TYPE=Text NAME="Name" SIZE=20 MAXLENGTH=25 > < /TD >
< /TR >
< TR > < TD BGCOLOR=#C4C2C2 >
< B >< FONT FACE=arial SIZE=-1 COLOR=black >Address: < /TD >
< TD BGCOLOR=#E3E1E1 >
< INPUT TYPE=Text NAME="Address" SIZE=40 MAXLENGTH=40 >
< /TD > < /TR > < TR >
< TD BGCOLOR=#C4C2C2 >
< B >< FONT FACE=arial SIZE=-1 COLOR=black >City, State: < /TD >
< TD BGCOLOR=#E3E1E1 > < INPUT TYPE=Text NAME="City" SIZE=20 MAXLENGTH=20>
< INPUT TYPE=Text NAME="State" SIZE=20 MAXLENGTH=20 >
< /TD > < /TR >
< TR > < TD BGCOLOR=#C4C2C2 >
< B >< FONT FACE=arial SIZE=-1 COLOR=black >Zip, Country: < /TD >
< TD BGCOLOR=#E3E1E1 >
< INPUT TYPE=Text NAME="Zip" SIZE=20 MAXLENGTH=20 >
< INPUT TYPE=Text NAME="Country" SIZE=20 MAXLENGTH=20 >
< /TD > < /TR > < TR > < TD BGCOLOR=#C4C2C2 >
< B >< FONT FACE=arial SIZE=-1 COLOR=black >Email: < /TD >
< TD BGCOLOR=#E3E1E1 > < INPUT TYPE=Text NAME="Email" SIZE=40 MAXLENGTH=40>
< /TD > < /TR > < TR >
< TD BGCOLOR=#00BCA8 COLSPAN=2 >
< INPUT TYPE=Submit VALUE="Save and Generate Profile Document" >
< INPUT TYPE=Reset VALUE="Clear Fields" >
< /TD > < /TR >
< /FORM > < /TABLE >
< /BODY >< /HTML >
  將文件存入C:\Inetpub\scripts\ 中,要確定腳本路徑在個人Web服務器或IIS中有讀取并執行權限。


ASP頁面
ASP頁( CustomDoc.asp ) 實際完成以下任務:取得用戶輸入、用COM組件創建Word 文檔、
將它遞交回用戶。下面是帶注釋的代碼:
< %
Dim sTags, sValues, sDestPath, sSourcePath, resValue
' Get all the User Input values from the Form
sName = Request("Name")
sAddress = Request("Address")
sCity = Request("City")
sState = Request("State")
sZip = Request("Zip")
sCountry = Request("Country")
sEmail = Request("Email")
sDate = Now() ' Create a list of all the tags as defined in the Word Template by You
sTags = "< Name >, < Address >, < City >, < State >, < Zip >, < Country >, " & _
"< Email >, < Date >"
' Gather up all the User Input values into one delimited string
sValues = sName & " | " & sAddress & " | " & sCity & " | " & sState & _
" | " & sZip & " | " & sCountry & " | " & sEmail & " | " & sDate

  完成之后,需要識別源文件(Template) 和目標文件(Document)的位置。APPL_PHYSICAL_PATH 返回CustomDoc.asp 文件所在的路徑。我們將文檔文件夾和文件名附加在一起,這是用戶負空間的名字。

sSourcePath = Request.ServerVariables("APPL_PHYSICAL_PATH") & _
"Templates\" & "EmployeeTemplate.dot"
sDestPath = Request.ServerVariables("APPL_PHYSICAL_PATH") & _
"Documents\" & Replace(sName, " ","") & ".doc"

  現在完成了常見MyDocument對象的例示和調用GenerateDocument.doc,在返回值的基礎上進行適當的操作。
Set myDocObj = Server.CreateObject("MyDocument.DocumentObject")
' Call the GenerateDocument function while passing the required
' Parameters retValue = myDocObj.GenerateDocument(sTags, sValues, sSourcePath, _
sDestPath)
' Take appropriate action based on the returned value
If retValue = "Success" Then
Msg = "Successfully generated your Document : " & Replace(sName, _
" ", "") & ".doc"
Response.Write("< font face=arial size=-1 color=Green >< br >" & Msg)
Response.Write("< br >< br >< a href=Documents/" & _
Replace(sName, " ","") & ".doc" & " >Here it is!< /a >")
Else Response.Write("< font face=arial size=-1 color=Red >< br >" & retValue) End If
% > 將文件存入C:\Inetpub\scripts\。就行了。現在在瀏覽器中鍵入
http://localhost/scripts/EmployeeForm.html,執行應用程序,輸入所有的域值,點擊
Save and Generate Profile Document。現在可以看到我們的方法是多么有效和美觀了。

對于Office 2000 的問題

  如果你的機器安裝了Word 2000,并且用Microsoft word 9.0 對象庫創建dll 的話,就會遇到一些問題。組件本身好象工作得絕對良好,沒有任何錯誤,但是從ASP頁調用會操作超時,或產生一個ActiveX 不能創建對象的錯誤。這也許是Office 2k設計上的特色,或者也許是一個錯誤(Bug)。下面解釋一下為什么會發生這些問題。大致來說,這是因為安全信用不能在所有的例示子對象中持續。當調用一個.asp 頁時它作為IUSR 帳號(web 服務器上的默認internet 客戶帳號)持續。當調用我們創建的COM組件時,IUSR 信用也被傳遞。

  這個COM反過來產生對office COM (子對象)的調用,但是卻不能傳遞信用。為了克服這個問題,我們需要這樣做:
● 打開組件服務控制臺, 然后在COM+ Applications點擊右鍵。
● 選擇 New Application,跟隨 COM 應用程序向導, 命名一個空的app。

● 打開新的應用程序,在 Components上點擊右鍵。
● 選擇創建一個新組件,選擇置入已經注冊的組件。

● 在下一個對話框的組件列表中,選擇MyDocument.DocumentObject,點擊finish。應用程序現在就
很可能工作了。
  通過將COM 投入MTS ,我們允許COM持續為特定帳號,將它傳遞給調用的COM(在這個操作以前好象沒有發生過)。我猜想這是因為Microsoft只允許一級安全信用持續, 我懷疑不需要這樣做也可以把信用持續下去。

觀察和結論 我們已經基本上完成了。開發應用程序時還有一些需要注意。
● 如果你仔細觀察組件的設計,你會觀察到即使你已經從模板修改、增加、刪除了標記或文本,也根本不需要修改代碼。它是可以再利用的。只需要通過ASP文件傳遞一些參數,你就可以快速創建符合公司口味的Word 文檔了。
● 你可以根據需要定制它。只需要保證在模板文件中,你的標記是唯一的(在兩個不同的上下文中不要 使用相同的標記)。
● 還可以加強應用程序的功能,一旦創建,就可以根據輸入的Email ID (或從數據庫中)直接將文檔email給用戶,以實現交互式的改進。
● 在ASP文件中的標記和值字符串,應該彼此同步,盡管在模板文件中它們不一定會同步出現。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 日照市| 宜兴市| 丹棱县| 璧山县| 铜山县| 寻乌县| 得荣县| 方城县| 封开县| 黄冈市| 团风县| 大化| 张家川| 巴塘县| 苍梧县| 昌图县| 呼图壁县| 巩义市| 宝坻区| 沙洋县| 香河县| 巫山县| 泾阳县| 凌海市| 平度市| 北海市| 湄潭县| 建水县| 乌兰察布市| 高陵县| 和田市| 呼玛县| 进贤县| 柳江县| 武定县| 磐安县| 临海市| 六盘水市| 鸡东县| 元江| 阳新县|