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

我正在使用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) 

pipe他呢。

我已经看到了这一点,但它似乎是在Excel 2003中的非静态类。我不能相信现在集成是不是更好。

我已经看了很多关于这个StackOverflow的问题。 他们似乎没有提供本地整合(许多人说,“使用X开源库”),不幸的是,很多不被OP接受。 我不是在寻找,“把它变成一个COM对象,并从VBA调用它”。

所以我在找:

  • Excel 2007
  • 代码在C#DLL中
  • 从Excel单元格调用UDF
  • 本地整合

所以这里是另一个StackOverflow链接 ,其中两个响应者说:

  • 据我所知,你不能直接在VSTO中创buildUDF。
  • VSTO不支持创buildExcel UDF。 自动化插件可以在.Net中创build,似乎是微软认可的方式。

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

如果这些是你的四个要求 – (1)Excel 2007,(2)C#DLL代码,(3)从Excel单元调用UDF,(4)本地集成 – 那么,是的,这可以做到,漂亮容易。 关于如何做到这一点的最好的教程之一是埃里克·卡特的文章写在Excel中的用户定义函数 。

如果您另外希望您的代码通过VSTO托pipe,那么我几乎可以确定您在这种情况下需要使用VBA包装。 请参阅Paul Stubbs的文章“ 如何在VSTO托pipe代码中创buildExcel UDF”,其中他使用VBA加载项来公开VBA UDF,VBA UDF又将其称为使用VSTO编写的托pipeUDF。

说实话,对于Excel UDF,我只是避免使用VSTO。 VSTO是一个很好的pipe理COM加载项的devise器,允许你轻松地添加Ribbon控件等等。 但是这对于UDF来说是没有帮助的(事实上,甚至不支持它)。 所以我的build议是根据Eric Carter的文章创build一个托pipe的自动化插件,并放弃VSTO的要求。

如果你这样做,我保证你没有问题。 🙂

麦克风

我理解你对“本地”解决scheme的渴望,而不是“使用X开源库”。 但是即使VSTO对于Excel来说也不是很“原生”的。

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

即使ExcelDna是一个额外的部分介绍到您的解决scheme,你会很高兴的结果。 令人遗憾的是,微软在pipe理UDF插件方面还没有明确的方向,或者在VSTO中对此有任何支持的迹象,但实际上使用ExcelDna做这件事很简单,重量轻,而且工作得很好。

霍弗特

@ hughdbrown:只要按照Erics文章中的例子。 如果你这样做,它会工作。 不,你不能使用静态类。 您使用COM包装器创build.net类(注册为com互操作)。