כיצד להשתמש ברכיב ActiveX של VB לאוטומציית Word מ- Internet Explorer

סיכום

מאמר זה מדגים כיצד ניתן להשתמש ברכיב ActiveX עבור אוטומציה בצד הלקוח של Word מתוך דף אינטרנט המעובד ב- Internet Explorer. יש כמה יתרונות לשימוש ברכיב ActiveX מתוך דף אינטרנט במקום קובץ Script המוטבע בדף האינטרנט עצמו:

  • אם כבר יש לך קוד Visual Basic ההפיכת Microsoft Word לאוטומטי, באפשרותך לעשות שימוש חוזר בקוד בדפדפן על-ידי המרת פרוייקט Visual Basic ל- ActiveX EXE או לקובץ DLL של ActiveX.
  • Word אינו מסומן כבטוח עבור Scripting. בהתאם להגדרות האבטחה ב- Internet Explorer, ייתכן שקוד אוטומציה של Word בקובץ Script לא יפעל או שהמשתמש יתבקש עם אזהרת אבטחה. בהנחה שרכיב ה- ActiveX שלך עומד בקווים מנחים מסוימים, ייתכן שהוא יסומן כבטוח ל- Scripting כדי להימנע מבעיות אבטחה אלה.
  • Visual Basic כולל כמה תכונות שלא ניתן להשתמש בהן עם קובץ Script בדף אינטרנט. לדוגמה, תכונה אחת הזמינה ל- Visual Basic אך לא ל- Script של דף אינטרנט היא היכולת לקרוא לממשק תיכנות היישומים (API) של Windows.

תרחיש מפתח נפוץ הוא להציג למשתמשים ממשק דף אינטרנט ליצירת מסמך Word באמצעות נתונים ממקור חיצוני או לוגיקה מסוימים. למרות שניתן להשתמש באוטומציה של Word בצד השרת כדי ליצור את המסמך ולהזרים אותו בחזרה ללקוח, ישנם חסרונות רבים בשימוש בגישה בצד השרת הכוללת את Word Automation. החסרונות העיקריים הם מדרגיות; Word הוא שרת אוטומציה עתיר משאבים מאוד והוא אינו מומלץ להפקת מסמך בשרת האינטרנט.

על-ידי שימוש ברכיב ActiveX כדי לבצע את יצירת המסמך בלקוח, באפשרותך להעביר את אוטומציית Word הצומצת למשאבים הרחק משרת האינטרנט. זהו הפתרון המוצג על-ידי רכיב ActiveX לדוגמה הנדון במאמר זה. על אף שהדוגמה ספציפית לאוטומציה של Word, אותן עקרונות עשויים להיות מוחלים על הפיכת יישומים אחרים של Microsoft Office לאוטומטיים, כגון Microsoft Excel.

מידע נוסף

רכיב ActiveX של Visual Basic

רכיב ActiveX של Visual Basic בדוגמה זו מקיים אינטראקציה עם קובץ Script של דף אינטרנט כדי ליצור מסמך של חשבונית הזמנה לבקשת המשתמש. יישום האינטרנט עשוי לאפשר לרכיב ActiveX להשיג את פרטי ההזמנה עבור מזהה הזמנה נתון, או שיישום האינטרנט עשוי לבחור לארוז את פרטי ההזמנה כ- XML ולשלוח אותו לרכיב ה- ActiveX לעיבוד. בכל מקרה, לאחר שהרכיב מקבל את פרטי ההזמנה, הוא יכול להפוך את Word לאוטומטי כדי לבנות ולהציג את מסמך החשבונית עבור ההזמנה.

רכיב ActiveX (AutomateWord) מכיל מחלקה אחת, מחלקת החשבונית, החושפת שלוש שיטות:

  • פעולת השירות GetData משתמשת באובייקטי נתונים של ActiveX (ADO) כדי לחלץ מידע אודות סדר במסד הנתונים לדוגמה של Northwind. פרטי ההזמנה מאוחסנים במשתנה של m_Data פרטי. ניתן לבצע קריאה לפעולת השירות GetData כדי לאפשר לחילוץ הנתונים להתרחש בצד הלקוח.
  • פעולת השירות SendData משתמשת ב- Microsoft XML (MSXML) m_Data למלא את משתנה החבר הפרטי בפרטי ההזמנה המסופקים על-ידי המתקשר. SendData מצפה לפרמטר אחד המייצג אובייקט DOMDocument עבור פרטי ההזמנה. ניתן לבצע קריאה לפעולת השירות SendData כדי לשלוח את פרטי ההזמנה דף האינטרנט לרכיב. בגישה זו, באפשרותך להשתמש ב- ASP כדי לחלץ את שרת הנתונים בצד השרת ולהציג ללקוח אי נתוני XML שניתן להשתמש בו ליצירת המסמך.
  • פעולת השירות MakeInvoice משתמשת באוטומציה של Word כדי לבנות מסמך המכיל את פרטי ההזמנה במשתנה m_Data של חבר פרטי. מסמך המאוחסן בשרת האינטרנט משמש כנקודת התחלה עבור החשבונית. ייתכן שהמתקשר יבחר להציג את מסמך Word שהושלם מחוץ לדפדפן או לשמור את המסמך שהושלם בדיסק לשימוש עתידי.

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

