Я только начал изучать C# и использую Visual Studio для написания программ. После долгого поиска в Интернете и моей книги C# ... и вопросов другим опытным программистам ... ничего не ответил на следующий вопрос: что означает параметр / аргумент "истина" в методе add() в следующих строках кода:
var excel = new microsoft.office.interop.excel.application();
var workbook = excel.workbooks.add(true**);
аргумент add() обычно не имеет ничего в скобках или, может быть, 1 или 2, чтобы указать количество книг, которые нужно открыть ... но "верно"? Спасибо
Что ж, здесь - это документы, хотя add находится в случае Паскаля. Не уверен, почему твой нет
Да, там написано add (object Template) и требуется перечисление, а не логическое значение.





Вот документация для 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
Еще больше сбивает с толку то, что преобразование вашего значения Booleantrue в объект COM Variant выполняется полностью за кулисами. Но сначала давайте рассмотрим задокументированные допустимые значения аргументов:
Optional Object. Determines how the new workbook is created. If this argument is a string specifying the name of an existing Microsoft Excel file, the new workbook is created with the specified file as a template. If this argument is a constant, the new workbook contains a single sheet of the specified type. Can be one of the following XlWBATemplate constants: xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet, or xlWBATWorksheet. If this argument is omitted, Microsoft Excel creates a new workbook with a number of blank sheets (the number of sheets is set by the SheetsInNewWorkbook property).
... это нужно учитывать!
Мы можем определить, какими будут перегрузки, а затем задокументировать их отдельно:
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, и вам следует задокументировать это в комментарии к коду (и сообщить нам тоже!)
Я думаю, что они отказываются от взаимодействия с C# и переходят на подход js. Так что скорее всего, взаимодействие останется таким навсегда.
JavaScript API @Steve Office не предназначен для автоматизации Office, он предназначен для предложения различных «услуг» через пользовательский интерфейс, хотя функциональность во многом пересекается, и нет никаких признаков того, что COM API будет вообще исключен. API взаимодействия с C# - это всего лишь тонкая оболочка, которая в любом случае создается автоматизированной программой.
@Steve А Microsoft любит TypeScript!
@Dai Привет, дай ... Спасибо! за вашу помощь с add (). Я попробую ваши предложения.
@Dai просто заменил add (true) на просто add () .... и на результаты выполнения программы это никак не повлияло. Еще раз спасибо.
Отличный ответ на, казалось бы, простой вопрос
excel interop - ужасное место для начала обучения