全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2170
推到 Plurk!
推到 Facebook!

用COM和ASP創建動態Word文檔

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-28 05:16:15 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 用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
系統時間:2024-04-23 15:35:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!