我们希望能够以编程方式创建一个Excel工作簿,该工作簿可以从单元格中调用自定义代码。单元格看起来像:
=MyCode(A1:A10)
我的第一个想法是使用VBA,但由于该算法是专有的,因此希望它受到保护。我可以在上面输入密码,但是有关如何绕过这些密码的详细记录(在StackOverflow上)。
我的第二个想法是在Visual Studio中创建一个Excel 2013工作簿项目,但我还没有找到有关如何在C#中公开函数的任何有用信息,因此它可以像我描述的那样被调用。
接下来我想到让VBA调用C#,并在https://msdn.microsoft.com/en-us/library/bb608613.aspx找到指令。我按照这些说明操作,但当我尝试运行VBA代码时,我得到GetManagedClass函数的错误:不支持对象库功能。
对于如何做这样的事情有什么好的参考吗?
答案 0 :(得分:3)
您正在寻找Excel-DNA。 这个开源库允许您创建托管Excel加载项,并支持创建用户定义的函数,还支持宏,实时RTD数据源等。
在C#中创建Excel UDF就像这样简单:
[ExcelFunction(Description = "My first .NET function")]
public static string SayHello(string name)
{
return "Hello " + name;
}
你可以从一个小区打电话:
=SayHello("Walter")
对于使用.NET的代码保护,您需要使用混淆器 - 有各种免费和付费的可用。
答案 1 :(得分:0)
在ISheet1.cs文件中,使用以下代码替换ISheet1接口声明。此代码使ISheet1接口公开,并应用http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comvisibleattribute.aspx属性使接口对COM可见。
C#
[System.Runtime.InteropServices.ComVisible(true)]
public interface ISheet1
{
void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
}