Excel 加载项。使用 C# 创建的自定义 Excel 工作表函数

Excel Add-in. Custom Excel Worksheet Functions created with C#

我正在创建一个名为 MyExcelFunctions 的 class 库。这是用 C# 编写的所有代码:

namespace MyExcelFunctions
{
    public interface IFunctions { string OddOrEven(int number); }

    [ComDefaultInterface(typeof(IFunctions))]
    public class Functions : IFunctions
    {
        public string OddOrEven(int number)
        {
            return number % 2 == 0 ? "Even" : "Odd";
        }

        private static string GetSubKeyName(Type type)
        {
            string s = @"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
            return s;
        }

        [ComRegisterFunction]
        public static void RegisterFunction(Type type)
        {
            Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type));
        }

        [ComUnregisterFunction]
        public static void UnregisterFunction(Type type)
        {
            Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type));
        }
    }


}

我正在编译这个项目并将程序集(.dll 文件)添加到 Excel。

(Excel 选项 -> 加载项 -> 管理 [Excel 加载项] -> 转到... -> 自动化... -> 浏览...)。

但出现以下错误:

我尝试添加为管理员但没有成功。我做错了什么?

我发现了这个场景here

我解决了这个问题。除了我必须用 ComVisible(true) 标记 classes 之外,我上面所做的一切都是正确的。这是更正后的代码。

namespace MyExcelFunctions
{
    [ComVisible(true)]
    public interface IFunctions { string OddOrEven(int number); }

    [ComVisible(true)]
    [ComDefaultInterface(typeof(IFunctions))]
    public class Functions : IFunctions
    {
        public string OddOrEven(int number)
        {
            return number % 2 == 0 ? "Even" : "Odd";
        }

        private static string GetSubKeyName(Type type)
        {
            string s = @"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
            return s;
        }

        [ComRegisterFunction]
        public static void RegisterFunction(Type type)
        {
            Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type));
        }

        [ComUnregisterFunction]
        public static void UnregisterFunction(Type type)
        {
            Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type));
        }
    }

}

然后必须使用 RegAsm.exe 实用程序注册程序集。

首先必须重建项目。之后,重新生成的程序集必须保存在目标机器上。我将其保存在 C:\ProgramFiles\MyExcelAddin 文件夹中(必须创建)。此外,我将 RegAsm.exe 复制到同一文件夹中。它位于 C:\Windows\Microsoft.Net\Framework\v4.0.30319。最后,必须使用具有管理权限的 运行 命令提示符并进入 MyExcelAddin 文件夹。要键入的命令是 RegAsm /codebase ClassLibraryName.dll

完成这些步骤后,class 将在 Excel 的自动化服务器列表中可见。我们现在要做的就是 select 它并按 OK 按钮。

上面创建的方法可以用作单元格中的公式。

我希望这会对某人有所帮助。