Сценарии и примеры внешней автоматизации

Члены, предоставляемые основной сборкой взаимодействия Microsoft Office InfoPath (Microsoft.Office.Interop.InfoPath.dll) и сборкой взаимодействия InfoPath XML (Microsoft.Office.Interop.InfoPath.Xml.dll), поддерживают запись управляемого кода для автоматизации Microsoft Office InfoPath 2007.

Создание ссылок на сборки взаимодействия основную Microsoft Office InfoPath и InfoPath XML

Чтобы записать управляемый код для автоматизации InfoPath, необходимо создать ссылки на основную сборку взаимодействия Microsoft Office InfoPath и на сборку взаимодействия InfoPath XML. Основная сборка взаимодействия Microsoft Office InfoPath обеспечивает поддержку взаимодействия с объектной моделью COM, предоставляемой файлом IPEDITOR.DLL с использованием членов пространства имен Microsoft.Office.Interop.InfoPath. Сборка взаимодействия InfoPath XML обеспечивает поддержку взаимодействия с объектной моделью COM, предоставляемой службой Microsoft XML Core Services (MSXML) 5.0 для Microsoft Office с использованием членов пространства имен Microsoft.Office.Interop.InfoPath.Xml.

Предупреждение

Пользователи приложений управляемого кода, автоматизирующих InfoPath, должны установить на своих компьютерах Office InfoPath 2007, основную сборку взаимодействия Microsoft Office InfoPath и сборку взаимодействия InfoPath XML. При стандартной установке InfoPath параметру Поддержка программирования .NET в программе установки Office InfoPath 2007 присваивается значение Запускать с моего компьютера. В результате, когда устанавливаются распространяемая версия .NET Framework 1.1 или комплект разработки программного обеспечения (SDK) .NET Framework 1.1, эти сборки взаимодействия также будут установлены по умолчанию. Если эти сборки взаимодействия недоступны на компьютере пользователя, необходимо подтвердить, что программа .NET Framework 1.1 установлена, затем запустить команду Установка и удаление программ из Панели управления и присвоить параметру Поддержка программирования .NET программы установки Office InfoPath 2007 значение Запускать с моего компьютера.

В следующей процедуре описывается, как установить ссылки на основную сборку взаимодействия Microsoft Office InfoPath и на сборку взаимодействия InfoPath XML в проекте Visual Studio.

Чтобы установить ссылку на основную сборку взаимодействия Microsoft.Office.Interop.InfoPath, установите ссылку на библиотеку типов Microsoft InfoPath 2.0 на вкладке COM диалогового окна Добавление ссылки. Даже несмотря на то, что ссылка задается из вкладки COM, она устанавливается на основную сборку взаимодействия Microsoft.Office.Interop.InfoPath.dll, которая установлена в глобальном кэше сборок (GAC) программой установки InfoPath.

Установка ссылки на основную сборку взаимодействия Microsoft.Office.Interop.InfoPath

  1. Откройте проект управляемого кода Visual Studio.

  2. В Обозревателе решений щелкните правой кнопкой мыши Ссылки, затем щелкните Добавить ссылку.

  3. На вкладке COM дважды щелкните Библиотека типов Microsoft.InfoPath 2.0 и нажмите кнопку OK.

Чтобы установить ссылку на сборку взаимодействия Microsoft.Office.Interop.InfoPath.Xml, перейдите к файлу Microsoft.Office.Interop.InfoPath.Xml.dll, установленному по умолчанию в папке <диск>:\Program Files\Microsoft Office\OFFICE12. Несмотря на то, что копия сборки определена в локальной файловой системе, эта процедура устанавливает ссылку на сборку Microsoft.Office.Interop.InfoPath.Xml.dll, установленную в глобальном кэше сборок (GAC) программой установки InfoPath.

