Een ActiveX-component van VB gebruiken voor het automatiseren van Word vanuit Internet Explorer

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 286023 - Bekijk de producten waarop dit artikel van toepassing is.
Dit artikel is eerder gepubliceerd onder NL286023
Alles uitklappen | Alles samenvouwen

Op deze pagina

Samenvatting

In dit artikel wordt beschreven hoe u een ActiveX-component kunt gebruiken voor het automatiseren van Word op de client vanuit een webpagina die wordt weergegeven in Internet Explorer. Het gebruik van een ActiveX-component vanuit een webpage biedt verschillende voordelen boven het gebruik van script dat is ingesloten in de webpagina:
  • Als u al beschikt over Visual Basic-programmacode voor het automatiseren van Microsoft Word, kunt u deze programmacode opnieuw gebruiken in de browser. U hoeft hiervoor uw Visual Basic-project slechts te converteren naar een EXE- of DLL-bestand van ActiveX.
  • Word is niet als veilig aangemerkt voor scriptgebruik. Afhankelijk van de beveiligingsinstellingen in Internet Explorer is het dan ook mogelijk dat de scriptprogrammacode voor automatisering in Word niet wordt uitgevoerd of dat een beveiligingswaarschuwing wordt weergegeven. Ervan uitgaande dat uw ActiveX-component voldoet aan verschillende richtlijnen, wordt deze gemarkeerd als veilig voor scriptgebruik zodat u deze beveiligingsproblemen kunt voorkomen.
  • Visual Basic kent een aantal functies die niet kunnen worden gebruikt in script in een webpagina. Een van deze functies die wel beschikbaar zijn voor Visual Basic maar niet voor script in een webpagina, is bijvoorbeeld de mogelijkheid om de Windows-API (Application Programming Interface) aan te roepen.
Een veelvoorkomend scenario voor ontwikkelaars is het definiëren van een webpagina-interface voor het maken van een Word-document met gebruikmaking van gegevens van een externe bron of functie. Met automatisering van Word op de server zou u een document kunnen maken om dat vervolgens naar de client terug te sturen. Het gebruik van een serverbenadering met automatisering van Word kent echter tal van nadelen. Het belangrijkste nadeel is schaalbaarheid. Omdat Word een automatiseringsserver is die bijzonder veel systeembronnen gebruikt, wordt het programma dan ook niet aanbevolen voor het maken van documenten op de webserver.

Door een ActiveX-component te gebruiken om het maken van documenten uit te voeren op de client, kunt u de bronintensieve Word-automatisering weghalen bij de webserver. Dit is de oplossing die wordt geboden in het voorbeeld van een ActiveX-component dat in dit artikel wordt gegeven. Hoewel het voorbeeld betrekking heeft op automatisering in Word, kunnen dezelfde principes worden toegepast voor het automatiseren van andere Microsoft Office-toepassingen, zoals Microsoft Excel.

Meer informatie

Het programmeervoorbeeld downloaden

AutoWord.exe bevat het ActiveX DLL-project van Visual Basic, het Word-document en de webpagina's die in dit artikel worden beschreven.

U kunt het volgende bestand downloaden van het Microsoft Downloadcentrum:
Autoword.exe
Releasedatum: 17 april 2001

Voor meer informatie over het downloaden van Microsoft-ondersteuningsbestanden klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:
119591Microsoft-ondersteuningsbestanden downloaden van online services
Microsoft heeft dit bestand op virussen gecontroleerd. Hiervoor is de meest actuele software voor virusdetectie gebruikt die beschikbaar was op de datum dat het bestand werd gepubliceerd. Het bestand is ondergebracht op beveiligde servers die onbevoegde wijzigingen aan het bestand helpen verhinderen.

Stel het voorbeeld in

Nadat u Autoword.exe hebt gedownload, gaat u als volgt te werk om het voorbeeld in te stellen:
  1. Maak een map met de naam Factuur in de virtuele hoofdmap van uw webserver. (Standaard is de virtuele hoofdmap de map C:\Inetpub\Wwwroot.)
  2. Pak de bestanden in Autoword.exe uit naar de map Factuur.
  3. Open Autoword1.htm in een teksteditor of HTML-editor en vervang verwijzingen naar UwWebServer in alle URL's door de naam van uw webserver. Vervang tevens UwSQLServer in de verbindingstekenreeks door de naam van uw SQL Server-computer met de voorbeelddatabase Noordenwind.

    Opmerking Als u niet beschikt over een SQL Server-computer met de voorbeelddatabase Noordenwind, kunt u de verbindingstekenreeks zodanig wijzigen dat in plaats hiervan de voorbeelddatabase Noordenwind van Microsoft Access wordt gebruikt. Een verbinding met de voorbeelddatabase Noordenwind van Access ziet er als volgt uit:
    sConn = "provider=microsoft.jet.oledb.4.0; data source=" & _
            "C:\Program Files\Microsoft Office\Office10\Samples\Noordenwind.mdb"
    					
  4. Open Autoword2.htm in een teksteditor of HTML-editor en vervang verwijzingen naar UwWebServer in alle URL's door de naam van uw webserver.
  5. Start Internet Explorer. U kunt naar http://UwWebserver/factuur/AutoWord1.htm en http://UwWebserver/factuur/AutoWord2.htm gaan om het script te testen. Wanneer u een van deze pagina's voor de eerste keer opent, wordt u gevraagd de ActiveX-component te downloaden.
In de volgende secties worden het voorbeeld van een ActiveX-component van Visual Basic en het script uitvoeriger besproken.

ActiveX-component van Visual Basic

De ActiveX-component van Visual Basic in dit voorbeeld maakt in samenwerking met het webpaginascript een factuurdocument voor een bestelling op verzoek van de gebruiker. De webtoepassing kan de ActiveX-component de bestelgegevens laten ophalen voor een bepaald bestelnummer, of de webtoepassing kan zelf de bestelgegevens samenvoegen naar XML en deze naar de ActiveX-component sturen voor verdere verwerking. In beide gevallen zorgt de component ervoor, nadat deze de bestelgegevens heeft verkregen, dat Word het factuurdocument voor de bestelling automatisch samenstelt en weergeeft.

De ActiveX-component (AutomateWord) bevat één klasse, de klasse Invoice, die drie verschillende methoden kent:
  • De methode GetData maakt gebruik van ActiveX Data Objects (ADO) om informatie op te halen voor een bestelling in de voorbeelddatabase Noordenwind. De bestelgegevens worden opgeslagen in de lidvariabele m_Data van het type Privé. Als u de methode GetData aanroept, vindt het ophalen van de gegevens plaats op de client.
  • De methode SendData maakt gebruik van Microsoft XML (MSXML) om de bestelgegevens die door de aanroepende functie zijn geleverd, in de lidvariabele m_Data van het type Privé te plaatsen. SendData verwacht één parameter in de vorm van een DOMDocument-object voor de bestelgegevens. De methode SendData kan worden aangeroepen om de bestelgegevens te verzenden van de webpagina naar de component. Bij deze methode kan ASP worden gebruikt om de gegevens op te halen vanaf de server en een XML-gegevensblok te leveren aan de client waarmee het document kan worden samengesteld.
  • In de methode MakeInvoice wordt automatisering in Word gebruikt om een document samen te stellen dat de bestelgegevens bevat in de privélidvariabele m_Data. Als uitgangspunt voor de factuur wordt een document gebruikt dat is opgeslagen op de webserver. De aanroepende partij kan het voltooide Word-document buiten de browser laten weergeven of het document opslaan op schijf voor later gebruik.
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
    
    'Verbinding tot stand brengen met de Noordenwind-database.
    Set oConn = CreateObject("ADODB.Connection")
    oConn.Open sConn
    
    'Het klantnummer en de besteldatum ophalen.
    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
    
    'Klantgegevens ophalen.
    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
    
    'Productgegevens ophalen.
    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
    
    'De verbinding met de database sluiten.
    oConn.Close

End Sub

Public Sub SendData(oXML As Variant)

    'Gegevens ophalen uit het DOMDocument-object oXML en deze opslaan
    'in de privélidvariabele 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

    'Het document openen als Alleen-lezen.
    Set oWord = CreateObject("Word.Application")
    Set oDoc = oWord.Documents.Open(sTemplate, , True)
    
    'De bladwijzers invullen.
    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
    
    'De productgegevens invullen in de tabel.
    '** In het begin heeft de tabel drie rijen ? de eerste rij
    '   bevat koppen voor de tabel, de tweede rij is bedoeld
    '   voor de eerste reeks productgegevens en de derde rij bevat een totaal.
    '   Nieuwe rijen voor extra producten worden ingevoegd voor de "totaalrij".

    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

    'Het veld voor het eindtotaal bijwerken en het document beveiligen.
    oTable.Cell(oTable.Rows.Count, 5).Range.Fields.Update
    oDoc.Protect 1 'wdAllowOnlyComments=1
        
    If bSave Then
        'Het document opslaan als 'c:\invoice.doc' en Word afsluiten.
        Dim nResult As Long
        nResult = MsgBox("Weet u zeker dat u het document" & _
             " ""c:\invoice.doc wilt maken""? Als dit document al bestaat, " & _
             "wordt het vervangen", vbYesNo, "AutomateWord")
        If nResult = vbYes Then oDoc.SaveAs "c:\invoice.doc"
        oDoc.Close False
        oWord.Quit
    Else
        'Maak Word zichtbaar.
        oWord.Visible = True
    End If
    
