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

Resumen

En este artículo se muestra cómo puede utilizar un componente ActiveX para el cliente de automatización de Word desde una página Web que se representa en el Explorador de Internet. Existen varias ventajas al utilizar un componente ActiveX de una página Web en lugar de la secuencia de comandos que está incrustada 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 al convertir su proyecto de Visual Basic en un EXE ActiveX o una DLL de ActiveX.
  • Word no está marcado como seguro para secuencias de comandos. Dependiendo de la configuración de seguridad en Internet Explorer, no puede ejecutar código de automatización de Word en la secuencia de comandos o el usuario puede que aparezca una advertencia de seguridad. Suponiendo que el componente de ActiveX cumple ciertas normas, marcado seguro para secuencias de comandos para evitar estos problemas de seguridad.
  • Visual Basic tiene varias características que no se puede utilizar con la 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 de página Web es la posibilidad de llamar a la interfaz de programación de aplicaciones (API) de Windows.
Un escenario común del programador es presentar a los usuarios una interfaz de página Web para crear un documento de Word con datos de alguna fuente externa o lógica. Aunque puede utilizar la automatización de Word en el servidor para generar el documento y la secuencia de nuevo al cliente, también tiene muchos inconvenientes usando un enfoque de servidor que implica la automatización de Word. El principal inconveniente es la escalabilidad; Word es un servidor de automatización consume muchos recursos y no se recomienda para la generación de documentos en el servidor Web.

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

Más información

Descargar el ejemplo

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

El siguiente archivo está disponible para su descarga desde el Centro de descarga de Microsoft:
Fecha de lanzamiento: 17 de abril de 2001

Para obtener información adicional acerca de cómo descargar archivos de Microsoft Support, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
119591 cómo obtener archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft analizó este archivo en busca de virus. Microsoft ha utilizado el software de detección de virus más reciente que estaba disponible en la fecha en que se publicó el archivo. El archivo se almacena en servidores seguros que ayudan a impedir cambios no autorizados en el archivo.

Configurar el ejemplo

Después de descargar Autoword.exe, siga estos pasos para configurar el ejemplo:
  1. Cree una carpeta denominada factura en el directorio raíz virtual del servidor Web. (El directorio de raíz virtual predeterminada es C:\Inetpub\Wwwroot).
  2. Extraiga los archivos en Autoword.exe en la carpeta de la factura.
  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. Del mismo modo, reemplazar SuServidorSQLServer en la cadena de conexión con el nombre de su SQL Server que contiene la base de datos de ejemplo Northwind.

    Nota: si no tienes un disponibles de SQL Server con la base de datos de ejemplo Northwind, puede 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 la base de datos de ejemplo Neptuno de Access es similar a la 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 visite por primera vez cualquiera de estas páginas, le pedirá que descargue el componente de ActiveX.
El componente 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 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 que el componente de ActiveX para obtener la información del pedido para un ID de pedido determinada, o puede elegir la aplicación Web empaquetar la información del pedido como XML y enviarlo al componente ActiveX para el procesamiento. En cualquier caso, después de que el componente obtiene la información del pedido, puede automatizar Word para crear y mostrar el documento de 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 utiliza ActiveX Data Objects (ADO) para extraer información sobre un pedido en la base de datos de ejemplo Northwind. La información del pedido se almacena en la variable de miembro privado m_Data . Puede llamarse al método GetData para permitir la extracción de datos se producen del cliente.
  • El método SendData utiliza Microsoft XML (MSXML) para rellenar la variable de miembro privado m_Data con la información del pedido 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 lo datos del servidor y presentar al cliente con una isla de datos XML que puede utilizarse para la generación del documento.
  • El método MakeInvoice utiliza Automatización de Word para crear un documento que contiene la información del pedido en la variable de miembro privado m_Data . Un documento que está almacenado en el servidor Web se utiliza como punto de partida para la factura. El llamador puede mostrar el documento de Word completo fuera del explorador o guardar el documento completo a 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 puede utilizar el método GetData para permitir que el componente de ActiveX recuperar orden datos del 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 de ActiveX para mostrar el documento completado fuera del explorador. También puede guardar el documento completo y mostrarlo en el explorador; Sin embargo, esto requiere que se guarde el documento de Word en un disco. El componente puede guardar el documento como C:\Invoice.doc en la unidad local del cliente. Porque el componente ActiveX está marcado como seguro para secuencias de comandos, el cliente se le pide que confirme la operación de guardar.

Si desea mostrar el documento completo en el explorador, cambie la llamada a MakeInvoice en Autoword1.htm a la siguiente:
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc", True      window.navigate "c:\invoice.doc"

Autoword2.htm muestra cómo puede utilizar el método SendData para enviar los datos del pedido como un objeto DOMDocument al componente ActiveX para generar el documento completo. DOMDocument se crea desde una isla de datos XML que reside en la página Web. Para que el componente de ActiveX procesar correctamente la información del pedido enviado por el llamador, el XML debe ser correcto y estructurado para que el componente puede interpretarlo como información del 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 se crea una instancia del componente ActiveX por medio de una etiqueta < OBJECT > en lugar de la función CreateObject . La finalidad 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 no está instalado el componente, el componente se descargará del archivo contenedor (CAB) en la dirección URL que se indica en el atributo CODEBASE . Dependiendo de la configuración de seguridad del usuario en Internet Explorer, primero de puede que reciben un mensaje para confirmar la descarga.

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

Para obtener más información sobre la creación de descargas de componentes de Internet, firmas digitales y el marcado de componentes como seguro para secuencias de comandos y la inicialización, consulte los siguientes sitios Web de Microsoft 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:

257757 INFO: automatización de Office para una ejecución desatendida es compatible o no se recomienda

270906 cómo utilizar ASP para generar un documento con formato (RTF) texto enriquecido en secuencia a Microsoft Word
(c) Microsoft Corporation 2001, Reservados todos los derechos. Colaboración de Lori B. Turner, Microsoft Corporation.
Propiedades

Id. de artículo: 286023 - Última revisión: 24 ene. 2017 - Revisión: 1

Comentarios