Использование веб-службы XML с помощью ASP.NET из макроса Office VBA в Word или Excel

Аннотация

В этой статье показано, как использовать веб-службу XML с ASP.NET из макроса Visual Basic для приложений (VBA) в Word или Excel.

Дополнительная информация

Чтобы успешно взаимодействовать с веб-службой XML с помощью ASP.NET из макроса Office, набор средств SOAP должен быть установлен на клиентском компьютере, на котором выполняется макрос. Соответственно, для демонстрации в этой статье требуется набор средств SOAP. Дополнительные сведения о наборе средств SOAP, включая инструкции по загрузке.

Создание веб-службы XML с помощью ASP.NET

  1. Запустите Microsoft Visual Studio .NET. В меню "Файл" нажмите кнопку "Создать" и выберите пункт "Проект". В диалоговом окне "Новый проект" щелкните "Проекты Visual Basic" в разделе "Типы проектов", а затем выберите веб-службу XML с ASP.NET в разделе "Шаблоны". Приведите проекту имя SQLQuery и нажмите кнопку "ОК". Форма проектирования для Service1 отображается по умолчанию.

  2. В меню "Вид" щелкните "Код", чтобы отобразить окно кода для Service1.

  3. Вставьте следующий код в верхней части окна кода:

    Imports System.Data.SqlClient
    
  4. Вставьте следующий код в класс Service1 (перед классом End).

    Примечание Перед выполнением <> этого кода необходимо изменить имя пользователя и пароль =<надежный> пароль на правильные значения. Убедитесь, что идентификатор пользователя имеет соответствующие разрешения для выполнения этой операции в базе данных.

    Private Const strConn = "User ID=<username>;Password=<strong password>;Initial Catalog=pubs;Data Source=localhost"
    
    <WebMethod()> Public Function GetIDs() As String()
        Dim i As Integer
    
    ' Create an open connection.
        Dim oConn As New SqlConnection(strConn)
        oConn.Open()
    
    Dim oDataset As New System.Data.DataSet()
        ' Execute the query.
        Dim oAdapter As New SqlDataAdapter("SELECT au_id FROM authors", oConn)
        ' Fill the dataset.
        oAdapter.Fill(oDataset)
    
    Dim s(oDataset.Tables(0).Rows.Count - 1) As String
        ' Create an array of IDs.
        For i = 0 To oDataset.Tables(0).Rows.Count - 1
            s(i) = oDataset.Tables(0).Rows(i).ItemArray.GetValue(0)
        Next i
        ' Return the array.
        Return s
    End Function
    
    <WebMethod()> Public Function QueryDatabase(ByVal sID As String) As String()
        Dim i As Integer
    
    ' Create an open a connection.
        Dim oConn As New SqlConnection(strConn)
        oConn.Open()
    
    Dim oCommand As New SqlCommand("SELECT * FROM authors WHERE au_id='" + sID + "'", oConn)
        Dim oReader As SqlDataReader
        ' Execute the query and assign results to a SqlDataReader.
        oReader = oCommand.ExecuteReader()
        oReader.Read()
    
    Dim s(7) As String
        ' Build an array of results.
        For i = 0 To 7
            s(i) = CType(oReader.GetValue(i), String)
        Next
        ' Return the array.
        Return s
    End Function
    
    

Примечание.

Измените константу strConn в коде, чтобы она была допустимой строкой подключения для SQL Server pubs.

Тестирование веб-службы

  1. Нажмите клавишу F5, чтобы создать и запустить решение веб-службы. При запуске веб-службы из интегрированной среды разработки (IDE) .NET Microsoft Internet Explorer загружает Service1.asmx из вашего решения.

  2. Протестируйте метод GetIDs. Для этого щелкните гиперссылку GetIDs и нажмите кнопку "Вызвать".

    Метод возвращает список идентификаторов авторов, извлеченных веб-службой из базы данных pubs. Результаты отображаются в браузере в формате XML.

  3. Закройте окно браузера или окна и вернитесь в Visual Studio.

  4. Чтобы запустить веб-службу, нажмите клавишу F5 еще раз.

  5. Протестируйте метод QueryDatabase. Для этого щелкните гиперссылку QueryDatabase, введите 409-56-7008 для параметра sID и нажмите кнопку "Вызвать".

    Метод возвращает сведения для автора с идентификатором 409-56-7008. Результаты отображаются в браузере в формате XML.

  6. Закройте окно браузера или окна, чтобы завершить веб-службу.

Использование веб-службы из Word

В этом примере используется шаблон "Изящная факсимила", который поставляется вместе с Word. Этот пример не работает без этого шаблона. Чтобы установить шаблон, выполните следующие действия.

  1. Запустите мастер установки Office.
  2. В мастере нажмите кнопку "Добавить или удалить компоненты".
  3. В разделе "Компоненты для установки" разверните Microsoft Excel для Windows. Щелкните "Шаблоны электронной таблицы", выберите команду "Выполнить с моего компьютера" и нажмите кнопку "Обновить".

