使用 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);
}

她的全文:http://www.nullskull.com/q/10059408/c-code-to-set-excel-workbook-macro-enabled-and-to-trust-vba-projects.aspx