Comment utiliser un composant ActiveX de VB pour l’automatisation de Word à partir d’Internet Explorer

Résumé

Cet article explique comment vous pouvez utiliser un composant ActiveX pour côté client automatisation de Word à partir d’une page Web qui est restituée dans Internet Explorer. Il existe plusieurs avantages à l’utilisation d’un composant ActiveX à partir d’une page Web au lieu de script qui est incorporé dans la page Web elle-même :
  • Si vous avez déjà le code Visual Basic qui automatise Microsoft Word, vous pouvez réutiliser votre code dans le navigateur par la conversion de votre projet Visual Basic à un EXE ActiveX ou une DLL ActiveX.
  • Word n’est pas marqué sûr pour les scripts. En fonction des paramètres de sécurité dans Internet Explorer, d’exécuter du code d’Automation de Word dans le script ou l’utilisateur peut être invité avec un avertissement de sécurité. En supposant que votre composant ActiveX remplisse certaines conditions, il peut être marqué sûr pour les scripts pour éviter ces problèmes de sécurité.
  • Visual Basic comporte plusieurs fonctionnalités qui vous ne pouvez pas utiliser de script dans une page Web. Par exemple, une fonctionnalité qui est disponible pour Visual Basic, mais pas de script de page Web est la possibilité d’appeler l’interface de programmation d’application (API) de Windows.
Un scénario de développement courant est de présenter aux utilisateurs une interface de page Web pour la création d’un document Word à l’aide de données provenant de certaines sources externes ou la logique. Vous pouvez utiliser l’automatisation de Word côté serveur pour générer le document et le renvoyer au client, il existe de nombreux inconvénients à l’utilisation d’une approche côté serveur qui comprend l’automatisation de Word. Le principal inconvénient est l’évolutivité ; Word est un serveur d’Automation énormément de ressources et n’est pas recommandé pour la génération de document sur le serveur Web.

À l’aide d’un composant ActiveX pour effectuer la génération de documents au niveau du client, vous pouvez déplacer l’automatisation de Word beaucoup de ressources du serveur Web. Il s’agit de la solution qui vous est présentée par l’exemple de composant ActiveX dont il est question dans cet article. Bien que l’exemple soit spécifique à l’automatisation de Word, les mêmes principes peuvent être appliqués pour l’automatisation d’autres applications de Microsoft Office, comme Microsoft Excel.

Plus d'informations

Télécharger l’exemple

AutoWord.exe contient le projet de DLL ActiveX de Visual Basic, document Word et les pages Web qui sont décrits dans cet article.

Le fichier suivant est disponible au téléchargement à partir du Microsoft Download Center :
Date de publication : 17 avril 2001.

Pour plus d'informations sur la façon de télécharger des fichiers de Support Microsoft, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :Microsoft a vérifié que ce fichier ne comportait pas de virus. Microsoft a utilisé les logiciels de détection de virus les plus récents disponibles à la date à laquelle le fichier a été validé. Le fichier est stocké sur des serveurs sécurisés, permettant d’éviter toute modification non autorisée du fichier.

Définir l’échantillon

Après avoir téléchargé Autoword.exe, procédez comme suit pour configurer l’exemple :
  1. Créez un dossier nommé facture dans le répertoire racine virtuel de votre serveur Web. (Le répertoire racine virtuel par défaut est C:\Inetpub\Wwwroot.)
  2. Extrayez les fichiers dans Autoword.exe dans le dossier de la facture.
  3. Ouvrez Autoword1.htm dans un texte ou un éditeur HTML et remplacez les références à Votre_serveur_web dans toutes les URL avec le nom de votre serveur Web. De même, remplacez YourSQLServer dans la chaîne de connexion avec le nom de votre SQL Server qui contient la base de données exemple Les Comptoirs.

    Remarque: Si vous ne disposez pas d’un SQL Server disponible avec la base de données exemple Les Comptoirs, vous pouvez modifier la chaîne de connexion pour utiliser à la place de la base de données exemple Les Comptoirs de Microsoft Access. Une connexion à la base de données exemple Les Comptoirs de Access semblable à la suivante :
    sConn = "provider=microsoft.jet.oledb.4.0; data source=" & _        "C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb"

  4. Ouvrez Autoword2.htm dans un texte ou un éditeur HTML et remplacez les références à Votre_serveur_web dans toutes les URL avec le nom de votre serveur Web.
  5. Démarrez Internet Explorer. Vous pouvez accéder à http://YourWebServer/invoice/AutoWord1.htm et http://YourWebServer/invoice/AutoWord2.htm pour tester le script. Lorsque vous visitez tout d’abord une ou l’autre de ces pages, vous êtes invité à télécharger le composant ActiveX.
L’exemple de composant ActiveX de Visual Basic et le script sont décrites plus en détail dans les sections qui suivent.

Composant ActiveX de Visual Basic

