Невозможно передать объекты Excel в качестве параметров из VBA в.NET при использовании взаимодействия NetOffice
Объекты Excel, такие как Worksheet, Workbook, Range и т. Д., Могут быть переданы из VBA в.net в качестве параметров при ссылке на сборку взаимодействия Microsoft:
.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, ...)
{
...
}
}
..скомпилировано с опцией Register for COM Interop в Visual Studio или с утилитой Regasm (хороший обзор см. в статье Newman).
Сценарий VBA (макрос Excel), вызывающий метод.net InsertTable ():
Dim xLib As New MyExcelLib
Call xLib.InsertTable(ThisWorkbook, "Price", ..)
Это работает; Объект книги может быть передан из VBA в.NET в качестве параметра. Но та же схема не работает со сборками NetOffice:
using Excel = NetOffice.ExcelApi;
using NetOffice.ExcelApi.GlobalHelperModules;
using NetOffice.ExcelApi.Enums;
Насколько я понимаю, свойство Embed Interop Types этих сборок не может быть установлено в true, потому что это вызывает ошибки компиляции. По-видимому, невозможно передать объекты Excel в качестве параметров с помощью NetOffice. Это правда или есть способ сделать это с NetOffice?
1 ответ
Используйте собственный прокси вместо оболочки NO в качестве первого аргумента в методе вашей библиотеки. Что-то вроде этого:
public void InsertTable(object wbook, string TableName, ...)
{
Excel.Workbook myBook = new Excel.Workbook(null, wbook);
myBook.Dispose();
}