Internet Explorer'dan Word otomasyonu için VB ActiveX bileşeni kullanma

Özet

Bu makalede, Internet Explorer'da işlenen bir Web sayfasından Word'ün istemci tarafı Otomasyonu için ActiveX bileşenini nasıl kullanabileceğiniz gösterilmektedir. Web sayfasının kendisine eklenmiş betik yerine Bir Web sayfasından ActiveX bileşeni kullanmanın çeşitli avantajları vardır:

  • Microsoft Word'ü otomatik hale getiren Visual Basic kodunuz zaten varsa, Visual Basic projenizi ActiveX EXE veya ActiveX DLL'ye dönüştürerek kodunuzu tarayıcıda yeniden kullanabilirsiniz.
  • Word, betik oluşturma için güvenli olarak işaretlenmez. Internet Explorer'daki güvenlik ayarlarına bağlı olarak, betikteki Word Otomasyonu kodu çalışmayabilir veya kullanıcıya bir güvenlik uyarısı istenebilir. ActiveX bileşeninizin belirli yönergeleri karşıladığını varsayarsak, bu güvenlik sorunlarından kaçınmak için betik oluşturma için güvenli olarak işaretlenebilir.
  • Visual Basic,Web sayfasında betikle birlikte kullanamayacağınız çeşitli özelliklere sahiptir. Örneğin, Visual Basic tarafından kullanılabilen ancak Web sayfası betiğinde kullanılamayan bir özellik, Windows uygulama programlama arabirimini (API) çağırabilme özelliğidir.

Yaygın bir geliştirici senaryosu, kullanıcılara bazı dış kaynaklardan veya mantıklardan gelen verileri kullanarak Word belgesi oluşturmaya yönelik bir Web sayfası arabirimi sunmaktır. Belgeyi oluşturmak ve istemciye geri akışla göndermek için sunucu tarafı Word Otomasyonu'nu kullanabilirsiniz ancak Word Otomasyonu'nu içeren bir sunucu tarafı yaklaşımı kullanmanın birçok dezavantajı vardır. Birincil dezavantajı ölçeklenebilirliktir; Word çok yoğun kaynak kullanımlı bir Otomasyon sunucusudur ve Web sunucusunda belge oluşturmak için önerilmez.

İstemcide belge oluşturmayı gerçekleştirmek için bir ActiveX bileşeni kullanarak, yoğun kaynak kullanan Word Otomasyonu'nu Web sunucusundan uzağa taşıyabilirsiniz. Bu, bu makalede ele alınan örnek ActiveX bileşeni tarafından sunulan çözümdür. Örnek Word Otomasyonu'na özgü olsa da, Microsoft Excel gibi diğer Microsoft Office uygulamalarını otomatikleştirmek için de aynı ilkeler uygulanabilir.

Daha Fazla Bilgi

Visual Basic ActiveX Bileşeni

Bu örnekteki Visual Basic ActiveX bileşeni, kullanıcının isteği üzerine bir sipariş faturası belgesi oluşturmak için Web sayfası betiğiyle etkileşim kurar. Web uygulaması, ActiveX bileşeninin belirli bir sipariş kimliği için sipariş bilgilerini almasına izin verebilir veya Web uygulaması sipariş bilgilerini XML olarak paketleyip işlenmek üzere ActiveX bileşenine göndermeyi seçebilir. Her iki durumda da bileşen sipariş bilgilerini aldıktan sonra, siparişin fatura belgesini oluşturmak ve görüntülemek için Word'i otomatikleştirebilir.

ActiveX bileşeni (AutomateWord) üç yöntemi kullanıma sunan tek bir sınıf (Invoice sınıfı) içerir:

  • GetData yöntemi, Northwind örnek veritabanındaki bir siparişle ilgili bilgileri ayıklamak için ActiveX Veri Nesneleri'ni (ADO) kullanır. Sipariş bilgileri m_Data özel üye değişkeninde depolanır. Veri ayıklamanın istemci tarafında gerçekleşmesini sağlamak için GetData yöntemi çağrılabilir.
  • SendData yöntemi, m_Data özel üye değişkenini çağıran tarafından sağlanan sipariş bilgileriyle doldurmak için Microsoft XML (MSXML) kullanır. SendData, sipariş bilgileri için bir DOMDocument nesnesini temsil eden bir parametre bekler. Sipariş bilgilerini Web sayfasından bileşene göndermek için SendData yöntemi çağrılabilir. Bu yaklaşımla, ASP kullanarak veri sunucusu tarafını ayıklayabilir ve istemciye belge oluşturma için kullanılabilecek bir XML veri adası sunabilirsiniz.
  • MakeInvoice yöntemi, m_Data özel üye değişkenindeki sipariş bilgilerini içeren bir belge oluşturmak için Word Otomasyonu'nı kullanır. Web sunucusunda depolanan bir belge, fatura için başlangıç noktası olarak kullanılır. Çağıran, tamamlanmış Word belgesini tarayıcının dışında görüntülemeyi veya tamamlanmış belgeyi daha sonra kullanmak üzere bir diske kaydetmeyi seçebilir.

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

