Вызов функций Excel / DLL / XLL из C # - PullRequest
7 голосов
/ 21 декабря 2009

У меня есть определенная функция в надстройке Excel (xll). Надстройка является частной собственностью, и у нас нет доступа к исходному коду. Однако нам нужно вызвать некоторые функции, содержащиеся в надстройке, и мы хотели бы вызвать ее из программы на C #.

В настоящее время я думал о написании интерфейса C ++, вызывающего функцию Excel с помощью xlopers, а затем вызывающего этот интерфейс C ++ из C #.

Знает ли кто-нибудь, кто ранее имел опыт решения подобных проблем, каково было бы лучшее решение для этого?

Anthony

Ответы [ 5 ]

4 голосов
/ 16 мая 2013

Вам необходимо создать фальшивый xlcall32.dll , поместить его в тот же каталог, что и ваш XLL (не помещайте собственный файл xlcall32.dll в Excel в PATH). Вот некоторый код:

# include <windows.h>

typedef void* LPXLOPER;

extern "C" void __declspec(dllexport) XLCallVer ( ) {}

extern "C" int __declspec(dllexport) Excel4 (int xlfn, LPXLOPER operRes, int count,... ) { return 0; }

extern "C" int __declspec(dllexport) Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER far opers[]) {return 0;}

Теперь предположим, что у меня есть XLL-файл с именем xll-dll.xll с функцией, которая вызывается (для определения имен экспортируемых функций используйте «зависящий от.exe") xlAdd, который добавляет два двойных числа: extern "C" __declspec (dllexport) XLOPER * __cdecl xlAdd (XLOPER * pA, XLOPER * pB);

Следующий код вызывает его:


# include <windows.h>
# include <iostream>

// your own header that defines XLOPERs
# include <parser/xll/xloper.hpp>

// pointer to function taking 2 XLOPERS
typedef XLOPER * (__cdecl *xl2args) (XLOPER* , XLOPER* ) ;

void test(){
/// get the XLL address
HINSTANCE h = LoadLibrary("xll-dll.xll");
if (h != NULL){
xl2args myfunc;
/// get my xll-dll.xll function address
myfunc = (xl2args) GetProcAddress(h, "xlAdd");
if (!myfunc) { // handle the error
FreeLibrary(h); }
else { /// build some XLOPERS, call the remote function
XLOPER a,b, *c;
a.xltype = 1; a.val.num = 1. ;
b.xltype = 1; b.val.num = 2. ;
c = (*myfunc)(&a,&b);
std::cout << " call of xll " << c->val.num << std::endl; }
FreeLibrary(h); }
}

int main()
{test();}

Мой exe действительно работает (к моему собственному удивлению) и выдает 3, как и ожидалось. Вы должны иметь некоторые знания о том, что ваш XLL ожидает от параметров. Если он выделяет некоторую память, вы должны проверить, если #define xlbitDLLFree 0x4000 устанавливается на ваш XLOPER c-> type и перезванивает "xlAutoFree".

3 голосов
/ 19 мая 2010

Вы можете попробовать XLL Plus http://www.planatechsolutions.com/xllplus/default.htm. Это немного дорого, но XLL Wrapper Libraries - это именно то, что вы ищете:

"Иногда полезно иметь возможность вызывать ваши надстройки Excel из других сред, таких как программы командной строки или интерактивные приложения, написанные на C ++, Java, C # или Visual Basic. Набор инструментов Xll Wrapper содержит инструменты библиотека времени выполнения, примеры и документация, помогающие в разработке COM-модулей и сборок .NET, которые обертывают надстройки Excel XLL "

0 голосов
/ 23 декабря 2009

проверить, доступна ли сборка в программных файлах, где вы устанавливаете плагин, ссылаться на эту сборку непосредственно на ваш проект на c # - проверьте в браузере объектов ваш класс, метод или объект

0 голосов
/ 30 декабря 2009

Вы должны иметь возможность использовать рефлексию, чтобы получить доступ к своему дополнению. попробуйте использовать Отражатель , чтобы увидеть, что доступно.

0 голосов
/ 21 декабря 2009

DLL-библиотека надстройки Excell может быть написана на C #. Если это так, то вы, вероятно, можете вообще обойти Excel. Может быть, нужна обертка.

...