Установка ссылки на сборку взаимодействия Microsoft.Office.Interop.InfoPath.Xml

  1. Откройте или создайте проект управляемого кода Visual Studio, например, Консольное приложение или Windows-приложение.

  2. В Обозревателе решений щелкните правой кнопкой мыши Ссылки, затем щелкните Добавить ссылку.

  3. На вкладке .NET выберите Обзор, перейдите к папке <диск>:\Program Files\Microsoft Office\OFFICE12 и щелкните файл Microsoft.Office.Interop.InfoPath.Xml.dll.

  4. Нажмите кнопку OK.

Автоматизация изменения значения поля

Предположим, что один из клиентов пользователя шаблона формы отчета о продажах InfoPath недавно изменил свое имя с "Компания А" на "Компания Б." Разработчика просят написать программу, которая автоматически обновит формы отчетов о продажах, сохраненные из этого шаблона формы, чтобы отразить изменение имени. В следующем сценарии предполагается наличие формы, содержащей надпись, привязанную к полю с именем customerName.

Создание образцов шаблона формы и формы

  1. Откройте InfoPath и создайте новый пустой шаблон формы.

  2. Добавьте к форме элемент управления Текстовое поле и назовите поле, привязанное к этому элементу управления, customerName.

  3. Опубликуйте шаблон формы в папке с именем C:\Test и примите предлагаемое по умолчанию имя Template1.

  4. Откройте шаблон формы, добавьте имя "Компания А" к текстовому полю, связанному с полем customerName и сохраните эту форму под именем "Form1".

