65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (32投票s)

2004 年 7 月 19 日

3分钟阅读

viewsIcon

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 的自动化加载项似乎有三个技巧:

  1. 需要注册该库以通过 COM 使用。这可以通过将项目标记为“为 COM 互操作注册”或通过使用 RegAsm.exe 手动注册来完成。
  2. 需要在注册表中 HKCR\CLSID\{xxx}\ 下添加 “Programmable” 注册表项。这可以通过向类添加适当的 ComRegisterFunction 方法来自动化。
  3. 需要使用值为 ClassInterfaceType.AutoDualClassInterface 属性标记该类(显式接口实现也可以工作)。生成的默认类接口是调度接口 - Excel 似乎忽略自动化加载项的调度接口。

步骤说明

  1. 创建库
    1. 创建一个新的 C# 类库项目,名为 NAddIn
    2. 选择项目的属性;在“配置属性”、“生成”下,将“为 COM 互操作注册”设置为 True。
    3. 重命名类,添加命名空间声明,设置类的 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");
              }
          }
      }
    4. 构建 NAddIn 项目以创建 bin\debug\NAddIn.dll
  2. 在 Excel 中测试加载项
    1. 在 Excel 中打开一个新工作簿。
    2. 选择“工具”、“加载项”、“自动化”。
    3. 应列出 NAddIn.Functions - 选择它。确定。
    4. 在一个单元格中,键入 =Add2(3,4)
    5. 单元格应显示 7。
要在移动 .dll 后注册它,请使用 /codebase 标志运行 regasm(通常为 c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\RegAsm /codebase NAddIn.dll)。您将收到一条关于程序集未签名的警告 - 您可以忽略它(或按照文档记录的方式对程序集进行签名)。

历史

  1. 初始版本 - 2004 年 7 月 19 日。
  2. 删除了类型库嵌入指令 - 2004 年 7 月 19 日。
  3. 添加了 ComRegisterFunction 位以自动化注册表更改 - 2004 年 7 月 30 日。
© . All rights reserved.