שימוש ברכיב ActiveX דף אינטרנט

Autoword1.htm מדגים כיצד ניתן להשתמש בפעולת השירות GetData כדי לאפשר לרכיב ה- ActiveX לאחזר את נתוני ההזמנה בצד הלקוח ולבנות את המסמך.

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>

קובץ ה- script Autoword1.htm משתמש ברכיב ActiveX כדי להציג את המסמך שהושלם מחוץ לדפדפן. באפשרותך גם לבחור לשמור את המסמך שהושלם ולהציג אותו בדפדפן; עם זאת, פעולה זו דורשת שמסמך Word יישמר בדיסק. הרכיב יכול לשמור את המסמך C:\Invoice.doc בכונן המקומי של הלקוח. מאחר שרכיב ActiveX מסומן כבטוח ל- Scripting, הלקוח מתבקש לאשר את השמירה.

אם ברצונך להציג את המסמך שהושלם בדפדפן, שנה את השיחה ל- MakeInvoice ב- Autoword1.htm הבא:

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

Autoword2.htm מדגים כיצד ניתן להשתמש בפעולת השירות SendData כדי לשלוח את נתוני ההזמנה כאובייקט DOMDocument לרכיב ActiveX ליצירת המסמך שהושלם. DOMDocument נוצר מתוך אי נתוני XML השוכן בדף האינטרנט. כדי שרכיב ה- ActiveX יעבד כראוי את פרטי ההזמנה שנשלחים על-ידי המתקשר, יש ליצור ולארגן היטב את ה- XML כך שהרכיב יוכל לפרש אותו כפרטי הזמנה.

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>

הן Autoword1.htm והן Autoword2.htm, עליך לשים לב שרכיב ה- ActiveX נוצר באמצעות תגית ולא באמצעות הפונקציה CreateObject. מטרת השימוש בתג היא להפוך הורדה אוטומטית של רכיב ActiveX לזמינה עבור משתמשים שהרכיב עדיין לא מותקן בהם. אם משתמש מבקר באחד מדפים אלה והרכיב אינו מותקן, הרכיב יורד מקובץ ה- Cabinet (CAB) בכתובת ה- URL שצוינה בתכונה CODEBASE. בהתאם להגדרות האבטחה של המשתמש ב- Internet Explorer, הוא עשוי לקבל תחילה בקשה לאישור ההורדה.

הערה: קובץ CAB הכלול ב- Autoword.exe נוצר באמצעות אשף החבילה והפריסה עבור Visual Basic. רכיב ה- ActiveX בחבילה מסומן כבטוח ל- Scripting ולאתחול, אך אינו חתום בחתימה דיגיטלית.

לקבלת מידע נוסף על יצירת הורדות של רכיבי אינטרנט, חתימה דיגיטלית וסימון רכיבים כרכיבים בטוחים עבור Scripting ואתחול, עיין באתרים הבאים של Microsoft Developer Network (MSDN):

חתימה ובדיקת קוד באמצעות Authenticode https://msdn.microsoft.com/en-us/library/ms537364.aspx

אתחול ו- Scripting בטוחים עבור פקדי ActiveX https://msdn.microsoft.com/en-us/library/Aa751977.aspx

הפניות

לקבלת מידע נוסף, לחץ על מספרי המאמרים הבאים כדי להציג את המאמרים מתוך מאגר הידע Microsoft Knowledge Base:

257757 מידע: אוטומציה של Office לביצוע ללא התערבות אינה מומלצת או נתמכת

(c) Microsoft Corporation 2001, כל הזכויות שמורות. תרומות מאת לורי ב. טרנר, Microsoft Corporation.