能否在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
相关产品推荐
相关产品推荐

