从单元格公式调用Excel 2007中用C#编写的方法

从单元格公式调用Excel 2007中用C#编写的方法,c#,excel,vsto,user-defined-functions,C#,Excel,Vsto,User Defined Functions,我正在使用Excel2007。我用单独的二进制代码编写了C#代码。代码在类上使用静态类和静态方法。我在VSTO Excel工作表项目中有对DLL的引用。我必须添加或修改什么才能使其正常工作 我的C#代码如下所示: using System; using System.Collections.Generic; using Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; namespace FooStati

我正在使用Excel2007。我用单独的二进制代码编写了C#代码。代码在类上使用静态类和静态方法。我在VSTO Excel工作表项目中有对DLL的引用。我必须添加或修改什么才能使其正常工作

我的C#代码如下所示:

using System;
using System.Collections.Generic;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace FooStatistics
{
    [ComVisible(true)]
    public static class Statistics
    {
        public static int Count(Range range)
        {
            return range.Count;
        }
=FooStatistic.Statistic.Count(A1:A10)
我希望能够将公式放入Excel单元格,如下所示:

using System;
using System.Collections.Generic;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace FooStatistics
{
    [ComVisible(true)]
    public static class Statistics
    {
        public static int Count(Range range)
        {
            return range.Count;
        }
=FooStatistic.Statistic.Count(A1:A10)
或者别的什么

我见过,但它似乎是针对Excel2003中的非静态类的。我不敢相信现在的整合还不是更好

我看过很多关于这个的问题。它们似乎不提供本机集成(许多人说,“使用X开源库”),而且,不祥的是,许多不被OP接受。我不想找“将其转换为COM对象并从VBA调用”

所以我在寻找:

  • Excel 2007
  • C#DLL中的代码
  • 作为自定义项从Excel单元格调用
  • 本地整合
以下是两位回应者的回答:

  • 据我所知,您不能直接在VSTO中创建UDF
  • VSTO不支持创建Excel自定义项。自动化外接程序可以在.Net中创建,这似乎是微软批准的方法

这是2009年6月的一个问题。这是真的吗?在2009年,您必须将.NET组件公开为COM服务器,以获取可调用的Excel UDF?

如果这是您的四项要求——(1)Excel 2007,(2)C#DLL中的代码,(3)作为UDF从Excel单元格调用,(4)本机集成——那么,是的,这可以很容易地完成。Eric Carter的文章是关于如何做到这一点的最佳教程之一

如果您还希望代码通过VSTO托管,那么我几乎可以肯定,在这种情况下,您需要使用VBA包装器。请参阅Paul Stubbs的文章,其中他使用VBA外接程序公开VBA UDF,而VBA UDF反过来调用他在VSTO中编写的托管UDF

不过,老实说,对于Excel UDF,我只想避免使用VSTO。VSTO是托管COM加载项的优秀设计器,允许您轻松添加功能区控件等。但它对UDF毫无帮助(事实上,它甚至不支持UDF)。因此,我的建议是根据创建一个托管自动化外接程序,并删除VSTO需求

如果你这样做,你就不会有任何问题,我保证。:-)


迈克

@hughdbrown:只需遵循Erics文章中的例子。如果你这样做,它会起作用的。 不,您不能使用静态类。使用COM包装器实例化.net类(为COM互操作注册它)。

Hugh

我理解您对“本机”解决方案的渴望,而不是“使用X开源库”。但是,即使是VSTO也似乎不太擅长“本地”

您的需求正是导致我在发现自动化加载项不足后开发ExcelDna()的原因。在最近的Excel版本中,对自动化外接程序的支持没有改进,而.xll外接程序API(ExcelDna使用)在最近的版本中得到了更新,现在支持多线程重新计算,并且Excel 2010中有异步调用

尽管ExcelDna是引入到解决方案中的额外部分,但您会对结果感到满意。遗憾的是,微软在托管UDF插件方面没有明确的方向,也没有任何迹象表明VSTO支持这一点,但在实践中,使用ExcelDna实现这一点非常简单、轻巧,而且效果非常好


戈弗特

嗯。我正在经历软件开发的所有阶段:愤怒、拒绝、讨价还价、沮丧和接受。因此,当我做所有这些时,我会得到一个编译时警告“……不包含任何可以注册为COM互操作的类型。”我怀疑这是因为我使用了一个带有静态方法的静态类。我需要一个公共的非静态类吗?或者这是另外一回事?所以只要我不使用静态类和静态方法,我就可以让它工作。我最终得到了一个伪对象,它没有真正的属性或方法,但我可以调用它。Sigh.COM通过接口工作,因此,不,它不能处理静态类。(抱歉。)对于托管COM加载项,它使用IDTEXTENSIBLITI2。对于用于容纳用户定义函数(正如您正在做的那样)的自动化加载项,它使用IDispatch。(如果需要通过Excel.Application.volatile方法使UDF具有易变性,也可以让UDFs类实现IDTEXTensibilitiy2。)但是,将类从静态更改为实例非常简单。只需执行查找/替换,将“static”替换为“”:-)从我的简短表情来看,我相当喜欢ExcelDNA。一个问题是,客户希望保护其来源。我不认为将源代码放入.DNA文件中供所有人读取是可以接受的。这里有一个聚合线程:。我的评论是:您的UDF源代码可以在.dna文本文件中,也可以在外部编译的.NET.dll中。入门教程演示了如何引用外部库。如果你想保护你的代码,你会遇到常见的.NET混淆问题,我建议至少使用类似DotFuscator的东西。但ExcelDna和其他.Net解决方案之间并没有什么不同。