Excel interop: _Worksheet или Рабочий лист?

Python делает все, что делают другие языки программирования, за половину времени разработки ... и Google тоже! Если вы не согласны, проверьте Лягушку в порожнем состоянии .

Подождите, это факт. Это все еще квалифицируется как ответ на этот вопрос?

74
задан pnuts 15 September 2015 в 00:52
поделиться

5 ответов

Если я правильно помню - и мои воспоминания об этом немного расплывчаты, прошло много времени с тех пор, как я разбирал Excel PIA на части - вот как это.

Событие по сути, это метод, который объект вызывает, когда что-то происходит. В .NET события - это простые и понятные делегаты. Но в COM очень распространено объединение множества обратных вызовов событий в интерфейсы. Таким образом, у вас есть два интерфейса для данного объекта - «входящий» интерфейс, методы, которые, как вы ожидаете, вызовут другие люди, и «исходящий» интерфейс, методы, которые вы ожидаете вызывать у других людей, когда происходят события.

В неуправляемых метаданных - библиотеке типов - для создаваемого объекта есть определения для трех вещей: входящего интерфейса, исходящего интерфейса и кокласса, в котором написано «Я» Интерфейс Workbook - это интерфейс, который представляет сам компонентный класс и, следовательно, наследуется от _Workbook.

Короче говоря, я бы использовал Workbook, если вы можете сделать это удобно; _Workbook - это небольшая деталь реализации.

77
ответ дан 24 November 2019 в 12:00
поделиться

Если вы посмотрите на сборку PIA (Microsoft.Office.Interop.Excel) в Reflector , интерфейс Workbook имеет это определение ...

public interface Workbook : _Workbook, WorkbookEvents_Event

Рабочая книга - это _Workbook , но с добавлением событий. То же самое для Рабочий лист (извините, только что заметил, что вы не говорили о Рабочих тетрадях ) ...

public interface Worksheet : _Worksheet, DocEvents_Event

DocEvents_Event ...

[ComVisible(false), TypeLibType((short) 0x10), ComEventInterface(typeof(DocEvents),
                     typeof(DocEvents_EventProvider))]
public interface DocEvents_Event
{
    // Events
    event DocEvents_ActivateEventHandler Activate;
    event DocEvents_BeforeDoubleClickEventHandler BeforeDoubleClick;
    event DocEvents_BeforeRightClickEventHandler BeforeRightClick;
    event DocEvents_CalculateEventHandler Calculate;
    event DocEvents_ChangeEventHandler Change;
    event DocEvents_DeactivateEventHandler Deactivate;
    event DocEvents_FollowHyperlinkEventHandler FollowHyperlink;
    event DocEvents_PivotTableUpdateEventHandler PivotTableUpdate;
    event DocEvents_SelectionChangeEventHandler SelectionChange;
}

Я бы сказал, что лучше всего используйте Рабочий лист , но в этом разница.

25
ответ дан 24 November 2019 в 12:00
поделиться

Классы и интерфейсы для внутреннего Только использовать

Избегайте прямого использования любого из следующие классы и интерфейсы, которые используются внутри и являются обычно не используется напрямую.

Класс / Интерфейс: Примеры

classid Класс: ApplicationClass (Word или Excel), WorksheetClass (Excel)

classid События x _SinkHelper: ApplicationEvents4_SinkHelper (Word), WorkbookEvents_SinkHelper (Excel)

_classid : _Application (Word или Excel), _Worksheet (Excel)

classid События x: ApplicationEvents4 (Word), AppEvents (Excel)

I classid События x: IApplicationEvents4 (Word), IAppEvents (Excel)

http://msdn.microsoft.com/en-gb/library/ms247299 (office.11) .aspx

edit: (re: форматирование этого answer) не может правильно отформатировать экранированный символ подчеркивания, за которым сразу следует курсивный текст. Отображается правильно в предварительном просмотре, но не работает при публикации

edit2: работает, если вы сделаете подчеркивание курсивом, что концептуально ужасно, но выглядит так же, я полагаю

8
ответ дан 24 November 2019 в 12:00
поделиться

Я видел и писал довольно немного кода C # / Excel COM Interop за последние несколько лет, и я видел, что Worksheet использовался почти во всех случаях. Я никогда не видел ничего определенного от Microsoft по этому поводу.

7
ответ дан 24 November 2019 в 12:00
поделиться

MSDN показывает, что Интерфейс рабочего листа просто наследуется от интерфейсов _Worksheet и DocEvents_Event . Казалось бы, можно просто предоставить события, которые объект рабочего листа может вызвать в дополнение ко всему остальному. Насколько я понимаю, Рабочий лист не предоставляет никаких других собственных членов. Так что да, вы можете просто использовать интерфейс Worksheet во всех случаях, поскольку он ничего не теряет, и потенциально могут потребоваться события, которые он раскрывает.

6
ответ дан 24 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: