Вот документация для C # VSTO Workbooks.Add(...)
: https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.add.aspx, а вот документация для версии VBA: https://msdn.microsoft.com/en-us/vba/excel-vba/articles/workbooks-add-method-excel
API автоматизации COM в Office для VSTO определенно нуждаются в некоторой работе для C # эргономика . Проблема заключается в том, что метод принимает значение аргумента значения COM Variant
(System.Object
в .NET), что означает , что он будет принимать все, что вы ему набрасываете , и обрабатывать его внутренне без какого-либо типа во время компиляции безопасность. Это плохой дизайн API, вместо этого вместо этого должны быть типизированные перегрузки («перегрузки» - это разные методы / функции с одинаковыми именами, но строго типизированные параметры). Но нет смысла жаловаться на это сейчас: D
Дальнейшие запутанные вещи, преобразование вашего Boolean
true
значения в объект COM Variant
выполняется полностью за кадром. Но сначала давайте рассмотрим документированные действительные значения аргументов:
Необязательный объект. Определяет, как создается новая рабочая книга. Если этот аргумент является строкой, указывающей имя существующего файла Microsoft Excel, новая книга создается с указанным файлом в качестве шаблона. Если этот аргумент является константой, новая книга содержит один лист указанного типа. Может быть одной из следующих констант XlWBATemplate: xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet или xlWBATWorksheet. Если этот аргумент пропущен, Microsoft Excel создает новую книгу с несколькими пустыми листами (количество листов задается свойством SheetsInNewWorkbook).
... это много, чтобы рассмотреть!
Мы можем определить, какие будут перегрузки, и затем отдельно документировать их:
workbook.Add()
- Поскольку параметр является необязательным, это означает, что вы можете вызывать его без каких-либо аргументов. Эффект заключается в создании новой рабочей книги с несколькими чистыми листами (где число исходит от SheetsInNewWorkbook
).
workbook.Add( String templateFileName )
- Если аргумент является строкой, то он рассматривается как имя файла для файла шаблона для использования. Очевидно, что это не маршалируется до значения Boolean
, поэтому в вашем случае этого не происходит.
workbook.Add( Int32 constant )
- В документации используется термин «константа», который, на мой взгляд, действительно означает Int32
. Он принимает только значения из XlWBATemplate
, которые определены здесь: https://msdn.microsoft.com/en-us/vba/excel-vba/articles/xlwbatemplate-enumeration-excel - это значения -4109
, 4
, 3
и -4167
.
В документации не говорится, что происходит, если значение аргумента не является ни одним из них. Тот факт, что это работает в вашем случае, предполагает значение, переданное как COM Variant
, содержащее bool, и оно просто игнорируется. Я не верю, что среда выполнения маршалирует Boolean
в Int32
, учитывая, что Variant
поддерживает логические значения, и даже если бы он был маршалирован до Int32
, вы, вероятно, получите ошибку аргумента как 1
не определено в XlWBATemplate
.
Решение: Измените Workbooks.Add( true )
на Workbooks.Add()
и посмотрите, есть ли какие-либо изменения в поведении. Если нет, то сохраните изменения; в противном случае вы столкнулись с недокументированным поведением в Excel COM API, и вам следует документировать это в комментарии к коду (и дайте нам знать тоже!)