Cómo utilizar un componente ActiveX de VB para automatización de Word desde Internet Explorer

Seleccione idioma Seleccione idioma
Id. de artículo: 286023 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo muestra cómo puede utilizar un control ActiveX componente de cliente de automatización de Word desde una página Web que se representa en Internet Explorer. Hay varias ventajas al uso de un componente ActiveX de una página Web en lugar de la secuencia de comandos que está incrustado en la propia página Web:
  • Si ya tiene código de Visual Basic que automatiza Microsoft Word, se puede reutilizar el código en el explorador convirtiendo el proyecto de Visual Basic o un archivo EXE de ActiveX como un archivo DLL de ActiveX.
  • Word no está marcado seguro para secuencias de comandos. Dependiendo de la configuración de seguridad de Internet Explorer, no puede ejecutar código de automatización de Word en secuencia de comandos o el usuario posible que aparezca una advertencia de seguridad. Suponiendo que el componente ActiveX cumple ciertas normas, puede marcarse como seguros para scripting para evitar estos problemas de seguridad.
  • Visual Basic tiene varias características que puede utilizar con secuencia de comandos en una página Web. Por ejemplo, una característica que está disponible para Visual Basic pero no a la secuencia de comandos página Web es la capacidad para llamar a la interfaz de programación de aplicaciones (API) de Windows.
Un escenario común de desarrollador es presentar a los usuarios con una interfaz página Web para crear un documento de Word con datos de algún origen externo o lógica. Aunque puede utilizar automatización de Word en el servidor para generar el documento y la secuencia que se devuelva al cliente, hay muchos inconvenientes de utilizar un enfoque de lado del servidor implica la automatización de Word. El inconveniente principal es la escalabilidad; Word es un servidor de automatización que consume muchos recursos y no se recomienda para generación de documentos en el servidor Web.

Mediante un componente ActiveX para realizar la generación de documento en el cliente, puede mover la automatización de Word intensivo de los recursos fuera del servidor Web. Esta es la solución que se presenta por el componente ActiveX de ejemplo que se describe en este artículo. Aunque el ejemplo es específico de automatización de Word, se pueden aplicar los mismos principios para automatizar otras Microsoft Office aplicaciones, como Microsoft Excel.

Más información

Descargar el ejemplo

AutoWord.exe contiene el proyecto DLL ActiveX de Visual Basic, Word documentos y páginas Web que se describen en este artículo.

El archivo siguiente está disponible para descargarlo del Centro de descarga de Microsoft:
Autoword.exe
Fecha de lanzamiento: 17 de abril de 2001

Para obtener información adicional acerca de cómo descargar los archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
119591Cómo obtener Archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft exploró este archivo en busca de virus. con el software de detección de virus más reciente disponible en la fecha de publicación. Asimismo, el archivo se almacenó en servidores seguros que ayudan a impedir la realización de cambios no autorizados.

Configurar el ejemplo

Después de descargar autoword.exe, siga estos pasos para configurar el ejemplo:
  1. Cree una carpeta denominada facturas en el directorio raíz virtual del servidor Web. (El directorio de raíz virtual de predeterminada es C:\inetpub\wwwroot).
  2. Extraiga los archivos de autoword.exe en la factura carpeta.
  3. Abra Autoword1.htm en un editor de HTML o texto y reemplace las referencias a SuServidorWeb en todas las direcciones URL con el nombre de su servidor Web. Asimismo, reemplace SuServidorSQLServer en la cadena de conexión con el nombre de su SQL Server que contiene la base de datos Neptuno.

    Nota : si no tiene un SQL Server disponibles con la Northwind base de datos de ejemplo, se puede utilizar para modificar la cadena de conexión para utilizar la base de datos de ejemplo Northwind de Microsoft Access en su lugar. Una conexión a Northwind de Access, base de datos de ejemplo similar al siguiente:
    sConn = "provider=microsoft.jet.oledb.4.0; data source=" & _
            "C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb"
    					
  4. Abra Autoword2.htm en un editor de HTML o texto y reemplace las referencias a SuServidorWeb en todas las direcciones URL con el nombre de su servidor Web.
  5. Inicie Internet Explorer. Puede examinar http://YourWebServer/invoice/AutoWord1.htm y http://YourWebServer/invoice/AutoWord2.htm para probar la secuencia de comandos. Cuando visita primero cualquiera de estas páginas, se le pedirá para descargar el ActiveX componente.
El componente de ActiveX de Visual Basic de ejemplo y la secuencia de comandos se describen con más detalle en las secciones siguientes.

Componente ActiveX de Visual Basic

El componente ActiveX de Visual Basic en este ejemplo se interactúa con la secuencia de comandos de página Web para generar un documento de factura de pedido en la solicitud del usuario. La aplicación Web puede permitir el componente de ActiveX para obtener la información de pedido para un ID de pedido determinada, o la aplicación Web, puede elegir empaquetar la información de pedido como XML y enviarlo al componente ActiveX para procesamiento. En ambos casos, después de que el componente obtiene la información del pedido, puede automatizar Word para crear y mostrar el documento factura para el pedido.

