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

时间:2009-08-20 18:59:17

标签: c# excel vsto user-defined-functions

我正在使用Excel 2007.我将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;
        }

我希望能够将公式放入Excel单元格中,如下所示:

=FooStatistic.Statistic.Count(A1:A10)

或者其他什么。

我见过this,但它似乎适用于Excel 2003中的非静态类。我现在无法相信整合不是更好。

我已经看过很多关于StackOverflow的问题了。它们似乎没有提供本机集成(很多人说,“使用X开源库”),并且不祥的是OP很多都不接受它们。我不是在寻找,“将它变成COM对象并从VBA调用它。”

所以我在寻找:

  • Excel 2007
  • C#DLL中的代码
  • 从Excel单元格调用UDF
  • 原生整合

所以这里是another StackOverflow link,其中两位响应者说:

  • 据我所知,您无法在VSTO中直接创建UDF。
  • VSTO不支持创建Excel UDF。自动化加载项可以在.Net中创建,并且似乎是Microsoft批准的方式。

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

3 个答案:

答案 0 :(得分:2)

如果这是你的四个要求 - (1)Excel 2007,(2)C#DLL中的代码,(3)从Excel单元调用UDF,(4)本机集成 - 那么,是的,这可以做到,很容易。有关如何执行此操作的最佳教程之一是Eric Carter的文章Writing user defined functions for Excel in .NET

如果您还希望通过VSTO托管代码,那么我几乎可以肯定在这种情况下您需要使用VBA包装器。请参阅Paul Stubbs的文章How to create Excel UDFs in VSTO managed code,其中他使用VBA加载项来公开VBA UDF,后者又调用用VSTO编写的托管UDF。

老实说,对于Excel UDF,我只是避免使用VSTO。 VSTO是托管COM加载项的优秀设计器,允许您轻松添加功能区控件等。但它对UDF没有帮助(事实上,甚至不支持它)。所以我的建议是根据Eric Carter's article创建一个托管自动化加载项,并删除VSTO要求。

如果你这样做,我会保证你没有问题。 : - )

麦克

答案 1 :(得分:1)

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

您的要求正是导致我在发现自动化插件不足之后开发ExcelDna(http://exceldna.codeplex.com)的原因。自动化加载项的支持在最近的Excel版本中没有改进,而.xll加载项API(ExcelDna使用)在最近的版本中已经看到更新支持,现在支持多线程重新计算,并且在Excel中有异步调用2010。

即使ExcelDna是引入您的解决方案的额外部分,您也会对结果感到满意。遗憾的是,微软没有明确的方向来管理UDF加载项,或者在VSTO中对此有任何支持,但实际上使用ExcelDna这样做很容易,重量轻且效果很好。

霍弗特

答案 2 :(得分:0)

@ hughdbrown:只需按照Erics文章中的示例进行操作即可。如果你这样做它会工作。 不,你不能使用静态类。使用COM包装器实现一个.net类(将其注册为com interop)。