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

时间:2018-03-10 06:24:29

标签: c# excel add-in

我正在创建一个名为MyExcelFunctions的类库。以下是用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加载项] - >转到... - >自动化... - >浏览...)。

但是得到以下错误:

enter image description here

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

我发现了这种情况here

1 个答案:

答案 0 :(得分:0)

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

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

完成这些步骤后,该类将显示在Excel中的“自动化服务器”列表中。我们现在要做的就是选择它并按OK按钮。

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

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