Чтобы использовать веб-службу из Word, выполните следующие действия.

  1. Запустите Word. По умолчанию создается пустой документ.

  2. В меню "Сервис" щелкните "Макрос" и выберите редактор Visual Basic. В меню "Вставка" щелкните "Модуль", чтобы вставить пустой модуль кода.

  3. В меню **Сервис *** выберите пункт " Ссылки".

  4. В диалоговом окне "Ссылки" выберите библиотеку типов MICROSOFT SOAP и нажмите кнопку "ОК ".

    Примечание Если библиотека типов MICROSOFT SOAP недоступна в диалоговом окне " Ссылки", нажмите кнопку " Обзор". В диалоговом окне "Добавление ссылки" перейдите в каталог C:\Program Files\Common Files\MSSoap\Binaries и выберите mssoap1.dll. Нажмите кнопку " Открыть" и нажмите кнопку "ОК".

  5. Вставьте следующий код в модуль кода:

    Public Const sServer = "localhost"
    
    Sub GenerateForm(sID As String)
        Dim oSOAPClient As Object
    
    On Error GoTo errhand
        Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
        oSOAPClient.mssoapinit "http://" + sServer + "/SQLQuery/Service1.asmx?wsdl", "Service1", "Service1Soap"
    
    Dim arrTemp() As String
        arrTemp = oSOAPClient.QueryDatabase(sID)
    
    Dim oDoc As Word.Document
    
    Set oDoc = Application.Documents.Add("Elegant Fax.dot")
        oDoc.Bookmarks("Company").Range.Text = arrTemp(2) + " " + arrTemp(1) + vbCrLf + _
                arrTemp(4) + vbCrLf + arrTemp(5) + ", " + arrTemp(6) + "  " + arrTemp(7) + vbCrLf + _
                arrTemp(3)           
        Exit Sub
    errhand:
        MsgBox "Error #" + Err.Number + ": " + Err.Description
    End Sub
    
    Sub ShowForm()
      ' Show the dialog box to the user.
      UserForm1.Show
    End Sub
    
    

    ПРИМЕЧАНИЕ Измените константу sServer, чтобы она указывала на сервер, на котором размещена только что созданная веб-служба.

  6. В меню "Вставка" щелкните UserForm, чтобы вставить пустую форму пользователя.

  7. Поместите в форму большой список и кнопку команды.

  8. В меню "Вид" щелкните "Код", чтобы изменить окно кода для пользовательской формы.

  9. Замените содержимое окна кода следующим кодом:

    Private Sub CommandButton1_Click()
        ' Generate a FAX based on the ID.
        GenerateForm ListBox1.List(ListBox1.ListIndex)
        UserForm1.Hide
    End Sub
    
    Private Sub UserForm_Initialize()
        Dim oSOAPClient As Object
    
    ' Create a SOAP client.
        Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
        ' Initialize the SOAP client to the Web service.
        oSOAPClient.mssoapinit "http://" + Module1.sServer + "/SQLQuery/Service1.asmx?wsdl", "Service1", "Service1Soap"
    
    Dim arrTemp() As String
        ' Get an array of IDs.
        arrTemp = oSOAPClient.GetIDs()
    
    ' Fill the list box with IDs.
        For i = 0 To UBound(arrTemp)
          ListBox1.AddItem arrTemp(i)
        Next
    End Sub
    
  10. Закройте редактор VBA, чтобы вернуться к документу.

  11. В меню "Сервис" щелкните "Макрос", а затем — "Макросы". В диалоговом окне "Макросы" запустите макрос ShowForm, чтобы отобразить список идентификаторов. Выберите идентификатор из списка и нажмите кнопку команды, чтобы создать документ факса с информацией этого пользователя.

Использование веб-службы из Excel

В этом примере используется шаблон "Счет за продажу", который поставляется вместе с Excel. Этот пример не работает без этого шаблона. Чтобы установить шаблон, выполните следующие действия.

  1. Запустите мастер установки Office.
  2. В мастере нажмите кнопку "Добавить или удалить компоненты".
  3. В разделе "Компоненты для установки" разверните Microsoft Excel для Windows, разверните шаблоны электронных таблиц и щелкните "Счет за продажу". Нажмите кнопку "Выполнить с моего компьютера" и нажмите кнопку "Обновить".

