如何從 Internet Explorer 使用 VB ActiveX 元件將 Word 自動化

文章翻譯 文章翻譯
文章編號: 286023 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您,如何從 Internet Explorer 所呈現的網頁使用 ActiveX 元件,將用戶端的 Word 自動化。從網頁使用 ActiveX 元件而不使用內嵌於網頁本身的指令碼,有幾個優點:
  • 如果您已有可將 Microsoft Word 自動化的 Visual Basic 程式碼,您可以將 Visual Basic 專案轉換成 ActiveX EXE 或 ActiveX DLL,以便在瀏覽器中重複使用程式碼。
  • Word 未標示成可處理指令碼。根據 Internet Explorer 安全性設定的不同,指令碼中的 Word Automation 程式碼可能不會執行,或者使用者可能會收到安全性警告的提示。假設您的 ActiveX 元件符合某些準則,則可能會被標示成可處理指令碼,以避免這些安全性問題。
  • Visual Basic 有數個功能無法與網頁中的指令碼搭配使用。例如,Visual Basic 可以使用但網頁指令碼無法使用的功能就是呼叫 Windows 應用程式發展介面 (API) 的能力。
常見的開發人員案例是,利用某些外部來源或邏輯的資料,提供網頁介面給使用者以建立 Word 文件。您可以使用伺服器端的 Word Automation 產生文件並串流回到用戶,但是需要用到 Word Automation 的伺服器端方法有許多缺點。主要的缺點是延展性;Word 是需要耗用很多資源的 Automation 伺服器,因此,不建議在網頁伺服器上產生文件。

透過使用 ActiveX 元件在用戶端產生文件,您可以將需要耗用資源的 Word Automation 從網頁伺服器中移除。這是本文所述範例 ActiveX 元件所提供的解決方案。雖然此範例是 Word Automation 特有的,但相同的原則可以套用到其他 Microsoft Office 應用程式的自動化,如 Microsoft Excel。

其他相關資訊

下載範例

AutoWord.exe 包含本文所述的 Visual Basic ActiveX DLL 專案、Word 文件以及網頁。

您可以從「Microsoft 下載中心」下載下列檔案:
Autoword.exe
發行日期:2001 年 4 月 17 日

如需有關如何下載 Microsoft 技術支援檔案的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
119591 如何從線上服務取得 Microsoft 支援檔案
Microsoft 已對這個檔案做過病毒的掃描。Microsoft 是利用發佈當日的最新病毒偵測軟體來掃描檔案,看看有沒有病毒感染。檔案會儲存在安全的伺服器上,以避免任何未經授權的更改。

設定範例

下載 Autoword.exe 之後,請依照這些步驟執行以設定範例:
  1. 在網頁伺服器的虛擬根目錄中,建立命名為 Invoice 的資料夾 (預設的虛擬根目錄為 C:\Inetpub\Wwwroot)。
  2. 將 Autoword.exe 中的檔案解壓縮到 Invoice 資料夾。
  3. 在文字編輯器或 HTML 編輯器中開啟 Autoword1.htm,並以網頁伺服器的名稱取代所有 URL 中 YourWebServer 的參考。同樣地,使用含有 Northwind 範例資料庫的 SQL Server 的名稱,取代連接字串中的 YourSQLServer

    注意:如果您沒有可用且具有 Northwind 範例資料庫的 SQL Server,您可以修改連接字串以改用 Microsoft Access Northwind 範例資料庫。Access Northwind 範例資料庫的連線類似如下:
    sConn = "provider=microsoft.jet.oledb.4.0; data source=" & _
            "C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb"
    					
  4. 在文字編輯器或 HTML 編輯器中開啟 Autoword2.htm,並以網頁伺服器的名稱取代所有 URL 中 YourWebServer 的參考。
  5. 啟動 Internet Explorer。您可以瀏覽 http://YourWebServer/invoice/AutoWord1.htm 與 http://YourWebServer/invoice/AutoWord2.htm 以測試指令碼。當您初次造訪這些網頁時,會收到下載 ActiveX 元件的提示。
下列各節詳細說明範例 Visual Basic ActiveX 元件與指令碼。

Visual Basic ActiveX 元件

