6

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

管他呢。

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

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

所以我正在寻找:

  • Excel 2007
  • C# DLL 中的代码
  • 从 Excel 单元格调用为 UDF
  • 本机集成

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

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

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

4

3 回答 3

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 的文章如何在 VSTO 托管代码中创建 Excel UDF,其中他使用 VBA 加载项来公开 VBA UDF,这反过来又调用他用 VSTO 编写的托管 UDF。

不过老实说,对于 Excel UDF,我会简单地避免使用 VSTO。VSTO 是托管 COM 加载项的出色设计器,可让您轻松添加功能区控件等。但它对 UDF 没有帮助(事实上,甚至不支持它)。所以我的建议是根据Eric Carter 的文章创建一个托管自动化插件,并放弃 VSTO 要求。

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

麦克风

于 2009-08-20T20:09:12.410 回答
1

休,

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

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

即使 ExcelDna 是您的解决方案中引入的额外部分,您也会对结果感到满意。遗憾的是,微软在托管 UDF 加载项方面没有明确的方向,或者在 VSTO 中没有任何支持这一点的迹象,但实际上使用 ExcelDna 执行此操作很容易、轻量级并且运行良好。

政府

于 2009-10-12T10:08:24.507 回答
0

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

于 2009-08-20T23:07:30.443 回答