Создайте консольное приложение управляемого кода для изменения имени с "Компания А" на "Компания Б"

  1. Откройте Visual Studio и создайте новое консольное приложение Visual C# или Visual Basic с именем UpdateCustomer.

  2. Создайте ссылки на основную сборку взаимодействия Microsoft Office InfoPath и сборку взаимодействия InfoPath XML как описано выше.

  3. Добавьте к файлу Program.cs или Module1.vb следующий код:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.Office.Interop.InfoPath;
    using Microsoft.Office.Interop.InfoPath.Xml;
    
    namespace UpdateCustomer
    {
       class Program
       {
          static void Main(string[] args)
          {
    
             // Create an InfoPath Application object.
             Application myApp = 
                new Microsoft.Office.Interop.InfoPath.Application();
    
             // Get a reference the XDocuments collection 
             // and open the sample form.
             XDocumentsCollection myXDocs = myApp.XDocuments;
             XDocument myXDoc = myXDocs.Open("C:\\Test\\Form1.xml",
                (int) XdDocumentVersionMode.xdFailOnVersionOlder);
    
             // Access the XML DOM for the underlying XML document using
             // the DOM property. Note that you must cast to the 
             // IXMLDOMDocument2 type from the
             // Microsoft.Office.Interop.InfoPath.Xml namespace
             // to access the XML DOM.
             IXMLDOMDocument2 myXMLDoc = myXDoc.DOM as IXMLDOMDocument2;
    
             // Set the MSXML SelectionNamespaces property to the my
             // namespace of the form. IMPORTANT:Replace the namespace 
             // alias with that of your sample form.
             myXMLDoc.setProperty("SelectionNamespaces",
    "xmlns:my='https://schemas.microsoft.com/office/infopath/2003/myXSD/2006-09-06T23:17:34'");
    
             // Select all instances of customerName that contain 
             //'Company A'.
             IXMLDOMNodeList myNames = 
                myXMLDoc.selectNodes(
                "//my:customerName[. = 'Company A']");
    
             // Check to determine if any nodes were returned.
             if (myNames.length < 1)
             Console.WriteLine(
                "No elements containing 'Company A' were found.");
    
             // Loop through the list updating to 'Company B'.
             IXMLDOMNode myName = myNames.nextNode();
    
             while (myName != null)
             {
                myName.text = "Company B";
                myName = myNames.nextNode();
    
             }
    
             // Save the updated form as Form2.xml and close out.
             myXDoc.SaveAs("C:\\Test\\Form2.xml");
             myXDocs.Close(0);
             myApp.Quit(false);
             Console.WriteLine("Finished!");
    
          }
       }
    }
    
    Imports Microsoft.Office.Interop.InfoPath
    Imports Microsoft.Office.Interop.InfoPath.Xml
    Module Module1
       Sub Main()
          ' Create an InfoPath Application object.
          Dim myApp As Application = _
             New Microsoft.Office.Interop.InfoPath.Application()
    
          ' Get a reference the XDocuments collection 
          ' and open the sample form.
          Dim myXDocs As XDocumentsCollection = myApp.XDocuments
          Dim myXDoc As XDocument = myXDocs.Open( _
             "C:\\Test\\Form1.xml", _
             XdDocumentVersionMode.xdFailOnVersionOlder)
    
          ' Access the XML DOM for the underlying XML document using
          ' the DOM property. Note that you must cast to the 
          ' IXMLDOMDocument2 type from the
          ' Microsoft.Office.Interop.InfoPath.Xml namespace
          ' to access the XML DOM.
          Dim myXMLDoc As IXMLDOMDocument2 = _
             DirectCast(myXDoc.DOM, IXMLDOMDocument2)
    
          ' Set the MSXML SelectionNamespaces property to the my
          ' namespace of the form. IMPORTANT:Replace the namespace 
          ' alias with that of your sample form.
          myXMLDoc.setProperty("SelectionNamespaces", _
    "xmlns:my='https://schemas.microsoft.com/office/infopath/2003/myXSD/2006-09-06T23:17:34'")
    
          ' Select all instances of customerName that contain 
          ''Company A'.
          Dim myNames As IXMLDOMNodeList = _
       myXMLDoc.selectNodes("//my:customerName[. = 'Company A']")
    
          ' Check to determine if any nodes were returned.
          If (myNames.length < 1) Then
             Console.WriteLine( _
                "No elements containing 'Company A' were found.")
          Else
             ' Loop through the list updating to 'Company B'.
             Dim myName As IXMLDOMNode = myNames.nextNode()
             While (myName IsNot Nothing)
                myName.text = "Company B"
                myName = myNames.nextNode()
             End While
          End If
    
          ' Save the updated form as Form2.xml and close out.
          myXDoc.SaveAs("C:\\Test\\Form2.xml")
          myXDocs.Close(0)
          myApp.Quit(False)
          Console.WriteLine("Finished!")
       End Sub
    End Module
    
  4. Выберите Начать отладку в меню Отладка для компиляции и запуска консольного приложения.

    Это приложение откроет форму, сохраненную как Form1.xml, найдет все элементы customerName, содержащие значение Компания А, и изменит его на Компания Б. После завершения этой операции будет сохранена новая копия данной формы под именем Form2.xml в папке C:\Test.

    ЗаметкаЗаметка

    Чтобы определить значение атрибута xmlns:my namespace шаблона формы для установки свойства SelectionNamespaces, откройте этот шаблон формы в InfoPath, откройте область задач Источник данных, щелкните правой кнопкой мыши поле customerName и выберите Свойства. Значение пространства имен отображается на вкладке Сведения. Можно также определить это значение, открыв файл Form1.xml в текстовом редакторе.

Автоматизация открытия формы и заполнения значений полей

Следующий пример иллюстрирует автоматическое открытие пустой формы и заполнение полей имени, фамилии и адреса в форме. Этот сценарий предполагает, что форма содержит три надписи, привязанных к полям с именами Имя, Фамилия и Адрес.

Создание образцов шаблона формы и формы

  1. Откройте InfoPath и создайте пустую форму.

  2. Добавьте к форме три элемента управления и назовите поля, связанные с этими элементами управления: Имя, Фамилия и Адрес. Добавьте любые другие поля по желанию.

  3. Опубликуйте шаблон формы в папке с именем C:\Temp и примите предлагаемое по умолчанию имя Template1.

  4. Откройте шаблон формы и сохраните пустую форму под именем "Form1" в папке C:\Temp.