End Sub
				

De ActiveX-component gebruiken vanuit een webpagina

In Autoword1.htm wordt aangegeven hoe u de methode GetData kunt gebruiken om de bestelgegevens op de client op te laten halen door de ActiveX-component en het document samen te laten stellen.

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>
Geef een bestelnummer op tussen  10248 en 11077 en klik op de knop om de factuur voor de bestelling te zien:
<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>
				
Het script in Autoword1.htm maakt gebruik van de ActiveX-component om het voltooide document buiten de browser weer te geven. Het voltooide document kan ook worden opgeslagen en in de browser worden weergegeven. Hiervoor moet het Word-document wel worden opgeslagen op schijf. De component kan het document opslaan als C:\Invoice.doc op het lokale station van de client. Omdat de ActiveX-component is gemarkeerd als veilig voor scriptgebruik, wordt de client gevraagd het opslaan te bevestigen.

Als u het voltooide document wilt weergeven in de browser, wijzigt u de aanroep van MakeInvoice in Autoword1.htm in de volgende tekst:
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc", True
      window.navigate "c:\invoice.doc"
				
In Autoword2.htm wordt aangegeven hoe u de methode SendData kunt gebruiken om de bestelgegevens als DOMDocument-object te verzenden naar de ActiveX-component voor het samenstellen van het uiteindelijke document. Het DOMDocument wordt samengesteld aan de hand van een XML-gegevensblok op de webpagina. De XML-code moet de juiste syntaxis en structuur hebben, anders kan de ActiveX-component de gegevens die zijn doorgegeven door de aanroepende partij, niet interpreteren als bestelgegevens en deze niet verder verwerken.

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>
				
Zowel voor Autoword1.htm als voor Autoword2.htm geldt dat instantievorming van de ActiveX-component plaatsvindt via een <OBJECT>-code en niet via de functie CreateObject. De <OBJECT>-code bedoeld om het automatisch downloaden van de ActiveX-component mogelijk te maken voor gebruikers die de component nog niet geïnstalleerd hebben. Als een gebruiker een van deze pagina's bezoekt en de component is niet geïnstalleerd, wordt de component gedownload vanuit het cabinetbestand (.CAB-bestand) op de URL die is aangegeven in het kenmerk CODEBASE. Afhankelijk van de beveiligingsinstellingen van de gebruiker in Internet Explorer is het mogelijk dat eerst gevraagd wordt het downloaden te bevestigen.

Opmerking het .CAB-bestand in Autoword.exe is gemaakt met de Package and Deployment Wizard van Visual Basic. De ActiveX-component in het pakket is aangegeven als veilig voor scriptgebruik en initialisatie, maar is niet digitaal ondertekend.

Zie de volgende Microsoft Developer Network (MSDN)-websites voor meer informatie over het maken van downloadpakketten met Internet-componenten, het digitaal ondertekenen en het markeren van componenten als veilig voor scriptgebruik en initialisatie:
Signing and Checking Code with Authenticode
http://msdn.microsoft.com/workshop/security/authcode/signing.asp

Safe Initialization and Scripting for ActiveX Controls
http://msdn.microsoft.com/workshop/components/activex/safety.asp

Referenties

Voor meer informatie klikt u op de volgende artikelnummers in de Microsoft Knowledge Base:
257757INFO: Automatisering van Office voor uitvoering zonder toezicht wordt niet aanbevolen of ondersteund
270906ASP gebruiken om een RTF-document te genereren om dit stroomsgewijs naar Microsoft Word te verzenden
(c) Microsoft Corporation 2001. Alle rechten voorbehouden. Bijdragen: Lori B. Turner, Microsoft Corporation.

Eigenschappen

Artikel ID: 286023 - Laatste beoordeling: donderdag 17 augustus 2006 - Wijziging: 10.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Word 2000 Standard Edition
  • Visual Basic, Scripting Edition 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
Trefwoorden: 
kbdownload kbautomation kbhowto KB286023

Geef ons feedback

 

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