Použití komponenty ActiveX VB pro automatizaci Wordu z Internet Exploreru

Souhrn

Tento článek ukazuje, jak můžete použít komponentu ActiveX pro automatizaci aplikace Word na straně klienta z webové stránky, která je vykreslená v aplikaci Internet Explorer. Použití komponenty ActiveX z webové stránky místo skriptu vloženého do samotné webové stránky má několik výhod:

  • Pokud již máte kód jazyka Visual Basic, který automatizuje aplikaci Microsoft Word, můžete kód znovu použít v prohlížeči převodem projektu jazyka Visual Basic na activex exe nebo activex dll.
  • Word není označený jako bezpečný pro skriptování. V závislosti na nastavení zabezpečení v Internet Exploreru se nemusí spustit kód služby Word Automation ve skriptu nebo se uživateli může zobrazit výzva s upozorněním zabezpečení. Za předpokladu, že vaše komponenta ActiveX splňuje určité pokyny, může být označena jako bezpečná pro skriptování, aby se zabránilo těmto problémům se zabezpečením.
  • Visual Basic má několik funkcí, které nelze použít se skriptem na webové stránce. Jednou z funkcí, která je dostupná pro Visual Basic, ale ne pro skript webové stránky, je například možnost volat rozhraní API (Application Programming Interface) pro Windows.

Běžným scénářem pro vývojáře je prezentovat uživatelům rozhraní webové stránky pro vytvoření wordového dokumentu pomocí dat z nějakého externího zdroje nebo logiky. I když můžete k vygenerování dokumentu a streamování dokumentu zpět do klienta použít automatizaci na straně serveru, existuje mnoho nevýhod použití přístupu na straně serveru, který zahrnuje automatizaci Wordu. Primární nevýhodou je škálovatelnost; Word je server Automation náročný na prostředky a nedoporučuje se pro generování dokumentů na webovém serveru.

Pomocí komponenty ActiveX k vytvoření dokumentu v klientovi můžete přesunout službu Word Automation náročnou na prostředky mimo webový server. Toto je řešení, které představuje ukázková komponenta ActiveX, která je popsána v tomto článku. I když je ukázka specifická pro automatizaci Wordu, pro automatizaci jiných aplikací Microsoft Office, jako je Microsoft Excel, se můžou použít stejné principy.

Další informace

Komponenta ActiveX jazyka Visual Basic

Komponenta ActiveX jazyka Visual Basic v této ukázce komunikuje se skriptem webové stránky a generuje dokument faktury objednávky na žádost uživatele. Webová aplikace může komponentě ActiveX umožnit získání informací o objednávce pro dané ID objednávky nebo se webová aplikace může rozhodnout zabalit informace o objednávce jako XML a odeslat je komponentě ActiveX ke zpracování. V obou případech může komponenta po získání informací o objednávce automatizovat Word tak, aby sestaví a zobrazí dokument faktury pro objednávku.

Komponenta ActiveX (AutomateWord) obsahuje jednu třídu Invoice, která zveřejňuje tři metody:

  • GetData Metoda používá ActiveX Data Objects (ADO) extrahovat informace o pořadí v ukázkové databázi Northwind. Informace o objednávce jsou uloženy v m_Data privátní členské proměnné. GetData Lze volat metodu, která umožní extrakci dat dojít na straně klienta.
  • SendData Metoda používá Microsoft XML (MSXML) vyplnit m_Data soukromé členské proměnné s informacemi o pořadí, které jsou poskytovány volajícím. Funkce SendData očekává jeden parametr, který představuje objekt DOMDocument pro informace o objednávce. Metodu SendData lze volat k odeslání informací o objednávce z webové stránky do komponenty. Pomocí tohoto přístupu můžete pomocí ASP extrahovat stranu datového serveru a prezentovat klienta s datovým ostrůvkem XML, který lze použít pro generování dokumentu.
  • MakeInvoice Metoda používá Word Automation k vytvoření dokumentu, který obsahuje informace o pořadí v m_Data soukromé členské proměnné. Dokument, který je uložený na webovém serveru, se používá jako výchozí bod pro fakturu. Volající může zvolit zobrazení dokončeného wordového dokumentu mimo prohlížeč nebo uložení dokončeného dokumentu na disk pro pozdější použití.

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

Použití komponenty ActiveX z webové stránky

Autoword1.htm ukazuje, jak můžete použít GetData metoda nechat komponentu ActiveX načíst data objednávky na straně klienta a sestavit dokument.

Autoword1.htm

<HTML>
<HEAD>
   <OBJECT ID="AutoWord"
    CLASSID="CLSID:32646EBA-0919-4C2F-94D6-599F46DC34F2"
    CODEBASE="https://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 "https://YourWebServer/invoice/invoice.doc"
   End Function

</SCRIPT>
</HTML>

Skript v Autoword1.htm používá komponentu ActiveX k zobrazení dokončeného dokumentu mimo prohlížeč. Můžete se také rozhodnout uložit dokončený dokument a zobrazit ho v prohlížeči. To ale vyžaduje, aby se wordový dokument uložil na disk. Komponenta může dokument uložit jako C:\Invoice.doc na místní disk klienta. Protože je komponenta ActiveX označená jako bezpečná pro skriptování, zobrazí se klientovi výzva k potvrzení uložení.

Pokud chcete zobrazit dokončený dokument v prohlížeči, změňte volání na MakeInvoice v Autoword1.htm na následující:

      AutoWord.MakeInvoice "https://YourWebServer/invoice/invoice.doc", True
      window.navigate "c:\invoice.doc"

Autoword2.htm ukazuje, jak lze použít SendData metoda odeslat data objednávky jako DOMDocument objekt do komponenty ActiveX pro generování dokončeného dokumentu. DomDocument je vytvořen z datového ostrůvku XML, který se nachází na webové stránce. Aby komponenta ActiveX správně zpracovala informace o objednávce odesílané volajícím, musí být XML ve správném formátu a strukturovaný, aby ji komponenta mohla interpretovat jako informace o objednávce.

Autoword2.htm

<HTML>
<HEAD>
   <OBJECT ID="AutoWord"
    CLASSID="CLSID:32646EBA-0919-4C2F-94D6-599F46DC34F2"
    CODEBASE="https://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 "https://YourWebServer/invoice/invoice.doc"
   End Function

</SCRIPT>
</HTML>

V Autoword1.htm i Autoword2.htm byste si měli uvědomit, že komponenta ActiveX je vytvořena prostřednictvím značky místo funkce CreateObject. Účelem použití značky je povolit automatické stahování komponenty ActiveX pro uživatele, u kterých ještě není komponenta nainstalovaná. Pokud uživatel navštíví některou z těchto stránek a komponenta není nainstalována, komponenta se stáhne ze souboru CAB (CAB) na adrese URL, která je uvedena v atributu CODEBASE. V závislosti na nastavení zabezpečení uživatele v Internet Exploreru se jim může nejdřív zobrazit výzva k potvrzení stahování.

Poznámka: Soubor CAB, který je součástí Autoword.exe byl vytvořen pomocí průvodce balíček a nasazení pro Visual Basic. Komponenta ActiveX v balíčku je označena jako bezpečná pro skriptování a inicializaci, ale není digitálně podepsaná.

Další informace o vytváření stahování internetových komponent, digitálního podepisování a označování komponent jako bezpečných pro skriptování a inicializaci najdete na následujících webech MSDN (Microsoft Developer Network):

Podepisování a kontrola kódu pomocí Authenticode https://msdn.microsoft.com/en-us/library/ms537364.aspx

Bezpečná inicializace a skriptování pro ovládací prvky ActiveX https://msdn.microsoft.com/en-us/library/Aa751977.aspx

Odkazy

Další informace získáte v následujících článcích znalostní báze Microsoft Knowledge Base:

257757 INFORMACE: Automatizace Office pro bezobslužné spuštění se nedoporučuje ani nepodporuje

(c) Microsoft Corporation 2001, Všechna práva vyhrazena. Příspěvky lori B. Turner, Microsoft Corporation.