Calling Excel/DLL/XLL functions from C#

后端 未结 5 1477
猫巷女王i
猫巷女王i 2020-12-17 00:31

I have a particular function in an Excel addin(xll). The addin is proprietary and we do not have access to the source code. However we need to call some functions contained

相关标签:
5条回答
  • 2020-12-17 00:58

    You might like to try XLL Plus http://www.planatechsolutions.com/xllplus/default.htm. It's a bit pricey, but the XLL Wrapper Libraries feature is exactly what you are looking for:

    "Sometimes it is useful to be able to call your Excel add-in functions from other environments, such as command-line programs or interactive applications, written in C++, Java, C# or Visual Basic. The Xll Wrapper toolkit contains tools, a runtime library, samples and documentation to help with the development of COM modules and .NET assemblies that wrap Excel XLL add-ins"

    0 讨论(0)
  • 2020-12-17 01:01

    You should be able to use reflection to get access to your addin. try using The Reflector to see what's available.

    0 讨论(0)
  • 2020-12-17 01:02

    You need to create a fake xlcall32.dll, put it in the same directory as your XLL (do not put excel's own xlcall32.dll in the PATH). Here is some code:

    # 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;}
    

    Now suppose I have an XLL called xll-dll.xll with a function called (use "depends.exe" to find out the names of the exported functions) xlAdd that well adds two doubles: extern "C" __declspec(dllexport) XLOPER * __cdecl xlAdd(XLOPER* pA, XLOPER* pB);

    The following code calls it:


    # 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();}
    

    My exe actually works (to my own surprise), and output 3 as expected. You must have some knowledge of what your XLL actually expects for parameters. If it allocates some memory, you must check if the #define xlbitDLLFree 0x4000 is set on your XLOPER c->type, and call back "xlAutoFree".

    0 讨论(0)
  • 2020-12-17 01:06

    An Excell add-in DLL might be written in C#. If so, then you can probably bypass Excel altogether. Might need a wrapper though.

    0 讨论(0)
  • 2020-12-17 01:07

    check whether assembly is available in program files where you install the plguin, reference that assembly directly to your c# project - check the object browser for your class, method or object

    0 讨论(0)
提交回复
热议问题