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.