You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在DLL/XLL中使用Microsoft.Office.Interop.Excel?如何获取工作簿句柄?

用C#编写可被Excel宏调用的DLL/XLL方案及获取Workbook句柄方法

方案可行性

完全可行,目前有两种主流实现方式,适配不同需求:

  • COM可见的.NET类库(DLL):实现简单,适合轻量功能,可直接被VBA宏调用
  • Excel XLL插件:更专业的Excel扩展方案,支持复杂功能,可通过Excel-DNA框架简化C#开发

具体实现及获取Workbook句柄的方法

方式一:COM可见的.NET DLL

步骤1:创建并配置项目

  • 创建C#类库项目,右键项目→属性:
    • 切换到生成标签,勾选「使程序集COM可见」
    • 切换到签名标签,勾选「为程序集签名」,新建强名称密钥文件
  • 引用Microsoft.Office.Interop.Excel(可通过NuGet安装对应包)

步骤2:编写核心代码

通过两种方式获取目标Workbook:

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

[ComVisible(true)]
public class ExcelMacroHelper
{
    // 方法1:接收VBA传入的Workbook对象(最直接准确)
    public void UpdateWorkbook(Workbook targetWorkbook)
    {
        Worksheet firstSheet = (Worksheet)targetWorkbook.Worksheets[1];
        firstSheet.Cells[1, 1].Value2 = "Updated by COM DLL";
    }

    // 方法2:在DLL内获取当前Excel进程的活跃工作簿
    public void UpdateActiveWorkbook()
    {
        // 获取当前运行的Excel应用实例
        Application excelApp = (Application)Marshal.GetActiveObject("Excel.Application");
        Workbook activeBook = excelApp.ActiveWorkbook;
        
        if (activeBook != null)
        {
            Worksheet firstSheet = (Worksheet)activeBook.Worksheets[1];
            firstSheet.Cells[1, 1].Value2 = "Updated by COM DLL (ActiveWorkbook)";
        }
    }
}

步骤3:注册并调用

  • 编译项目后,用管理员权限打开命令行,执行注册命令:
    regasm.exe /codebase YourProjectName.dll
    
  • 在Excel宏中调用:
    Sub TestCOMAddin()
        Dim helper As New ExcelMacroHelper
        ' 传入当前工作簿(推荐方式)
        helper.UpdateWorkbook ActiveWorkbook
        ' 或调用自动获取活跃工作簿的方法
        helper.UpdateActiveWorkbook
    End Sub
    

方式二:Excel XLL插件(基于Excel-DNA)

原生C#编写XLL复杂度高,推荐用Excel-DNA框架封装细节。

步骤1:创建并配置项目

  • 创建C#类库项目,通过NuGet安装ExcelDna.AddIn包
  • 引用Microsoft.Office.Interop.Excel

步骤2:编写核心代码

Excel-DNA可直接获取当前Excel应用实例:

using ExcelDna.Integration;
using Microsoft.Office.Interop.Excel;

public class ExcelXllTools
{
    [ExcelFunction(Description = "Modify current active workbook")]
    public static void ModifyWorkbookFromXll()
    {
        // 获取当前Excel应用对象
        Application excelApp = (Application)ExcelDnaUtil.Application;
        Workbook currentBook = excelApp.ActiveWorkbook;
        
        if (currentBook != null)
        {
            Worksheet firstSheet = (Worksheet)currentBook.Worksheets[1];
            firstSheet.Cells[1, 1].Value2 = "Updated by Excel-DNA XLL";
        }
    }
}

步骤3:加载并调用

  • 编译项目后,生成.xll文件(通常在输出目录的bin文件夹)
  • 打开Excel→选项→加载项→管理「Excel加载项」→转到→浏览选择生成的XLL文件
  • 加载后,可直接在宏或单元格中调用:
    Sub TestXll()
        ModifyWorkbookFromXll
    End Sub
    

注意事项

  • 平台匹配:确保DLL/XLL的编译平台(32/64位)与Excel版本一致,否则会加载失败
  • 权限设置:需在Excel信任中心启用宏和信任未签名的加载项(测试环境),正式发布建议给DLL/XLL签名
  • Interop版本:引用与Excel版本对应的Interop库,避免兼容性问题

内容的提问来源于stack exchange,提问作者HamSjel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:53:13