Duet Enterprise и Excel 2010

Duet Enterprise и Excel 2010

Текст

Автор: Джойанта Сен (Joyanta Sen) (Майкрософт, Франция)

 

В этой статье приводится пошаговое описание процедуры интеграции списка Duet Enterprise в приложение Excel 2010 с соответствующими примерами. Основная задача состоит в том, чтобы отобразить список клиентов в электронной таблице Excel 2010.

Подготовка

Чтобы использовать внешний список из внешнего типа контента в приложении VSTO Excel, необходимо выполнить следующие операции:

  • Создание внешнего списка из внешнего типа контента

 

Приложение Excel VSTO

1. Создание проекта книги VSTO с помощью Visual Studio 2010:

 

2. Создание вспомогательного класса SPHelper в папке проекта Helpers:

 

3. Добавление типа в проект в соответствующую структуру Customer в класс CommonTypes.cd в каталоге Common :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace DuetExcelWorkbook.Common

{

    public struct CustomerType

    {

        public string FirstLineName;

        public string CountryCode;

        public string AddressregionCode;

        public string AddresscityName;

 

    }

}

 

 

4. Добавление сборки объектной модели клиента:

-      C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI\

-          Добавьте  следующие две ссылки на сборки в проект:

o   Microsoft.SharePoint.Client.dll

o   Microsoft.SharePoint.Client.Runtime.dll

 -          Создание класса SPHelpers.cs в каталоге Common:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Microsoft.SharePoint.Client;

using System.Linq.Expressions;

using System.Xml;

 

namespace DuetExcelWorkbook.Helpers

{

    public static class SPHelper

    {

        public static List<CustomerType> GetCustomerList(string TargetSiteUrl, string TargetListName)

        {

            List<CustomerType> CustomerList = new List<CustomerType>();

 

            try

            {

                ClientContext clientContext = new ClientContext(TargetSiteUrl);

 

                List externalList = clientContext.Web.Lists.GetByTitle(

                    TargetListName);

 

                // Чтобы правильно построить запрос CAML и

                // ClientContext.LoadQuery,

                // требуются данные представления виртуального списка.

                // В частности, представление возвращает

                // методы и поля запроса CAML.

                clientContext.Load(

                    externalList.Views,

                    viewCollection => viewCollection.Include(

                        view => view.ViewFields,

                        view => view.HtmlSchemaXml));

 

                // Определяет число элементов, которое мы можем извлечь.

                clientContext.Load(clientContext.Site,

                    s => s.MaxItemsPerThrottledOperation);

 

                clientContext.ExecuteQuery();

 

                // Получаем первое представление.

                View targetView = externalList.Views[0];

                string method = ReadMethodFromViewXml(

                    targetView.HtmlSchemaXml);

                ViewFieldCollection viewFields = targetView.ViewFields;

 

                CamlQuery vlQuery = CreateCamlQuery(

                    clientContext.Site.MaxItemsPerThrottledOperation,

                    method,

                    viewFields);

 

                Expression<Func<ListItem, object>>[] listItemExpressions =

                    CreateListItemLoadExpressions(viewFields);

 

                ListItemCollection listItemCollection =

                    externalList.GetItems(vlQuery);

 

                // Примечание. В связи с ограничениями в данный момент нельзя использовать

                // ClientContext.Load.

                //       (получаем InvalidQueryExpressionException)

                IEnumerable<ListItem> resultData = clientContext.LoadQuery(

                    listItemCollection.Include(listItemExpressions));

 

                clientContext.ExecuteQuery();

 

                foreach (ListItem li in resultData)

                {

                    // Теперь можно использовать данные ListItem!

                    CustomerType customer = new CustomerType();

 

                    customer.FirstLineName = li["FirstLineName"].ToString();

                    //customer.AddresscityName = li["AddresscityName"].ToString();

                    //customer.AddressregionCode = li["AddressregionCode"].ToString();

                    customer.CountryCode = li["CountryCode"].ToString();

 

                    CustomerList.Add(customer);

                    Console.WriteLine("First Name: {0} Country : {1} \n", li["FirstLineName"].ToString(), li["CountryCode"].ToString());

                    // Примечание. В CamlQuery задается значение RowLimit

                    // MaxItemsPerThrottledOperation.

                    // Можно проверить наличие других строк, которые

                    // еще не были извлечены.               

                }

            }

            catch (Exception ex)

            {

 

                throw ex;

            }

 

            return CustomerList;

        }

 

        /// <summary>

        /// Анализирует viewXml и возвращает значение Method.

        /// </summary>       

        private static string ReadMethodFromViewXml(string viewXml)

        {

            XmlReaderSettings readerSettings = new XmlReaderSettings();

            readerSettings.ConformanceLevel = ConformanceLevel.Fragment;

 

            XmlReader xmlReader = XmlReader.Create(

                new StringReader(viewXml), readerSettings);

            while (xmlReader.Read())

            {

                switch (xmlReader.NodeType)

                {

                    case XmlNodeType.Element:

                        if (xmlReader.Name == "Method")

                        {

                            while (xmlReader.MoveToNextAttribute())

                            {

                                if (xmlReader.Name == "Name")

                                {

                                    return xmlReader.Value;

                                }

                            }

                        }

                        break;

                }

            }

 

            throw new Exception("Не удалось найти метод в представлении XML");

        }

 

        /// <summary>

        /// Создание запроса CAML на основе введенных данных.

        /// </summary>       

        private static CamlQuery CreateCamlQuery(

            uint rowLimit, string method, ViewFieldCollection viewFields)

        {

            CamlQuery query = new CamlQuery();

 

            XmlWriterSettings xmlSettings = new XmlWriterSettings();

            xmlSettings.OmitXmlDeclaration = true;

 

            StringBuilder stringBuilder = new StringBuilder();

            XmlWriter writer = XmlWriter.Create(

                stringBuilder, xmlSettings);

 

            writer.WriteStartElement("View");

 

            // Указывает, что требуются все элементы, независимо от уровня папки.

            writer.WriteAttributeString("Scope", "RecursiveAll");

 

            writer.WriteStartElement("Method");

            writer.WriteAttributeString("Name", method);

            writer.WriteEndElement();  // Method

 

            if (viewFields.Count > 0)

            {

                writer.WriteStartElement("ViewFields");

                foreach (string viewField in viewFields)

                {

                    if (!string.IsNullOrEmpty(viewField))

                    {

                        writer.WriteStartElement("FieldRef");

                        writer.WriteAttributeString("Name", viewField);

                        writer.WriteEndElement();  // FieldRef

                    }

                }

                writer.WriteEndElement();  // ViewFields

            }

 

            writer.WriteElementString(

                "RowLimit", rowLimit.ToString(CultureInfo.InvariantCulture));

 

            writer.WriteEndElement();  // View

 

            writer.Close();

 

            query.ViewXml = stringBuilder.ToString();

 

            return query;

        }

 

        /// <summary>

        /// Возвращает массив выражений, используемых в

        /// ClientContext.LoadQuery, для извлечения

        /// указанного поля данных из ListItem.       

        /// </summary>       

        private static Expression<Func<ListItem, object>>[]

            CreateListItemLoadExpressions(

            ViewFieldCollection viewFields)

        {

            List<Expression<Func<ListItem, object>>> expressions =

                new List<Expression<Func<ListItem, object>>>();

 

            foreach (string viewFieldEntry in viewFields)

            {

                // Примечание. Несмотря на то, что этот шаг кажется неважным,

                // и может возникнуть желание пропустить его,

                //       делать этого не следует.  Для построения выражения следует

                // использовать локальную переменную.               

                string fieldInternalName = viewFieldEntry;

 

                Expression<Func<ListItem, object>>

                    retrieveFieldDataExpression =

                    listItem => listItem[fieldInternalName];

 

                expressions.Add(retrieveFieldDataExpression);

            }

 

            return expressions.ToArray();

        }

    }

5. Теперь напишем код пользовательского интерфейса, входящий в состав кода, из которого вызывается класс объектной модели клиента.

Добавление ленты в проект:

 

 

Изменение нужных свойств ленты:

Label: Duet Enterprise
Name: tabDuet

Добавление кнопки на ленту и изменение нужных свойств: 

ControlSize: RibbonControlSizeLarge
Label: Customers
OfficeImageId: SlideMasterChartPlacehoderInsert

 6. Добавление следующего кода в функцию buttonCustomers_Click() :

private void buttonCustomers_Click(object sender, RibbonControlEventArgs e)

        {

            List<CustomerType> result = new List<CustomerType>();

 

            try

            {

                result = SPHelper.GetCustomerList("http://litware", "SAPCustomers");

 

                //string[] Names = new string[];

                //string[] Countries;

                List<string> Names = new List<string>();

                List<string> Countries = new List<string>();

                int counter = 0;

 

                // Заполнение коллекций

 

                foreach (var item in result)

                {

                    // Добавление клиентов в ListView

 

                    Names.Add(item.FirstLineName);

                    Countries.Add(item.CountryCode);

                         

                    counter++;

 

                }

 

                // Создание таблицы данных с двумя столбцами.

                System.Data.DataTable table = new DataTable();

                DataColumn column1 = new DataColumn("Name", typeof(string));

                DataColumn column2 = new DataColumn("Country", typeof(string));

                table.Columns.Add(column1);

                table.Columns.Add(column2);

 

                // Добавление четырех строк данных в таблицу.

                DataRow row;

                for (int i = 0; i < counter; i++)

                {

                    row = table.NewRow();

                    row["Name"] = Names[i];

                    row["Country"] = Countries[i];

                    table.Rows.Add(row);

                }

 

                Microsoft.Office.Tools.Excel.ListObject list1 =

                    Globals.Sheet1.Controls.AddListObject(Globals.Sheet1.Range["A1", "B4"], "list1");

 

                // Привязка объекта списка к таблице.

                list1.SetDataBinding(table);

 

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

                throw;

            }

 

        }

 

7. Запуск Visual Studio

Примечание. Убедитесь, что для запуска Visual Studio используется подходящее удостоверение пользователя. Пользователю должны быть назначены соответствующие разрешения на чтение списка клиентов.

Щелкните в ленте Duet Enterprise и нажмите кнопку «Клиенты». Отображается список клиентов, добавленный в Microsoft Excel:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Категория: Duet; службы Excel

Дата публикации: 03.02.2011 г. 09:00

Это локализованная запись блога. Исходная статья находится по адресу Duet Enterprise and Excel 2010