使用 .NET 为 Excel 创建自动化加载项






4.64/5 (32投票s)
2004 年 7 月 19 日
3分钟阅读

618070
描述如何使用 .NET 为 Excel 创建自动化加载项。
引言
Excel 2002 (XP) 和 2003 版本引入了自动化加载项的概念。自动化加载项允许 COM 库中的公共函数充当 Excel 中的用户定义函数 (UDF),从而可以直接从单元格公式中引用。
本文详细介绍了如何使用 Visual Studio .NET 为 Excel 创建自动化加载项。
背景
一些讨论自动化加载项的相关知识库文章包括:
- Q291392 - 信息:Excel COM 加载项和自动化加载项。
- Q285337 - 如何为 Excel 工作表函数创建一个 Visual Basic 自动化加载项。
- Q278328 - XL2002:如何将自动化加载项函数标记为易失性。
一个商业库提供了等效(以及更多)的功能,并使这一切变得非常容易,那就是 ManagedXLL。但是,这个库非常昂贵,并且需要运行时许可证才能分发用户代码。它使用原生的 XLL API 来创建 Excel 加载项,因此也支持较旧版本的 Excel。
对于创建可用作自动化加载项的 COM 服务器的具体要求记录不完善,Visual Basic 6.0 中的默认选项似乎可以完美工作,这使得情况更加复杂。
当使用 .NET 创建 COM 库时,尝试将该库作为自动化加载项添加到 Excel 会导致错误:“您选择的文件不包含新的自动化服务器,或者您没有足够的权限来注册自动化服务器”。
在这里,我描述了如何使用 C# 在 .NET 中创建一个自动化加载项。这些技术应该适用于任何 .NET 语言。
使用 .NET 实现 Excel 的自动化加载项似乎有三个技巧:
- 需要注册该库以通过 COM 使用。这可以通过将项目标记为“为 COM 互操作注册”或通过使用
RegAsm.exe
手动注册来完成。 - 需要在注册表中
HKCR\CLSID\{xxx}\
下添加“Programmable”
注册表项。这可以通过向类添加适当的ComRegisterFunction
方法来自动化。 - 需要使用值为
ClassInterfaceType.AutoDual
的ClassInterface
属性标记该类(显式接口实现也可以工作)。生成的默认类接口是调度接口 - Excel 似乎忽略自动化加载项的调度接口。
步骤说明
- 创建库
- 创建一个新的 C# 类库项目,名为 NAddIn。
- 选择项目的属性;在“配置属性”、“生成”下,将“为 COM 互操作注册”设置为 True。
- 重命名类,添加命名空间声明,设置类的
ClassInterface
属性,并添加一个要从 Excel 中使用的函数using System; using System.Runtime.InteropServices; namespace NAddIn { [ClassInterface(ClassInterfaceType.AutoDual)] public class Functions { public Functions() { } public double Add2(double v1, double v2) { return v1 + v2; } [ComRegisterFunctionAttribute] public static void RegisterFunction(Type t) { Microsoft.Win32.Registry.ClassesRoot.CreateSubKey( "CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable"); } [ComUnregisterFunctionAttribute] public static void UnregisterFunction(Type t) { Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey( "CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable"); } } }
- 构建 NAddIn 项目以创建 bin\debug\NAddIn.dll。
- 在 Excel 中测试加载项
- 在 Excel 中打开一个新工作簿。
- 选择“工具”、“加载项”、“自动化”。
-
应列出
NAddIn.Functions
- 选择它。确定。 - 在一个单元格中,键入
=Add2(3,4)
- 单元格应显示 7。
/codebase
标志运行 regasm
(通常为 c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\RegAsm /codebase NAddIn.dll
)。您将收到一条关于程序集未签名的警告 - 您可以忽略它(或按照文档记录的方式对程序集进行签名)。历史
- 初始版本 - 2004 年 7 月 19 日。
- 删除了类型库嵌入指令 - 2004 年 7 月 19 日。
- 添加了
ComRegisterFunction
位以自动化注册表更改 - 2004 年 7 月 30 日。