2013-05-12 3 views
0

Я кодирую C# (Visual Studio Express 2012) и используя ExcelIntegration. Я хочу, чтобы ExcelFunction возвратил определенный объект в ячейку. И еще я хочу, чтобы ExcelFunction принял пользовательский объект в качестве ввода.Пользовательские объекты и ExcelIntegration

Вот пример моего кода. Это не работает, ни одна из функций (CreateDog или GetName) не видна из Excel.

namespace Test 
{ 
    public class Dog 
    { 
     public Dog(string name) 
     { 
      Name = name; 
     } 

     public readonly string Name; 
    } 

    public class TestClass 
    { 
     [ExcelFunction] 
     public static Dog CreateDog(string name) 
     { 
      return new Dog(name); 
     } 

     [ExcelFunction] 
     public static string GetName(Dog dog) 
     { 
      return dog.Name; 
     } 
    } 
} 

После Ответ со вчерашнего дня я добавил словарь. Я изменил код, как показано ниже. Это работает. Теперь мой вопрос заключается в том, как сделать этот общий. Могу ли я каким-либо образом изменить код ExcelDNA, чтобы автоматически использовать этот словарь для меня?

имен ExcelIntegration { общественного класс Dog { общественных собаки (имя строки) { Name = имя; }

public readonly string Name; 
} 

public class TestClass 
{ 
    static Dictionary<string, Dog> DogStore; 

    [ExcelFunction] 
    public static string CreateDog(string name) 
    { 
     Dog dog = new Dog(name); 
     string key = dog.ToString() + "_" + DateTime.Now.Ticks.ToString(); 
     try 
     { 
      if (DogStore.ContainsKey(key) == false) DogStore.Add(key, dog); 
     } 
     catch (NullReferenceException) 
     { 
      DogStore = new Dictionary<string, Dog>(); 
      if (DogStore.ContainsKey(key) == false) DogStore.Add(key, dog); 
     } 
     return key; 
    } 

    [ExcelFunction] 
    public static string GetName(string dogKey) 
    { 
     Dog dog = DogStore[dogKey]; 
     return dog.Name; 
    } 

} 

}

ответ

0

Excel-DNA еще не имеет такого рода пользовательского маршалинга или поддержку объекта, построенный в. В зависимости от того, что вам нужно, это может быть столь же просто, как добавление некоторых оберток и функции преобразования и А.Н. объектного словаря к вашему коду, или вам может потребоваться генерировать все обертки динамически и регистрировать новые функции во время выполнения.

Cubicle Tools - это недавний проект с открытым исходным кодом, который добавляет обширный распределенный объект и модель кода поверх Excel-DNA. Но это довольно сложный проект, чтобы окунуться.

Существует очень простая реализация объектного обработчика на F # поверх описанного выше механизма RTD in this thread. (Но этот код можно сделать намного лучше с текущей версией Excel-DNA.)

Если вы просто ищете какое-то руководство, а ваши «Собаки» не слишком изящны, то Excel-DNA Google group, вероятно, лучшее место для обсуждения.

+0

Привет, большое спасибо за ответ. Я изменил код, чтобы добавить словарь (отредактировал мой оригинальный пост с обновленным кодом). Я несколько следующих вопросов: 1. Могу ли я сделать это общее? Могу ли я изменить ExcelDNA, чтобы сделать это для меня? 2. Если я создаю много собак, это может взорваться в памяти, я думаю. На самом деле нет необходимости сохранять историю собак в одной и той же ячейке. Можно ли это сделать каким-то умным способом? – Samuel

+0

Поскольку ваш ключ меняется каждый раз, каждый recalc вашей функции сделает новую собаку. Недостаточно ли имени для идентификации уникальной собаки? – Govert