Internet Explorer에서 Word 자동화를 위해 VB ActiveX 구성 요소를 사용하는 방법

요약

이 문서에서는 Internet Explorer에서 렌더링되는 웹 페이지에서 클라이언트 쪽 Word 자동화에 ActiveX 구성 요소를 사용하는 방법을 보여 줍니다. 웹 페이지 자체에 포함된 스크립트 대신 웹 페이지에서 ActiveX 구성 요소를 사용하는 경우 다음과 같은 몇 가지 이점이 있습니다.

  • Microsoft Word를 자동화하는 Visual Basic 코드가 이미 있는 경우 Visual Basic 프로젝트를 ActiveX EXE 또는 ActiveX DLL로 변환하여 브라우저에서 코드를 다시 사용할 수 있습니다.
  • Word는 스크립팅에 안전하지 않은 것으로 표시되지 않습니다. Internet Explorer의 보안 설정에 따라 스크립트의 Word Automation 코드가 실행되지 않거나 사용자에게 보안 경고 메시지가 표시될 수 있습니다. ActiveX 구성 요소가 특정 지침을 충족한다고 가정하면 이러한 보안 문제를 방지하기 위해 스크립팅에 안전하다고 표시될 수 있습니다.
  • Visual Basic에는 웹 페이지에서 스크립트와 함께 사용할 수 없는 몇 가지 기능이 있습니다. 예를 들어 Visual Basic에서 사용할 수 있지만 웹 페이지 스크립트에는 사용할 수 없는 한 가지 기능은 Windows API(애플리케이션 프로그래밍 인터페이스)를 호출하는 기능입니다.

일반적인 개발자 시나리오는 일부 외부 원본 또는 논리의 데이터를 사용하여 Word 문서를 만들기 위한 웹 페이지 인터페이스를 사용자에게 제공하는 것입니다. 서버 쪽 Word Automation을 사용하여 문서를 생성하고 클라이언트로 다시 스트리밍할 수 있지만 Word Automation과 관련된 서버 쪽 접근 방식을 사용하는 데는 많은 단점이 있습니다. 주요 단점은 확장성입니다. Word는 리소스를 많이 사용하는 Automation 서버이며 웹 서버의 문서 생성에는 권장되지 않습니다.

ActiveX 구성 요소를 사용하여 클라이언트에서 문서 생성을 수행하면 리소스 집약적인 Word Automation을 웹 서버에서 멀리 이동할 수 있습니다. 이 문서에서 설명하는 샘플 ActiveX 구성 요소에서 제공하는 솔루션입니다. 샘플은 Word Automation과 관련이 있지만 Microsoft Excel과 같은 다른 Microsoft Office 응용 프로그램을 자동화하는 데 동일한 원칙이 적용될 수 있습니다.

추가 정보

Visual Basic ActiveX 구성 요소

이 샘플의 Visual Basic ActiveX 구성 요소는 웹 페이지 스크립트와 상호 작용하여 사용자의 요청에 따라 주문 청구서 문서를 생성합니다. 웹 애플리케이션은 ActiveX 구성 요소가 지정된 주문 ID에 대한 주문 정보를 가져오도록 허용하거나 웹 애플리케이션에서 주문 정보를 XML로 패키지하고 처리를 위해 ActiveX 구성 요소로 보내도록 선택할 수 있습니다. 두 경우 모두 구성 요소가 주문 정보를 가져온 후 Word를 자동화하여 주문에 대한 청구서 문서를 빌드하고 표시할 수 있습니다.

ActiveX 구성 요소(AutomateWord)에는 세 가지 메서드를 노출하는 단일 클래스인 Invoice 클래스가 포함되어 있습니다.

  • GetData 메서드는 ADO(ActiveX Data Objects)를 사용하여 Northwind 샘플 데이터베이스의 주문에 대한 정보를 추출합니다. 주문 정보는 m_Data 프라이빗 멤버 변수에 저장됩니다. GetData 메서드를 호출하여 데이터 추출이 클라이언트 쪽에서 수행되도록 할 수 있습니다.
  • SendData 메서드는 MSXML(Microsoft XML)을 사용하여 호출자가 제공하는 주문 정보로 m_Data 프라이빗 멤버 변수를 채웁니다. SendData에는 주문 정보에 대한 DOMDocument 개체를 나타내는 하나의 매개 변수가 필요합니다. SendData 메서드를 호출하여 웹 페이지에서 구성 요소로 주문 정보를 보낼 수 있습니다. 이 방법을 사용하면 ASP를 사용하여 데이터 서버 쪽을 추출하고 문서 생성에 사용할 수 있는 XML 데이터 아일랜드를 클라이언트에 표시할 수 있습니다.
  • MakeInvoice 메서드는 Word Automation을 사용하여 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>

Autoword1.htm 스크립트는 ActiveX 구성 요소를 사용하여 완성된 문서를 브라우저 외부에 표시합니다. 완료된 문서를 저장하고 브라우저에 표시하도록 선택할 수도 있습니다. 그러나 이렇게 하려면 Word 문서를 디스크에 저장해야 합니다. 구성 요소는 클라이언트의 로컬 드라이브에 C:\Invoice.doc 문서를 저장할 수 있습니다. ActiveX 구성 요소는 스크립팅에 안전한 것으로 표시되므로 클라이언트에 저장을 확인하라는 메시지가 표시됩니다.

브라우저에서 완료된 문서를 표시하려면 Autoword1.htm MakeInvoice에 대한 호출을 다음으로 변경합니다.

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

Autoword2.htm SendData 메서드를 사용하여 완성된 문서를 생성하기 위해 ActiveX 구성 요소에 주문 데이터를 DOMDocument 개체로 보내는 방법을 보여 줍니다. 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 구성 요소의 자동 다운로드를 사용하도록 설정하는 것입니다. 사용자가 이러한 페이지 중 하나를 방문하여 구성 요소가 설치되지 않은 경우 구성 요소는 CODEBASE 특성에 표시된 URL의 캐비닛(CAB) 파일에서 다운로드됩니다. Internet Explorer에서 사용자의 보안 설정에 따라 먼저 다운로드를 확인하는 프롬프트를 받을 수 있습니다.

참고: Autoword.exe 포함된 CAB 파일은 Visual Basic용 패키지 및 배포 마법사를 사용하여 만들어졌습니다. 패키지의 ActiveX 구성 요소는 스크립팅 및 초기화에 안전한 것으로 표시되지만 디지털 서명되지는 않습니다.

인터넷 구성 요소 다운로드, 디지털 서명 및 구성 요소를 스크립팅 및 초기화에 안전한 것으로 표시하는 방법에 대한 자세한 내용은 다음 MSDN(Microsoft Developer Network) 웹 사이트를 참조하세요.

Authenticode를 사용하여 코드 서명 및 확인 https://msdn.microsoft.com/en-us/library/ms537364.aspx

ActiveX 컨트롤에 대한 안전한 초기화 및 스크립팅 https://msdn.microsoft.com/en-us/library/Aa751977.aspx

참조

자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료의 문서를 확인합니다.

257757 정보: 무인 실행을 위한 Office 자동화는 권장되지 않거나 지원되지 않습니다.

(c) Microsoft Corporation 2001, All Rights Reserved. 기여: 로리 비 터너, Microsoft Corporation.