Создайте консольное приложение управляемого кода для открытия формы и заполнения полей

  1. Откройте Visual Studio и создайте новое консольное приложение Visual C# или Visual Basic с именем OpenForm.

  2. Создайте ссылки на основную сборку взаимодействия Microsoft Office InfoPath и сборку взаимодействия InfoPath XML как описано выше.

  3. Добавьте к файлу Program.cs или Module1.vb следующий код:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.Office.Interop.InfoPath;
    using Microsoft.Office.Interop.InfoPath.Xml;
    
    namespace OpenForm
    {
       class Program
       {
          static void Main(string[] args)
          {
    
             // Create an InfoPath Application object.
             Application myApp=
                new Microsoft.Office.Interop.InfoPath.Application();
    
             // Create an InfoPath XDocument variable and open 
             // the blank form.
             XDocument myXDoc = myApp.XDocuments.Open(
                "c:\\temp\\Form1.xml",
                (int) XdDocumentVersionMode.xdFailOnVersionOlder);
    
             // Create an IXMLDOMDocument2 variable and access 
             // the XML DOM from the underlying XML document
             // using the DOM property of the XDocument object. 
             // Note that you must cast to IXMLDOMDocument2 to do so.
             IXMLDOMDocument2 doc= myXDoc.DOM as IXMLDOMDocument2;
    
             // Set the MSXML SelectionNamespaces property to the my
             // namespace of the form. IMPORTANT:Replace the namespace
             // with that of your sample form.
             doc.setProperty("SelectionNamespaces","xmlns:my='https://schemas.microsoft.com/office/infopath/2003/myXSD/2006-09-06T23:17:34'");
    
             // Pre-populate the fields with specified values.
             doc.selectSingleNode("//my:FirstName").text="My Name";
             doc.selectSingleNode("//my:LastName").text="My LastName";
             doc.selectSingleNode("//my:Address").text="My Address";
    
             // Save the form, leaving InfoPath open.
             myXDoc.Save();
    
          }
       }
    }
    
    Imports Microsoft.Office.Interop.InfoPath
    Imports Microsoft.Office.Interop.InfoPath.Xml
    
    Module Module1
    
       Sub Main()
          ' Create an InfoPath Application object.
          Dim myApp As Application = _
             New Microsoft.Office.Interop.InfoPath.Application
    
          ' Create an InfoPath XDocument variable and open 
          ' the blank form.
          Dim myXDoc As XDocument = myApp.XDocuments.Open( _
             "c:\\temp\\Form1.xml", _
             XdDocumentVersionMode.xdFailOnVersionOlder)
    
          ' Create an IXMLDOMDocument2 variable and access 
          ' the XML DOM from the underlying XML document
          ' using the DOM property of the XDocument object.
          Dim doc As IXMLDOMDocument2 = myXDoc.DOM
    
          ' Set the MSXML SelectionNamespaces property to the my
          ' namespace of the form. IMPORTANT:Replace the namespace
          ' with that of your sample form.
          doc.setProperty("SelectionNamespaces", "xmlns:my='https://schemas.microsoft.com/office/infopath/2003/myXSD/2006-09-06T23:17:34'")
    
          ' Pre-populate the fields with specified values.
          doc.selectSingleNode("//my:FirstName").text = "My Name"
          doc.selectSingleNode("//my:LastName").text = "My LastName"
          doc.selectSingleNode("//my:Address").text = "My Address"
    
          ' Save the form, leaving InfoPath open.
          myXDoc.Save()
    
       End Sub
    
    End Module
    
  4. В меню Отладка выберите Начать отладку, чтобы выполнить компиляцию и запустить консольное приложение.

    Это приложение откроет форму, сохраненную как Form1.xml и заполните поля Имя, Фамилия и Адрес значениями, определенными в коде, затем сохраните форму, не закрывая InfoPath.

    ЗаметкаЗаметка

    Чтобы определить значение атрибута xmlns:my namespace шаблона формы для установки свойства SelectionNamespaces, откройте этот шаблон формы в InfoPath, откройте область задач Источник данных, щелкните правой кнопкой мыши поле Имя и выберите Свойства. Значение пространства имен отображается на вкладке Сведения. Можно также определить это значение, открыв файл Form1.xml в текстовом редакторе.

См. также

Концепции

О сборке Microsoft Office InfoPath Primary Interop Assembly
О сборке InfoPath XML Interop Assembly