此範例中的 Visual Basic ActiveX 元件會與網頁的指令碼互動,以產生使用者要求的訂單發票文件。網頁應用程式可能允許 ActiveX 元件取得已知訂單 ID 的訂單資訊,或者可能選擇將訂單資訊封裝為 XML 並傳送到 ActiveX 元件以進行處理。在上述任一情況中,當元件取得訂單資訊後,即可將 Word 自動化,以建立與顯示訂單的發票文件。

ActiveX 元件 (AutomateWord) 包含單一類別,即 Invoice 類別,此類別包含三種方法:
  • GetData 方法使用 ActiveX Data Objects (ADO),在 Northwind 範例資料庫中擷取訂單資訊。訂單資訊儲存在 m_Data 私用成員變數中。呼叫 GetData 方法,即可讓資料擷取發生於用戶端。
  • SendData 方法使用 Microsoft XML (MSXML),將呼叫者所提供的訂單資訊填入 m_Data 私用成員變數。SendData 需要一個參數,此參數代表訂單資訊的 DOMDocument 物件。呼叫 SendData 方法,即可將訂單資訊從網頁傳送到元件。使用這個方法,您就可以使用 ASP 擷取伺服器端的資料,並提供用戶端可用來產生文件的 XML 資料區。
  • MakeInvoice 方法使用 Word Automation,在 m_Data 私用成員變數中建立包含訂單資訊的文件。儲存在網頁伺服器的文件可以用來當做發票的基礎。呼叫者可以選擇在瀏覽器外部顯示已完成的 Word 文件,或將已完成的文件儲存到磁碟上,以供稍後使用。
Invoice.cls
Option Explicit

Private Type InvoiceData
    OrderID As String
    OrderDate As Date
    CustID As String
    CustInfo As String
    ProdInfo As Variant
End Type

Private m_Data As InvoiceData

Public Sub GetData(sOrderID As Variant, sConn As Variant)

    Dim oConn As Object, oRS As Object
    
    'Connect to the Northwind database.
    Set oConn = CreateObject("ADODB.Connection")
    oConn.Open sConn
    
    'Obtain the Customer ID and Order Date.
    Set oRS = CreateObject("ADODB.Recordset")
    oRS.Open "Select [OrderDate], [CustomerID] from Orders where " & _
             "[OrderID]=" & sOrderID, oConn, 3 'adOpenStatic=3
    m_Data.OrderID = sOrderID
    m_Data.OrderDate = CDate(oRS.Fields("OrderDate").Value)
    m_Data.CustID = oRS.Fields("CustomerID").Value
    oRS.Close
    
    'Obtain Customer information.
    Set oRS = CreateObject("ADODB.Recordset")
    oRS.Open "Select * from Customers Where CustomerID='" & _
             m_Data.CustID & "'", oConn, 3 'adOpenStatic=3
    m_Data.CustInfo = oRS.Fields("CompanyName").Value & vbCrLf & _
                      oRS.Fields("City") & " "
    If Not (IsNull(oRS.Fields("Region"))) Then
       m_Data.CustInfo = m_Data.CustInfo & oRS.Fields("Region").Value & " "
    End If
    m_Data.CustInfo = m_Data.CustInfo & oRS.Fields("PostalCode").Value & _
                      vbCrLf & oRS.Fields("Country").Value
    oRS.Close
    
    'Obtain Product information.
    Set oRS = CreateObject("ADODB.Recordset")
    oRS.Open "Select ProductName, Quantity, [Order Details].UnitPrice," & _
             "Discount from Products Inner Join [Order Details] on " & _
             "Products.ProductID = [Order Details].ProductID " & _
             "Where OrderID = " & sOrderID, oConn, 3 'adOpenStatic=3
    m_Data.ProdInfo = oRS.GetRows
    oRS.Close
    
    'Close the connection to the database.
    oConn.Close

End Sub

Public Sub SendData(oXML As Variant)

    'Extract the information from the DOMDocument object oXML and store
    'it in the private member variable m_Data.

    m_Data.OrderID = oXML.getElementsByTagName("OrderID").Item(0).Text
    m_Data.OrderDate = oXML.getElementsByTagName("OrderDate").Item(0).Text
    m_Data.CustID = oXML.getElementsByTagName("CustID").Item(0).Text
    m_Data.CustInfo = oXML.getElementsByTagName("CustInfo").Item(0).Text
    
    Dim oItems As Object, oItem As Object
    Set oItems = oXML.getElementsByTagName("Items").Item(0)
    ReDim vArray(0 To 3, 0 To oItems.childNodes.Length - 1) As Variant
    Dim i As Integer
    For i = 0 To UBound(vArray, 2)
        Set oItem = oItems.childNodes(i)
        vArray(0, i) = oItem.getAttribute("Desc")
        vArray(1, i) = oItem.getAttribute("Qty")
        vArray(2, i) = oItem.getAttribute("Price")
        vArray(3, i) = oItem.getAttribute("Disc")
    Next
    m_Data.ProdInfo = vArray

