使用 C# 创建新的 Excel formulas/functions
Creating new Excel formulas/functions with C#
我们希望能够以编程方式创建一个 Excel 工作簿,该工作簿将从一个单元格中调用自定义代码。单元格看起来像:
=MyCode(A1:A10)
我的第一个想法是使用 VBA,但由于该算法是专有的,所以希望它受到保护的权力。我可以在上面设置密码,但是关于如何绕过此类密码的文档(在 Whosebug 上)有详细记录。
我的第二个想法是在 Visual Studio 中创建一个 Excel 2013 Workbook 项目,但我没有发现任何有用的关于如何在 C# 中公开函数以便像我一样调用它描述。
接下来我考虑让 VBA 调用 C#,并在 https://msdn.microsoft.com/en-us/library/bb608613.aspx 找到说明。我严格按照这些说明进行操作,但是当我尝试 运行 VBA 代码时,GetManagedClass 函数出现错误:不支持对象库功能。
关于如何做这样的事情有什么好的参考吗?
您正在寻找 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 进行代码保护,您需要使用混淆器 - 有多种免费和付费的混淆器可用。
我也试过这个例子,同样的错误。我找到了适合我的解决方案。
在ISheet1.cs文件中,用以下代码替换ISheet1接口声明。此代码生成 ISheet1 接口 public,并应用 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);
}
我们希望能够以编程方式创建一个 Excel 工作簿,该工作簿将从一个单元格中调用自定义代码。单元格看起来像:
=MyCode(A1:A10)
我的第一个想法是使用 VBA,但由于该算法是专有的,所以希望它受到保护的权力。我可以在上面设置密码,但是关于如何绕过此类密码的文档(在 Whosebug 上)有详细记录。
我的第二个想法是在 Visual Studio 中创建一个 Excel 2013 Workbook 项目,但我没有发现任何有用的关于如何在 C# 中公开函数以便像我一样调用它描述。
接下来我考虑让 VBA 调用 C#,并在 https://msdn.microsoft.com/en-us/library/bb608613.aspx 找到说明。我严格按照这些说明进行操作,但是当我尝试 运行 VBA 代码时,GetManagedClass 函数出现错误:不支持对象库功能。
关于如何做这样的事情有什么好的参考吗?
您正在寻找 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 进行代码保护,您需要使用混淆器 - 有多种免费和付费的混淆器可用。
我也试过这个例子,同样的错误。我找到了适合我的解决方案。
在ISheet1.cs文件中,用以下代码替换ISheet1接口声明。此代码生成 ISheet1 接口 public,并应用 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);
}