Чтобы использовать веб-службу из Excel, выполните следующие действия.

  1. Запустите Excel. Пустая книга создается по умолчанию.

  2. В меню "Сервис" щелкните "Макрос" и выберите редактор Visual Basic. В меню "Вставка" щелкните "Модуль", чтобы вставить пустой модуль кода.

  3. В меню **Сервис *** выберите пункт " Ссылки".

  4. В диалоговом окне "Ссылки" выберите библиотеку типов MICROSOFT SOAP и нажмите кнопку "ОК ".

    Примечание Если библиотека типов MICROSOFT SOAP недоступна в диалоговом окне " Ссылки", нажмите кнопку " Обзор". В диалоговомокне "Добавление ссылки" перейдите в каталог C:\Program Files\Common Files\MSSoap\Binaries и выберите mssoap1.dll. Нажмите кнопку " Открыть" и нажмите кнопку "ОК".

  5. Вставьте следующий код в модуль кода:

    Const sTemplatePath = "C:\Microsoft Office\Templates\1033\Sales Invoice.xlt"
    Public Const sServer = "localhost"
    
    Sub GenerateForm(sID As String)
        Dim oSOAPClient As Object
    
    On Error GoTo errhand
        Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
        oSOAPClient.mssoapinit "http://" + sServer + "/SQLQuery/Service1.asmx?wsdl", "Service1", "Service1Soap"
    
    Dim arrTemp() As String
        arrTemp = oSOAPClient.QueryDatabase(sID)
    
    Dim oBook As Excel.Workbook
    
    Set oBook = Application.Workbooks.Add(sTemplatePath)
        With oBook.ActiveSheet
          If If CInt(Application.Version) = 10 Or CInt(Application.Version) = 11 Then
            .Range("D13").Value = arrTemp(2) + " " + arrTemp(1)
            .Range("D14").Value = arrTemp(4)
            .Range("D15").Value = arrTemp(5)
            .Range("F15").Value = arrTemp(6)
            .Range("H15").Value = arrTemp(7)
            .Range("D16").Value = arrTemp(3)
    
    .Range("M13").Value = CStr(Date)
            .Range("C19").Value = "45.8"
            .Range("D19").Value = "Consulting hours"
            .Range("L19").Value = "75"
          ElseIf CInt(Application.Version) = 9 Then
            .Range("data5").Value = arrTemp(2) + " " + arrTemp(1)
            .Range("data6").Value = arrTemp(4)
            .Range("data7").Value = arrTemp(5)
            .Range("data8").Value = arrTemp(6)
            .Range("data9").Value = arrTemp(7)
            .Range("data10").Value = arrTemp(3)
    
    .Range("data11").Value = "45.8"
            .Range("data12").Value = "Consulting hours"
            .Range("data13").Value = "75"
          End If
        End With
        Exit Sub
    errhand:
        MsgBox "Error #" + Err.Number + ": " + Err.Description
    End Sub
    
    Sub ShowForm()
      ' Show the dialog box to the user.
      UserForm1.Show
    End Sub
    
    

    Примечание Измените константу sServer, чтобы она указывала на сервер, на котором размещена только что созданная веб-служба. Измените константу sTemplatePath, указав правильный путь к файлу счета. Для Office 2000 этот файл по умолчанию находится в папке C:\Microsoft Office\Templates\1033\Invoice.xlt. Для Office XP по умолчанию используется папка C:\Microsoft Office\Templates\1033\Sales Invoice.xlt.

  6. В меню "Вставка" щелкните UserForm, чтобы вставить пустую форму пользователя.

  7. Поместите в форму большой список и кнопку команды.

  8. В меню "Вид" щелкните "Код", чтобы изменить окно кода для пользовательской формы.

  9. Замените содержимое окна кода следующим кодом:

    Private Sub CommandButton1_Click()
        ' Generate a FAX based on the ID.
        GenerateForm ListBox1.List(ListBox1.ListIndex)
        UserForm1.Hide
    End Sub
    
    Private Sub UserForm_Initialize()
        Dim oSOAPClient As Object
    
    ' Create a SOAP client.
        Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
        ' Initialize the SOAP client to the Web service.
        oSOAPClient.mssoapinit "http://" + Module1.sServer + "/SQLQuery/Service1.asmx?wsdl", "Service1", "Service1Soap"
    
    Dim arrTemp() As String
        ' Get an array of IDs.
        arrTemp = oSOAPClient.GetIDs()
    
    ' Fill the list box with IDs.
        For i = 0 To UBound(arrTemp)
          ListBox1.AddItem arrTemp(i)
        Next
    End Sub
    
    
  10. Закройте редактор VBA, чтобы вернуться к книге.

  11. В меню "Сервис" щелкните "Макрос", а затем — "Макросы". В диалоговом окне "Макросы" запустите макрос ShowForm, чтобы отобразить список идентификаторов. Выберите идентификатор из списка и нажмите кнопку команды, чтобы создать счет с данными этого пользователя.

Ссылки

Дополнительные сведения о веб-службах см. в статье в базе знаний Майкрософт:

301273 как написать простую веб-службу с помощью Visual Basic .NET