用COM和ASP創建動態Word文檔 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 用COM和ASP創建動態Word文檔 大多數公司由於意識到無文檔的工作過程會成?前進的絆腳石,因此都開發了定義詳細的文檔程式。每個公司都?不同的程序定義自己的一套文檔模板,使它們隨時可被職員使用,用於進行購買請求或申請度假等。
但是,隨著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文件中的標記和值字串,應該彼此同步,儘管在模板文件中它們不一定會同步出現。
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |