使用C#创建新的Excel公式/函数

7
我们希望能够通过编程的方式创建一个Excel工作簿,其中可以从单元格内调用自定义代码。单元格可能如下所示:
=MyCode(A1:A10)

我的第一个想法是使用VBA,但由于算法是专有的,有关部门希望保护它。我可以给它加上密码,但是在StackOverflow上,已经有人记录了如何绕过这样的密码。
我的第二个想法是在Visual Studio中创建一个Excel 2013 Workbook项目,但我没有找到有用的关于如何公开C#函数以便调用的信息。
接下来,我考虑让VBA调用C#,并在https://msdn.microsoft.com/en-us/library/bb608613.aspx找到了说明。我完全按照那些说明进行操作,但是当我尝试运行VBA代码时,GetManagedClass函数出现了错误:对象库不支持该功能。
有没有好的参考资料可以告诉我如何解决这个问题?

C#由于具有内置的反射,因此保护性较低。 - John Alexiou
1
最安全的方法是创建一个Win32 dll,例如使用C、C++或Fortran,并从VBA中调用它。 - John Alexiou
2
@pnuts:为什么这个问题会被认为是不相关的?这完全涉及编程。 - Walter Williams
2
我认为他对此有异议:有没有关于如何做这样事情的好参考资料? 如果您提供一个生成错误的代码示例,并指出错误所在,那么A)您将得到pnuts的好感,B)更有可能获得具体的帮助。引用MS文档并说您遵循了它们并不能帮助我们找到打字错误。 - FreeMan
从文章中脱离上下文的代码在这里重复是没有意义的,如果我可以附加一个zip文件就好了。MSDN示例不起作用,我也无法通过MSDN或其他地方找到有关如何正确设置此类事物的任何在线信息。 - Walter Williams
2个回答

6
你正在寻找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进行代码保护,您需要使用混淆器 - 有各种免费和付费的混淆器可用。

当我尝试这个例子时,它似乎不起作用。Excel 在单元格中显示“#名称?”。 - user1683456
听起来好像出了一些意外的问题。询问Excel-DNA的最佳地点是https://groups.google.com/g/exceldna上的Google小组。请在帖子中提供有关您的项目、使用的Excel-DNA版本等更多详细信息。我可以从那里帮助您深入了解问题。 - Govert

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

完整文章在此处:http://www.nullskull.com/q/10059408/c-code-to-set-excel-workbook-macro-enabled-and-to-trust-vba-projects.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接