Dieser Artikel beschreibt, wie Sie eine ActiveX-Komponente für die clientseitige Automatisierung von Word von einer Webseite aus verwenden können, die in Internet Explorer angezeigt wird. Die Verwendung einer ActiveX-Komponente von einer Webseite aus hat viele Vorteile gegenüber einem Skript, das in die Webseite selbst eingebettet ist:
- Wenn Sie bereits über Visual Basic-Code verfügen, der Microsoft Word automatisiert, können Sie diesen Code im Browser wieder verwenden, indem Sie Ihr Visual Basic-Projekt entweder in eine ActiveX-EXE oder eine ActiveX-DLL umwandeln.
- Word ist nicht als sicher für Skripting markiert. Je nach den Sicherheitseinstellungen in Internet Explorer wird Automatisierungscode für Word in Skripts möglicherweise nicht ausgeführt, oder dem Benutzer wird eine Sicherheitswarnung angezeigt. Wenn Ihre ActiveX-Komponente bestimmte Richtlinien erfüllt, kann sie als sicher für Skripting markiert werden, um solche Sicherheitsprobleme zu verhindern.
- Visual Basic verfügt über mehrere Features, die Sie nicht mit einem Skript auf einer Webseite verwenden können. Ein Feature, das beispielsweise für Visual Basic, jedoch nicht für ein Webseitenskript verfügbar ist, ist die Möglichkeit, die Windows-API (Application Programming Interface) aufzurufen.
Ein häufiges Entwicklerszenario besteht darin, dass Benutzern eine Webseitenoberfläche zur Erstellung eines Word-Dokuments mithilfe von Daten aus einer externen Quelle oder Logik präsentiert wird. Obwohl Sie die serverseitige Word-Automatisierung verwenden können, um das Dokument zu erstellen und es zurück an den Client zu übertragen, gibt es viele Nachteile im Hinblick auf die Verwendung eines serverseitigen Ansatzes mit der Word-Automatisierung. Der Hauptnachteil ist die Skalierbarkeit. Word ist ein sehr ressourcenintensiver Automatisierungsserver und eignet sich nicht für die Dokumenterstellung auf dem Webserver.
Durch Verwendung einer ActiveX-Komponente zur Durchführung der Dokumenterstellung auf dem Client können Sie die ressourcenintensive Word-Automatisierung von dem Webserver verlagern. Um diese Lösung geht es bei der Beispiel-ActiveX-Komponente, die in diesem Artikel erläutert wird. Obwohl sich das Beispiel mit der Word-Automatisierung befasst, gelten die gleichen Grundsätze auch für die Automatisierung anderer Microsoft Office-Anwendungen wie Microsoft Excel.
Herunterladen des Beispiels
"AutoWord.exe" enthält das Visual Basic-ActiveX-DLL-Projekt, das Word-Dokument und die Webseiten, die in diesem Artikel beschrieben werden.
Die folgende Datei steht im Microsoft Download Center zum Download zur Verfügung:
Autoword.exe
(http://download.microsoft.com/download/word2002/sample/1.0/win98mexp/en-us/autoword.exe)
Freigabedatum: 17.04.2001
Weitere Informationen über das Herunterladen von Microsoft Support-Dateien finden Sie im folgenden Artikel der Microsoft Knowledge Base:
119591
(http://support.microsoft.com/kb/119591/DE/
)
So erhalten Sie Microsoft Support-Dateien im Internet
Microsoft hat diese Datei auf Viren überprüft. Microsoft hat dazu die neueste Software zur Virenerkennung verwendet, die zum Zeitpunkt der Bereitstellung verfügbar war. Die Datei befindet sich auf Servern mit verstärkter Sicherheit, wodurch nicht autorisierte Änderungen an der Datei weitestgehend verhindert werden.
Einrichten des Beispiels
Nachdem Sie die Datei "Autoword.exe" heruntergeladen haben, gehen Sie folgendermaßen vor, um das Beispiel einzurichten.
- Erstellen Sie einen Ordner mit dem Namen "Invoice" im virtuellen Stammverzeichnis Ihres Webservers. (Das standardmäßige virtuelle Stammverzeichnis ist C:\Inetpub\Wwwroot.)
- Extrahieren Sie die Dateien in "Autoword.exe" in den Ordner "Invoice".
- Öffnen Sie "Autoword1.htm" in einem Text- oder HTML-Editor, und ersetzen Sie die Verweise auf IhrenWebserver in allen URLs durch den Namen Ihres Webservers. Ersetzen Sie auch IhrSQLServer in der Verbindungszeichenfolge durch den Namen Ihres SQL Servers, der die Beispieldatenbank "Nordwind" enthält.
Hinweis: Wenn Sie keinen SQL Server mit der Nordwind-Beispieldatenbank verfügbar haben, können Sie die Verbindungszeichenfolge so ändern, dass stattdessen die Nordwind-Beispieldatenbank von Microsoft Access verwendet wird. Eine Verbindung mit der Nordwind-Beispieldatenbank von Access sieht folgendermaßen aus:
sConn = "provider=microsoft.jet.oledb.4.0; data source=" & _
"C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb"
- Öffnen Sie "Autoword2.htm" in einem Text- oder HTML-Editor, und ersetzen Sie die Verweise auf IhrenWebserver in allen URLs durch den Namen Ihres Webservers.
- Starten Sie Internet Explorer. Öffnen Sie die Seite "http://IhrWebserver/invoice/AutoWord1.htm" und http://IhrWebserver/Rechnung/AutoWord2.htm", um das Skript zu testen. Wenn Sie eine dieser Seiten zum ersten Mal aufrufen, werden Sie aufgefordert, die ActiveX-Komponente herunterzuladen.
Die Visual Basic-ActiveX-Beispielkomponente und das Skript werden in den folgenden Abschnitten ausführlich beschrieben.
Visual Basic-ActiveX-Komponente
Die Visual Basic-ActiveX-Beispielkomponente in diesem Beispiel interagiert mit dem Webseitenskript, um auf Anforderung des Benutzers ein Rechnungsdokument zu erstellen. Die Webanwendung kann der ActiveX-Komponente erlauben, die Auftragsinformationen für eine bestimmte Auftragsnummer abzurufen, oder die Webanwendung kann die Auftragsinformationen als XML-Code verpacken und diesen zur Verarbeitung an die ActiveX-Komponente senden. In beiden Fällen kann die Komponente, nachdem sie die Auftragsinformationen erhalten hat, Word so automatisieren, dass das Rechnungsdokument für den Auftrag erstellt und angezeigt wird.
Die ActiveX-Komponente (
AutomateWord) enthält eine einzige Klasse, die Klasse
Invoice, die drei Methoden umfasst:
- Die GetData-Methode verwendet ActiveX Data Objects (ADO), um Informationen zu einem Auftrag in der Nordwind-Beispieldatenbank zu extrahieren. Die Auftragsinformationen sind in der privaten Membervariablen m_Data gespeichert. Die GetData-Methode kann aufgerufen werden, damit die Datenextraktion clientseitig erfolgt.
- Die SendData-Methode verwendet Microsoft XML (MSXML), um die private Membervariable m_Data mit den von dem Aufrufer bereitgestellten Auftragsinformationen aufzufüllen. SendData erwartet für die Auftragsinformationen einen Parameter, der ein DOMDocument-Objekt darstellt. Die SendData-Methode kann aufgerufen werden, damit die Auftragsinformationen von der Webseite an die Komponente gesendet werden. Bei diesem Ansatz können Sie ASP verwenden, um die Daten serverseitig zu extrahieren und dem Client eine XML-Dateninsel zu präsentieren, die für die Dokument erstellt verwendet werden kann.
- Die MakeInvoice-Methode verwendet die Word-Automatisierung, um ein Dokument zu erstellen, das die Auftragsinformationen in der privaten Membervariablen m_Data enthält. Ein Dokument, das auf dem Webserver gespeichert ist, wird als Ausgangspunkt für die Rechnung verwendet. Der Aufrufer kann das fertige Word-Dokument außerhalb des Browsers anzeigen oder das fertige Dokument speichern, um es später zu verwenden.
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
Verwenden der ActiveX-Komponente von einer Webseite
"Autoword1.htm" zeigt, wie Sie die
GetData-Methode verwenden können, damit die ActiveX-Komponente die Auftragsdaten clientseitig abrufen und das Dokument erstellen kann.
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>
Das Skript in "Autoword1.htm" verwendet die ActiveX-Komponente, um das fertige Dokument außerhalb des Browsers anzuzeigen. Sie können das fertige Dokument auch speichern und es im Browser anzeigen. Hierfür muss das Word-Dokument allerdings auf einen Datenträger gespeichert werden. Die Komponente kann das Dokument als "C:\Invoice.doc" auf der lokalen Festplatte des Clients speichern. Da die ActiveX-Komponente als sicher für Skripting markiert ist, wird der Client aufgefordert, das Speichern zu bestätigen.
Wenn Sie das fertige Dokument im Browser anzeigen möchten, ändern Sie den Aufruf von
MakeInvoice in "Autoword1.htm" folgendermaßen:
AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc", True
window.navigate "c:\invoice.doc"
"Autoword2.htm" zeigt, wie Sie die
SendData-Methode verwenden können, um die Auftragsdaten als
DOMDocument-Objekt an die ActiveX-Komponente zur Erstellung des fertigen Dokuments zu senden. Das
DOMDocument-Objekt wird aus einer XML-Dateninsel erstellt, die sich auf der Webseite befindet. Damit die ActiveX-Komponente die Auftragsinformationen, die von dem Aufrufer gesendet werden, korrekt verarbeitet, muss der XML-Code wohl geformt und so strukturiert sein, dass die Komponente diesen als Auftragsinformationen interpretiert.
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>
Sowohl in "Autoword1.htm" als auch in "Autoword2.htm" wird die ActiveX-Komponente durch ein <OBJECT>-Tag instanziiert und nicht durch die
CreateObject-Funktion. Der Zweck der Verwendung des <OBJECT>-Tags besteht darin, den automatischen Download der ActiveX-Komponente für Benutzer zu aktivieren, die die Komponente noch nicht installiert haben. Wenn ein Benutzer eine dieser Seiten besucht und die Komponente nicht installiert ist, wird die Komponente aus der CAB-Datei von dem URL heruntergeladen, der in dem
CODEBASE-Attribut angegeben ist. Je nach den Sicherheitseinstellungen des Benutzers in Internet Explorer wird möglicherweise zuerst eine Aufforderung zur Bestätigung des Downloads angezeigt.
Hinweis: Die CAB-Datei, die in "Autoword.exe" enthalten ist, wurde mit dem Paket- und Weitergabe-Assistenten von Visual Basic erstellt. Die ActiveX-Komponente in dem Paket ist als sicher für Skripting und die Initialisierung markiert, ist jedoch nicht digital signiert.
Weitere Informationen zum Erstellen von Downloads von Internet-Komponenten, zur digitalen Signierung und zum Markieren von Komponenten als sicher für Skripting und Initialisierung finden Sie auf den folgenden MSDN-Websites (Microsoft Developer Network):
Weitere Informationen finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:
257757
(http://support.microsoft.com/kb/257757/DE/
)
INFO: Was bei der serverseitigen Automatisierung von Office zu beachten ist
270906
(http://support.microsoft.com/kb/270906/DE/
)
Wie Verwenden von ASP zu dem Generieren eines RTF-Dokuments in Stream zu Microsoft Word
(c) Microsoft Corporation 2001, Alle Rechte vorbehalten. Beiträge von Lori B. Turner, Microsoft Corporation.