Le composant ActiveX de Visual Basic dans cet exemple interagit avec le script de page Web pour générer un document de facture de commande à la demande de l’utilisateur. L’application Web peut autoriser le composant ActiveX obtenir les informations de commande pour un ID de commande donné, ou de l’application Web peut choisir d’intégrer les informations de commande en tant que XML et l’envoyer au composant ActiveX pour traitement. Dans les deux cas, une fois le composant obtient les informations de commande, il peut automatiser Word pour créer et afficher le document de facture pour la commande.

Le composant ActiveX (AutomateWord) contient une seule classe, la classe Invoice , qui expose trois méthodes :
  • La méthode GetData utilise des objets ADO (ActiveX Data Objects) pour extraire des informations relatives à une commande dans la base de données exemple Les Comptoirs. Les informations de commande sont stockées dans la variable de membre privé de m_Data . La méthode GetData peut être appelée pour permettre l’extraction de données se produit côté client.
  • La méthode SendData utilise Microsoft XML (MSXML) pour remplir la variable de membre privé de m_Data avec les informations de commande qui sont fournies par l’appelant. SendData attend un paramètre qui représente un objet DOMDocument pour les informations de commande. La méthode SendData peut être appelée pour envoyer les informations de commande à partir de la page Web pour le composant. Avec cette approche, vous pouvez utiliser ASP pour extraire des données côté serveur et les présenter le client avec un îlot de données XML qui peut être utilisé pour la génération du document.
  • La méthode MakeInvoice utilise l’automatisation de Word pour créer un document qui contient les informations de commande dans la variable de membre privé de m_Data . Un document qui est stocké sur le serveur Web est utilisé comme point de départ pour la facture. L’appelant peut choisir d’afficher le document Word terminé en dehors du navigateur ou enregistrer le document complet sur un disque pour une utilisation ultérieure.
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

L’utilisation du composant ActiveX à partir d’une Page Web

Autoword1.htm montre comment vous pouvez utiliser la méthode GetData pour le composant ActiveX vous permettent de récupérer la commande données côté client et de créer le document.

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>

Le script dans Autoword1.htm utilise le composant ActiveX pour afficher le document terminé en dehors du navigateur. Vous pouvez également choisir d’enregistrer le document terminé et l’afficher dans le navigateur. Toutefois, cela requiert que le document Word est enregistré sur un disque. Le composant peut enregistrer le document en tant que C:\Invoice.doc sur le disque local du client. Dans la mesure où le composant ActiveX est marqué comme sécurisé pour le script, le client est invité à confirmer l’enregistrement.

Si vous souhaitez afficher le document terminé dans le navigateur, modifiez l’appel à MakeInvoice dans Autoword1.htm à ce qui suit :
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc", True      window.navigate "c:\invoice.doc"

Autoword2.htm montre comment vous pouvez utiliser la méthode SendData pour envoyer les données de commande sous la forme d’un objet DOMDocument pour le composant ActiveX pour générer le document terminé. Le DOMDocument est créé à partir d’un îlot de données XML qui se trouve sur la page Web. Pour le composant ActiveX traiter correctement les informations de commande qui sont envoyées par l’appelant, le code XML doit être bien formé et structurée pour que le composant puisse les interpréter comme des informations sur la commande.

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>

Dans Autoword1.htm et Autoword2.htm, vous devez noter que le composant ActiveX est instancié par une balise < OBJECT > au lieu de la fonction CreateObject . À l’aide de la balise < OBJECT > vise à activer le téléchargement automatique du composant ActiveX pour les utilisateurs qui n’ont pas déjà installé le composant. Si un utilisateur visite une de ces pages et que le composant n’est pas installé, le composant est téléchargé à partir du fichier (CAB) CAB à l’URL indiquée dans l’attribut CODEBASE . En fonction des paramètres de sécurité de l’utilisateur dans Internet Explorer, ils peut d’abord invite à confirmer le téléchargement.

Remarque: fichier le CAB qui est inclus dans le Autoword.exe a été créé avec l’Assistant Empaquetage et déploiement pour Visual Basic. Le composant ActiveX dans le package est marqué comme sûr pour les scripts et l’initialisation, mais n’est pas signé numériquement.

Pour plus d’informations sur la création de téléchargement de composant Internet, signature numérique et marquer des composants comme sûrs pour l’écriture de scripts et l’initialisation, consultez les sites Web de Microsoft Developer Network (MSDN) suivant :
La signature et la vérification du Code avec Authenticode
http://msdn2.microsoft.com/en-us/library/ms537364.aspx

L’initialisation sans échec et les scripts pour les contrôles ActiveX
http://msdn2.microsoft.com/en-us/library/Aa751977.aspx

Références

Pour plus d’informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft :

257757 Infos : Automation de Office pour une exécution sans assistance n’est pas recommandé ou pris en charge

270906 comment utiliser ASP pour générer un Document de Format (RTF) texte enrichi à diffuser dans Microsoft Word
(c) Microsoft Corporation 2001, tous droits réservés. Contribution de Lori B. Turner, Microsoft Corporation.
Propriétés

ID d'article : 286023 - Dernière mise à jour : 26 janv. 2017 - Révision : 1

Commentaires