用COM和ASP建立動態Word文檔(轉)

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

關於這個應用程式
  我們的應用程式有一個樣本表格,由訪問web 網站的使用者填寫。一旦提交,ASP檔案收集其中資訊,使用網頁伺服器上存放的預先定義的模板,以其內容建立一個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/ 是有效(點擊這個超連結會把你帶到個人的網頁伺服器或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。保留它的名字,在工程檔案所在的檔案夾中儲存它。

  然後,在網頁伺服器上註冊dll,如下: ● 將 MyDocument.dll 複製到windows\system 或 winnt\system32路徑(取決於使用的作業系統).
● 在命令提示字元下執行以下命令 C:\winnt\s



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.