Использование веб-службы 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
Запустите Microsoft Visual Studio .NET. В меню "Файл" нажмите кнопку "Создать" и выберите пункт "Проект". В диалоговом окне "Новый проект" щелкните "Проекты Visual Basic" в разделе "Типы проектов", а затем выберите веб-службу XML с ASP.NET в разделе "Шаблоны". Приведите проекту имя SQLQuery и нажмите кнопку "ОК". Форма проектирования для Service1 отображается по умолчанию.
В меню "Вид" щелкните "Код", чтобы отобразить окно кода для Service1.
Вставьте следующий код в верхней части окна кода:
Imports System.Data.SqlClient
Вставьте следующий код в класс 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.
Тестирование веб-службы
Нажмите клавишу F5, чтобы создать и запустить решение веб-службы. При запуске веб-службы из интегрированной среды разработки (IDE) .NET Microsoft Internet Explorer загружает Service1.asmx из вашего решения.
Протестируйте метод GetIDs. Для этого щелкните гиперссылку GetIDs и нажмите кнопку "Вызвать".
Метод возвращает список идентификаторов авторов, извлеченных веб-службой из базы данных pubs. Результаты отображаются в браузере в формате XML.
Закройте окно браузера или окна и вернитесь в Visual Studio.
Чтобы запустить веб-службу, нажмите клавишу F5 еще раз.
Протестируйте метод QueryDatabase. Для этого щелкните гиперссылку QueryDatabase, введите 409-56-7008 для параметра sID и нажмите кнопку "Вызвать".
Метод возвращает сведения для автора с идентификатором 409-56-7008. Результаты отображаются в браузере в формате XML.
Закройте окно браузера или окна, чтобы завершить веб-службу.
Использование веб-службы из Word
В этом примере используется шаблон "Изящная факсимила", который поставляется вместе с Word. Этот пример не работает без этого шаблона. Чтобы установить шаблон, выполните следующие действия.
- Запустите мастер установки Office.
- В мастере нажмите кнопку "Добавить или удалить компоненты".
- В разделе "Компоненты для установки" разверните Microsoft Excel для Windows. Щелкните "Шаблоны электронной таблицы", выберите команду "Выполнить с моего компьютера" и нажмите кнопку "Обновить".
Чтобы использовать веб-службу из Word, выполните следующие действия.
Запустите Word. По умолчанию создается пустой документ.
В меню "Сервис" щелкните "Макрос" и выберите редактор Visual Basic. В меню "Вставка" щелкните "Модуль", чтобы вставить пустой модуль кода.
В меню **Сервис *** выберите пункт " Ссылки".
В диалоговом окне "Ссылки" выберите библиотеку типов MICROSOFT SOAP и нажмите кнопку "ОК ".
Примечание Если библиотека типов MICROSOFT SOAP недоступна в диалоговом окне " Ссылки", нажмите кнопку " Обзор". В диалоговом окне "Добавление ссылки" перейдите в каталог C:\Program Files\Common Files\MSSoap\Binaries и выберите mssoap1.dll. Нажмите кнопку " Открыть" и нажмите кнопку "ОК".
Вставьте следующий код в модуль кода:
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, чтобы она указывала на сервер, на котором размещена только что созданная веб-служба.
В меню "Вставка" щелкните UserForm, чтобы вставить пустую форму пользователя.
Поместите в форму большой список и кнопку команды.
В меню "Вид" щелкните "Код", чтобы изменить окно кода для пользовательской формы.
Замените содержимое окна кода следующим кодом:
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
Закройте редактор VBA, чтобы вернуться к документу.
В меню "Сервис" щелкните "Макрос", а затем — "Макросы". В диалоговом окне "Макросы" запустите макрос ShowForm, чтобы отобразить список идентификаторов. Выберите идентификатор из списка и нажмите кнопку команды, чтобы создать документ факса с информацией этого пользователя.
Использование веб-службы из Excel
В этом примере используется шаблон "Счет за продажу", который поставляется вместе с Excel. Этот пример не работает без этого шаблона. Чтобы установить шаблон, выполните следующие действия.
- Запустите мастер установки Office.
- В мастере нажмите кнопку "Добавить или удалить компоненты".
- В разделе "Компоненты для установки" разверните Microsoft Excel для Windows, разверните шаблоны электронных таблиц и щелкните "Счет за продажу". Нажмите кнопку "Выполнить с моего компьютера" и нажмите кнопку "Обновить".
Чтобы использовать веб-службу из Excel, выполните следующие действия.
Запустите Excel. Пустая книга создается по умолчанию.
В меню "Сервис" щелкните "Макрос" и выберите редактор Visual Basic. В меню "Вставка" щелкните "Модуль", чтобы вставить пустой модуль кода.
В меню **Сервис *** выберите пункт " Ссылки".
В диалоговом окне "Ссылки" выберите библиотеку типов MICROSOFT SOAP и нажмите кнопку "ОК ".
Примечание Если библиотека типов MICROSOFT SOAP недоступна в диалоговом окне " Ссылки", нажмите кнопку " Обзор". В диалоговомокне "Добавление ссылки" перейдите в каталог C:\Program Files\Common Files\MSSoap\Binaries и выберите mssoap1.dll. Нажмите кнопку " Открыть" и нажмите кнопку "ОК".
Вставьте следующий код в модуль кода:
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.
В меню "Вставка" щелкните UserForm, чтобы вставить пустую форму пользователя.
Поместите в форму большой список и кнопку команды.
В меню "Вид" щелкните "Код", чтобы изменить окно кода для пользовательской формы.
Замените содержимое окна кода следующим кодом:
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
Закройте редактор VBA, чтобы вернуться к книге.
В меню "Сервис" щелкните "Макрос", а затем — "Макросы". В диалоговом окне "Макросы" запустите макрос ShowForm, чтобы отобразить список идентификаторов. Выберите идентификатор из списка и нажмите кнопку команды, чтобы создать счет с данными этого пользователя.
Ссылки
Дополнительные сведения о веб-службах см. в статье в базе знаний Майкрософт:
301273 как написать простую веб-службу с помощью Visual Basic .NET