End Sub

Public Sub MakeInvoice(sTemplate As Variant, Optional bSave As Variant)
    
    Dim oWord As Object
    Dim oDoc As Object
    Dim oTable As Object
    
    If IsMissing(bSave) Then bSave = False

    'Open the document as read-only.
    Set oWord = CreateObject("Word.Application")
    Set oDoc = oWord.Documents.Open(sTemplate, , True)
    
    'Fill in the bookmarks.
    oDoc.Bookmarks("Customer_Info").Range.Text = m_Data.CustInfo
    oDoc.Bookmarks("Customer_ID").Range.Text = m_Data.CustID
    oDoc.Bookmarks("Order_ID").Range.Text = m_Data.OrderID
    oDoc.Bookmarks("Order_Date").Range.Text = m_Data.OrderDate
    
    'Fill in the table with the product information.
    '** Note that the table starts out with three rows -- the first row
    '   contains headers for the table, the second row is for
    '   the first set of product data, and the third row contains a total.
    '   New rows are added for additional products before the "total row".

    Set oTable = oDoc.Tables(1)
    Dim r As Integer, c As Integer
    For r = 1 To UBound(m_Data.ProdInfo, 2) + 1
        If r > 1 Then oTable.Rows.Add (oTable.Rows(oTable.Rows.Count))
        For c = 1 To 4
            oTable.Cell(r + 1, c).Range.Text = _
               m_Data.ProdInfo(c - 1, r - 1)
        Next
        oTable.Cell(r + 1, 5).Formula _
            "=(B" & r + 1 & "*C" & r + 1 & ")*(1-D" & r + 1 & ")", _
            "#,##0.00"
    Next

    'Update the field for the grand total and protect the document.
    oTable.Cell(oTable.Rows.Count, 5).Range.Fields.Update
    oDoc.Protect 1 'wdAllowOnlyComments=1
        
    If bSave Then
        'Save the document as "c:\invoice.doc" and quit Word.
        Dim nResult As Long
        nResult = MsgBox("Are you sure you wish to create the document" & _
             " ""c:\invoice.doc""? If this document already exists, " & _
             "it will be replaced", vbYesNo, "AutomateWord")
        If nResult = vbYes Then oDoc.SaveAs "c:\invoice.doc"
        oDoc.Close False
        oWord.Quit
    Else
        'Make Word visible.
        oWord.Visible = True
    End If
    
End Sub
				

從網頁使用 ActiveX 元件

Autoword1.htm 說明如何使用 GetData 方法,使 ActiveX 元件擷取用戶端的訂單資料並建立文件。

Autoword1.htm
<HTML>
<HEAD>
   <OBJECT ID="AutoWord"
    CLASSID="CLSID:32646EBA-0919-4C2F-94D6-599F46DC34F2"
    CODEBASE="http://YourWebServer/invoice/package/AutomateWord.CAB#version=1,0,0,0">
   </OBJECT>
</HEAD>
<BODY>
Enter an order id between 10248 and 11077 and click the button to view the invoice for the order:
<P/><INPUT TYPE="text" VALUE="10500" ID="OrderID">
<P/><BUTTON ID="InvoiceButton">Create Invoice</BUTTON>
</BODY>

<SCRIPT Language="VBScript">

   Function InvoiceButton_OnClick()
      Dim sConn
      sConn = "Provider=sqloledb;Data Source=YourSQLServer;Initial Catalog=Northwind;UID=sa;"
      AutoWord.GetData OrderID.Value, sConn
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc"
   End Function

</SCRIPT>
</HTML>
				
Autoword1.htm 中的指令碼使用 ActiveX 元件在瀏覽器外部顯示已完成的文件。您也可以選擇儲存已完成的文件並在瀏覽器中顯示該文件,然而,這麼做需要將 Word 文件儲存到磁碟上。此元件可以將文件另存為 C:\Invoice.doc 並儲存在用戶端的本機磁碟機上。由於 ActiveX 元件標示成可處理指令碼,因此用戶端會收到確認儲存的提示。

