.add (true) что означает "истинный" параметр / аргумент

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

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

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

excel interop - ужасное место для начала обучения

Steve 04.05.2018 19:30

Что ж, здесь - это документы, хотя add находится в случае Паскаля. Не уверен, почему твой нет

pushkin 04.05.2018 19:31

Да, там написано add (object Template) и требуется перечисление, а не логическое значение.

Kyle B 04.05.2018 19:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
98
1

Ответы 1

Вот документация для 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. Так что скорее всего, взаимодействие останется таким навсегда.

Steve 04.05.2018 19:58

JavaScript API @Steve Office не предназначен для автоматизации Office, он предназначен для предложения различных «услуг» через пользовательский интерфейс, хотя функциональность во многом пересекается, и нет никаких признаков того, что COM API будет вообще исключен. API взаимодействия с C# - это всего лишь тонкая оболочка, которая в любом случае создается автоматизированной программой.

Dai 04.05.2018 20:01

@Steve А Microsoft любит TypeScript!

Dai 04.05.2018 20:01

@Dai Привет, дай ... Спасибо! за вашу помощь с add (). Я попробую ваши предложения.

jdonnelly 04.05.2018 20:16

@Dai просто заменил add (true) на просто add () .... и на результаты выполнения программы это никак не повлияло. Еще раз спасибо.

jdonnelly 04.05.2018 20:37

Отличный ответ на, казалось бы, простой вопрос

jleach 04.05.2018 22:16

Другие вопросы по теме