在使用NetOffice互操作时,无法将Excel对象作为参数从VBA传递到.NET

当Microsoft的互操作程序集被引用时,像Worksheet,Workbook,Range等Excel对象可以从VBA传递给.net作为参数:

.NET类:

using Excel = Microsoft.Office.Interop.Excel; [ComVisible(true)] [ClassInterface(ClassInterfaceType.AutoDual)] public class MyExcelLib { public MyExcelLib() {} // default constructor public void InsertTable(Excel.Workbook wbook, string TableName, ...) { ... } } 

在Visual Studio或Regasm实用程序中,可以使用Register for COM Interop选项(请参阅Newman的文章以获得更好的概述)。

VBA脚本(excelmacros)调用.net方法InsertTable()

 Dim xLib As New MyExcelLib Call xLib.InsertTable(ThisWorkbook, "Price", ..) 

这工作; Workbook对象可以作为参数从VBA传递给.NET。 但是相同的模式不适用于NetOffice程序集:

 using Excel = NetOffice.ExcelApi; using NetOffice.ExcelApi.GlobalHelperModules; using NetOffice.ExcelApi.Enums; 

据我所知,这些程序集的Embed Interop Types属性不能设置为true,因为这会导致编译错误。 显然,使用NetOffice无法将excel对象作为parameter passing。 这是真的,还是有办法使用NetOffice做到这一点?

使用本机代理而不是NO包装作为库方法中的第一个参数。 像这样的东西:

 public void InsertTable(object wbook, string TableName, ...) { Excel.Workbook myBook = new Excel.Workbook(null, wbook); myBook.Dispose(); }