ExcelDNA: команды с параметрами, возвращаемые типы данных - PullRequest
1 голос
/ 10 марта 2011

Прошу прощения, если вы видели что-то подобное раньше, я как можно лучше обыскивал форумы. Я пытаюсь получить окончательный ответ на вопрос, который, как мне кажется, я видел на другом форуме, - я просто очень надеюсь, что неправильно понял ответ.

Итак, я хочу написать подпрограммы / функции vba, которые принимают параметры и извлекают данные из базы данных SQL через слой бизнес-логики C # и ExcelDNA.

Уровень C # является частью решения .Net, которое собирает запросы от нескольких приложений к нескольким базам данных. Конфиг управляется централизованно, а объекты DataAccess создаются во время выполнения на фабрике.

Типы возвращаемых данных могут различаться в зависимости от запрашивающего приложения - одни и те же данные могут запрашиваться в виде словаря, таблицы данных и т. Д. В зависимости от разрешения / доступа пользователя, входных параметров и т. Д. Бизнес-уровень будет выполнять различные действия по агрегированию и вычислению данных перед возврат объектов запрашивающим приложениям.

К сожалению, у одного пользователя есть приложение на базе Excel, которое я теперь должен интегрировать. Прочитав о VSTO, COM, надстройке автоматизации и ExcelDNA, я решил, что будет лучше добавить проект в решение, которое взаимодействует с ExcelDNA. Но после большого количества маленьких шагов по возврату простых строк из функций SQL в Excel в ячейках, теперь мне нужно попытаться вернуть DataTable (гибкий здесь) в функцию VBA. VBA будет принимать некоторые параметры, такие как имя базы данных, среда (PROD, UAT, DEV), ModelRunId, startDate, endDate ....

Но из того, что я прочитал, это невозможно. Кто-нибудь достиг этого? Я близок к написанию простого приложения для WinForms и демонстрации функциональности «Экспорт в Excel» в некоторых сетках - пусть пользователь Excel сделает всю работу…

Запись на SQL-сервер напрямую и использование таких методов, как CopyFromRecordSet, не вариант.

Заранее спасибо

1 Ответ

2 голосов
/ 12 мая 2011

Звучит так, будто вы хотите создать COM-сервер в C # / .NET и открыть его для Excel VBA.

В качестве примера создайте класс в C #, сделайте его видимым COM и присвойте ему GUIDи ProgId, например:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("AAA82C86-91CF-496C-A8BA-70742DC58475")]
[ProgId("MyVbaFunctions")]
public class MyVbaFunctions
{
    public string GetSomeData(string arg1)
    {
        return "Return your data";
    }
}

Затем необходимо установить флажок «Зарегистрироваться для взаимодействия COM» в настройках сборки в Visual Studio.После того, как вы построили свой проект, вы можете зайти в редактор Excel VBA, щелкнуть меню «Сервис» -> «Ссылки», найти свою сборку в списке зарегистрированных библиотек типов и поставить галочку.

Затем вы должнывозможность написать макрос VBA, который использует ваши классы C #.Примерно так в VBA:

Sub MyMacro()
    Dim MyFuncs As New MyLibrary.MyVbaFunctions
    Debug.Print MyFuncs.GetSomeData("hello")
End Sub

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

Когда дело доходит до развертывания вашей сборки для пользователей, вынеобходимо зарегистрировать его с помощью «regasm.exe / codebase MyLibrary.dll» (используйте «/ u», чтобы отменить его регистрацию).

Поскольку вы уже используете Excel-DNA, вы должны взглянуть на исходный тексткод, который имеет некоторую поддержку атрибута [ExcelComClass], который позволяет Excel-DNA размещать ваш COM-сервер, а не по умолчанию (mscoree.dll).Это означает, что ваши функции будут работать в том же домене приложения, что и ваши пользовательские функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...