El componente de ActiveX ( AutomateWord ) contiene una sola clase, la clase de factura , que expone tres métodos:
  • El método GetData , se utiliza ActiveX Data Objects (ADO) para extraer información sobre un pedido en la base de datos Neptuno. La información del pedido se almacena en la variable de miembro privado m_Data . El método GetData se puede llamar para permitir la extracción de datos se producen en el cliente.
  • El método SendData utiliza Microsoft XML (MSXML) para rellenar la variable de miembro privado m_Data con la información de orden que es proporcionado por el llamador. SendData espera un parámetro que representa un objeto DOMDocument para la información del pedido. El método SendData puede llamarse para enviar la información del pedido desde la página Web al componente. Con este enfoque, puede utilizar ASP para extraer los datos de servidor y presentar al cliente con una isla de datos XML que puede utilizarse para la generación de documento.
  • El método MakeInvoice utiliza automatización de Word para generar un documento que contiene la información de orden de la variable de miembro privado m_Data . Documento que se almacena en el Web de servidor se utiliza como punto de partida para la factura. El llamador puede optar por mostrar el documento Word completado fuera del explorador o guardar el documento completo en un disco para su uso posterior.
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
				

Utilizar el componente ActiveX de una página Web

Autoword1.htm muestra cómo se puede utilizar el método GetData para permitir que el componente ActiveX recuperar el orden de datos de cliente y generar el documento.

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>
				
la secuencia de comandos en Autoword1.htm utiliza el componente ActiveX para mostrar el documento completado fuera del explorador. También puede elegir guardar el documento completo y mostrarlo en el explorador; sin embargo, esto por lo tanto, se requiere que se guarde el documento de Word en un disco. El componente puede guardar el documento como C:\Invoice.doc en unidad local del cliente. Porque el componente ActiveX está marcado como seguro para secuencias de comandos, se pide que confirme la operación de guardar al cliente.

Si desea mostrar el documento completo en el explorador, cambie la llamada a MakeInvoice en Autoword1.htm a lo siguiente: Autoword2.htm
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc", True
      window.navigate "c:\invoice.doc"
				
muestra cómo se puede utilizar el método SendData enviar los datos pedido como un objeto DOMDocument al componente ActiveX para generar el documento completo. Se crea el DOMDocument de una isla de datos XML que reside en la página Web. Para que el componente ActiveX procesar correctamente la información de pedido que se envía por el llamador, el XML debe ser correcto y estructurada para que el componente puede interpretar como información de pedido.

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>
				
en Autoword1.htm y Autoword2.htm, debe tener en cuenta que el componente ActiveX se crea una instancia por medio de una etiqueta <object> en lugar de losfunción CreateObject . El propósito de utilizar la etiqueta <object> es habilitar la descarga automática del componente ActiveX para los usuarios que aún no tiene instalado el componente. Si un usuario visita una de estas páginas y el componente no está instalado, se descargará el componente del contenedor (CAB) archivo en la dirección URL que se indica en elatributo CODEBASE . Dependiendo configuración de seguridad del usuario en Internet Explorer, pueden primero pregunte si desea confirmar la descarga.

Nota : archivo de CAB en el que se incluye en autoword.exe se creó con el Asistente de empaquetado y distribución de Visual Basic. El componente de ActiveX en el paquete está marcado como seguro para secuencias de comandos e inicialización, pero no está firmado digitalmente.

Para obtener más información sobre la creación descargas de componente de Internet, firmas digitales y marcar componentes como seguro para secuencias de comandos y la inicialización, visite los siguientes sitios Web de Developer Network (MSDN):
Firma y comprobación de código con Authenticode
http://msdn2.microsoft.com/en-us/library/ms537364.aspx

Inicialización segura y secuencias de comandos para controles ActiveX
http://msdn2.microsoft.com/en-us/library/Aa751977.aspx

Referencias

Para obtener información adicional, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
257757INFORMACIÓN: Automatización de Office para ejecución desatendida es compatible o no se recomienda
270906Cómo utilizar ASP para generar un documento de formato (RTF) texto enriquecido en la secuencia a Microsoft Word
(c) Microsoft Corporation 2001, reservados todos los derechos. Contribuciones por Lori B. Turner, Microsoft Corporation.

Propiedades

Id. de artículo: 286023 - Última revisión: jueves, 17 de mayo de 2007 - Versión: 11.3
La información de este artículo se refiere a:
  • Microsoft Office Word 2007
  • Microsoft Office Word 2003
  • Microsoft Word 2002 Standard Edition
  • 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
Palabras clave: 
kbmt kbdownload kbautomation kbhowto KB286023 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 286023

Enviar comentarios

 

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