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 按钮。
上面创建的方法可以用作单元格中的公式。
我希望这会对某人有所帮助。
我正在创建一个名为 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 按钮。
上面创建的方法可以用作单元格中的公式。
我希望这会对某人有所帮助。