如果您想要在瀏覽器中顯示已完成的文件,請將 Autoword1.htm 中的 MakeInvoice 呼叫變更如下:
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc", True
      window.navigate "c:\invoice.doc"
				
Autoword2.htm 說明如何使用 SendData 方法,將訂單資料當做 DOMDocument 物件傳送到 ActiveX 元件,以產生已完成的文件。DOMDocument 是由位於網頁上的 XML 資料區所建立。如果要使 ActiveX 元件正確地處理呼叫者所傳送的訂單資訊,必須建立語式正確且結構良好的 XML,如此,元件才能將 XML 解譯為訂單資訊。

Autoword2.htm
<HTML>
<HEAD>
   <OBJECT ID="AutoWord"
    CLASSID="CLSID:32646EBA-0919-4C2F-94D6-599F46DC34F2"
    CODEBASE="http://YourWebServer/invoice/package/AutomateWord.CAB#version=1,0,0,0">
   </OBJECT>
</HEAD>
<BODY>
   <BUTTON ID="InvoiceButton">Create Invoice</BUTTON>
   <XML ID="DataXML">
     <Order>
        <OrderID>10700</OrderID>
        <OrderDate>10/10/2000</OrderDate>
        <CustID>SAVEA</CustID>
        <CustInfo>Save-a-lot
Markets Boise ID 83720
USA</CustInfo>
        <Items>
           <Product Desc="Chai" Qty="5" Price="18" Disc="0.2"/>
           <Product Desc="Sasquatch Ale" Qty="12" Price="14" Disc="0.2"/>
           <Product Desc="Scottish Longbreads" Qty="40" Price="12.5" Disc="0.2"/>
           <Product Desc="Flotemysost" Qty="60" Price="21.5" Disc="0.2"/>
        </Items>        
     </Order>
   </XML>
</BODY>

<SCRIPT Language="VBScript">
  
   Function InvoiceButton_OnClick()
      AutoWord.SendData DataXML.XMLDocument
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc"
   End Function

</SCRIPT>
</HTML>
				
在 Autoword1.htm 和 Autoword2.htm 中,您應該會發現 ActiveX 元件是由 <OBJECT> 標記執行個體化,而非 CreateObject 函式。使用 <OBJECT> 標記的目的在於,讓尚未安裝元件的使用者可以自動下載 ActiveX 元件。如果使用者造訪其中一個網頁,但未安裝元件,則元件會從 CODEBASE 屬性所指定 URL 的封包檔 (CAB) 下載。視 Internet Explorer 中的使用者安全性設定而定,使用者可能會先收到確認下載的提示。

注意:隨附於 Autoword.exe 的 CAB 檔案是由 Visual Basic 的「封裝暨部署精靈」(Package and Deployment Wizard) 所建立。封裝內的 ActiveX 元件已標示成可處理指令碼與初始化,但未經過數位簽署。

如需有關建立網際網路元件下載、數位簽署以及將元件標示成可處理指令碼與初始化的詳細資訊,請參閱下列 Microsoft Developer Network (MSDN) 網站:
使用 Authenticode 簽署和檢查程式碼 (英文)
http://msdn.microsoft.com/workshop/security/authcode/signing.asp

ActiveX 控制項的安全初始化和指令碼處理 (英文)
http://msdn.microsoft.com/workshop/components/activex/safety.asp

?考

如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
257757 Office 伺服器端自動化的考量
270906 HOWTO:使用 ASP 產生 RTF 格式的文件,以便在 Microsoft Word 中使用
(c) Microsoft Corporation 2001. All Rights Reserved.本文內容由 Lori B. Turner, Microsoft Corporation 提供。

屬性

文章編號: 286023 - 上次校閱: 2006年5月25日 - 版次: 10.0
這篇文章中的資訊適用於:
  • Microsoft Word 2000 Standard Edition
  • Visual Basic Scripting 版 5.0
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.01
  • Microsoft Internet Explorer 5.5
  • Microsoft Word 2002 Standard Edition
  • Microsoft Office Word 2003
關鍵字:?
kbdownload kbautomation kbhowto KB286023
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com