本文利用excel-dna实现comserver.在excel vba里面调用。我的office是64位的,我只生成64位的comserver.
1.建立类库。
安装exceldna包。
3编写代码。代码比较好理解。前半部分建立一个com互操作的类COMLibrary.后面的部分就是在excel启动和关闭时候的插件自注册自销部分代码。
using System;
using ExcelDna.Integration;
using ExcelDna.ComInterop;
using System.Runtime.InteropServices;
//
namespace XLServer
{
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class COMLibrary
{
public double add(double x, double y)
{
return x + y;
}
}
//
[ComVisible(false)]
class ExcelAddin : IExcelAddIn
{
public void AutoOpen()
{
ComServer.DllRegisterServer();
}
public void AutoClose()
{
ComServer.DllUnregisterServer();
}
}
}
在配置文件里设置comserver="true"
生成解决方案。
下面导出dll的类型库。我上面截图里面的tlb是我已经操作实验生成好的截图。实际中并没有生成的。下面讲下怎么生成的。我是64位的dll.就选择x64的本机工具。32位的dll选择x86 native tools command..。
进入生成dll的目录。然后tlbexp命令导出tlb类型库。可以看到出现报错,就是找不到ExcelDna.Integration.dll。
去看下生成目录里面确实没有.别慌。去引用里改下复制到本地的属性为true然后重新生成解决方案就可以了。当然你也可以根据引用路径复制到生成的文件夹里,也是可以的。
重新在命令行里导出类型库。可以看到导出成功了。
下面看下怎么在excel dna里面怎么使用。
首先加载64位的xll。可以放到excel常用的默认加载路径方便管理点。
dll和tlb只要在一起哪里都行。如下图vba工程引用里倒入之前生成的类型库。
我们去对象浏览器看下xlserver这个引用。可以看到C#里创建的类以及add函数了
下面我们来代码测试使用下。
Sub x()
Dim s As New COMLibrary
Debug.Print s.Add(3.5, 16.5)
End Sub
大功告成,达到了预期的目标。