Web Sayfasından ActiveX Bileşenini Kullanma

Autoword1.htm, ActiveX bileşeninin sipariş verilerini istemci tarafında almasına ve belgeyi oluşturmasına izin vermek için GetData yöntemini nasıl kullanabileceğinizi gösterir.

Autoword1.htm

<HTML>
<HEAD>
   <OBJECT ID="AutoWord"
    CLASSID="CLSID:32646EBA-0919-4C2F-94D6-599F46DC34F2"
    CODEBASE="https://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 "https://YourWebServer/invoice/invoice.doc"
   End Function

</SCRIPT>
</HTML>

Autoword1.htm'daki betik, tamamlanmış belgeyi tarayıcının dışında görüntülemek için ActiveX bileşenini kullanır. Tamamlanmış belgeyi kaydedip tarayıcıda görüntülemeyi de seçebilirsiniz; ancak bunu yapmak için Word belgesinin diske kaydedilmesi gerekir. Bileşen, belgeyi istemcinin yerel sürücüsüne C:\Invoice.doc olarak kaydedebilir. ActiveX bileşeni betik oluşturma için güvenli olarak işaretlendiğinden istemciden kaydetmeyi onaylaması istenir.

Tamamlanmış belgeyi tarayıcıda görüntülemek istiyorsanız, Autoword1.htm'de aramayı MakeInvoice olarak değiştirin:

      AutoWord.MakeInvoice "https://YourWebServer/invoice/invoice.doc", True
      window.navigate "c:\invoice.doc"

Autoword2.htm, tamamlanan belgeyi oluşturmak üzere Sipariş verilerini DoMDocument nesnesi olarak ActiveX bileşenine göndermek için SendData yöntemini nasıl kullanabileceğinizi gösterir. DOMDocument, Web sayfasında bulunan bir XML veri adasından oluşturulur. ActiveX bileşeninin çağıran tarafından gönderilen sipariş bilgilerini düzgün bir şekilde işlemesi için, BILEŞENIn sipariş bilgileri olarak yorumlayabilmesi için XML'nin iyi biçimlendirilmiş ve yapılandırılmış olması gerekir.

Autoword2.htm

<HTML>
<HEAD>
   <OBJECT ID="AutoWord"
    CLASSID="CLSID:32646EBA-0919-4C2F-94D6-599F46DC34F2"
    CODEBASE="https://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 "https://YourWebServer/invoice/invoice.doc"
   End Function

</SCRIPT>
</HTML>

Hem Autoword1.htm hem de Autoword2.htm, ActiveX bileşeninin CreateObject işlevi yerine bir etiket yoluyla örneklendiğini unutmayın. Etiketi kullanmanın amacı, bileşeni henüz yüklememiş kullanıcılar için ActiveX bileşeninin otomatik olarak indirilmesini etkinleştirmektir. Kullanıcı bu sayfalardan birini ziyaret ederse ve bileşen yüklü değilse, bileşen CODEBASE özniteliğinde belirtilen URL'deki dolap (CAB) dosyasından indirilir. Kullanıcının Internet Explorer'daki güvenlik ayarlarına bağlı olarak, önce indirmeyi onaylaması için bir istem alabilir.

NOT: Autoword.exe'de bulunan CAB dosyası Visual Basic için Paket ve Dağıtım Sihirbazı ile oluşturulmuştur. Paketteki ActiveX bileşeni betik oluşturma ve başlatma için güvenli olarak işaretlenir, ancak dijital olarak imzalanmaz.

İnternet bileşeni indirmeleri oluşturma, dijital imzalama ve bileşenleri betik oluşturma ve başlatma için güvenli olarak işaretleme hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitelerine bakın:

Authenticode ile Kod İmzalama ve Denetleme https://msdn.microsoft.com/en-us/library/ms537364.aspx

ActiveX Denetimleri için Güvenli Başlatma ve Betik Oluşturma https://msdn.microsoft.com/en-us/library/Aa751977.aspx

Başvurular

Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleleri görüntülemek üzere aşağıdaki makale numaralarına tıklayın:

257757 BİlGİ: Katılımsız Yürütme için Office Otomasyonu Önerilmez veya Desteklenmez

(c) Microsoft Corporation 2001, Tüm Hakları Saklıdır. Lori B. Turner, Microsoft Corporation'ın katkıları.