как прикрепить объект ac # к листу Excel и сохранить его при сохранении книги - PullRequest
0 голосов
/ 15 марта 2011

Я создаю надстройку Excel в C #. В надстройке пользователь создает объекты запроса, затем выполняется запрос, и данные отображаются в Excel. Я хочу сохранить объект запроса и иметь возможность получить его по заданному рабочему листу, чтобы разрешить его редактирование и повторное выполнение запроса.

Я нашел следующую возможность:

public static void SetDocumentProperty(string propertyName, String str)
        {
            DeleteDocumentProperty(propertyName);
            var workbook = Globals.ThisAddIn.GetActiveWorkBook();
            workbook.CustomDocumentProperties.Add(propertyName, false, Microsoft.Office.Core.MsoDocProperties.msoPropertyTypeString, str);
        }

, который сохраняет запрос в виде строки (после сериализации объекта). Мне все еще нужен способ соединить запрос с рабочим листом, я попытался использовать имя листа - проблема в том, что имя листа может измениться. поэтому мой вопрос:

  1. Есть ли способ получить уникальный идентификатор рабочего листа?
  2. Есть ли лучший способ достичь того, что я пытаюсь сделать?

Спасибо

1 Ответ

2 голосов
/ 04 апреля 2011

Я использовал это:

public static void SetWorkSheetQuery(Microsoft.Office.Interop.Excel.Worksheet ws, EntityQuery q)
 {
                    var cp = GetCustomProperty(ws,"query");
                    if (cp == null)
                        ws.CustomProperties.Add("query", q.ToJson());
                    else cp.Value = q.ToJson();
 }

Прикрепляет объект к пользовательскому свойству рабочего листа после его сериализации. Позже его можно получить с помощью (имя свойства "query"):

private static CustomProperty GetCustomProperty(Worksheet ws, String name)
        {
            for (int i = 1; i <= ws.CustomProperties.Count; i++)
            {
                if (ws.CustomProperties.get_Item(i).Name == name)
                    return ws.CustomProperties.get_Item(i);
            }

            return null;
        }

Его можно удалить с помощью:

var cp = GetCustomProperty(ws, "query");
            if (cp != null)
                cp.Delete();
...