本文利用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
大功告成,達到了預期的目標。