.add (true), что означает «истинный» параметр / аргумент - PullRequest
0 голосов
/ 04 мая 2018

Я только начал изучать C # и использовать Visual Studio для написания программ. После долгих поисков в интернете и моей книге по C # ... и просьбы к другим опытным программистам ... ничего не могу ответить на следующий вопрос: Что означает параметр / аргумент "true" в методе add() в следующих строках: код:

var excel = new microsoft.office.interop.excel.application();
var workbook = excel.workbooks.add(true**);  

Аргумент add() обычно не содержит ничего в скобках или, возможно, 1 или 2, чтобы указать количество открываемых книг ... но "верно"? Спасибо

1 Ответ

0 голосов
/ 04 мая 2018

Вот документация для 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, и вам следует документировать это в комментарии к коду (и дайте нам знать тоже!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...