В Excel взаимодействие: лист или лист?


в настоящее время я пишу о динамической типизации, и я даю пример взаимодействия Excel. Я почти никогда руководство раньше, и это видно. Элемент MSDN Office Interop tutorial для C# 4 используется _Worksheet интерфейс, но есть и Worksheet интерфейс. Я понятия не имею, в чем разница.

в моем абсурдно простом демо-приложении (показано ниже) либо работает нормально - но если лучшая практика диктует одно или другое, я бы предпочел использовать его соответственно.

using System;
using System.Linq;
using Excel = Microsoft.Office.Interop.Excel;

class DynamicExcel
{
    static void Main()
    {
        var app = new Excel.Application { Visible = true };
        app.Workbooks.Add();

        // Can use Excel._Worksheet instead here. Which is better?
        Excel.Worksheet workSheet = app.ActiveSheet;

        Excel.Range start = workSheet.Cells[1, 1];
        Excel.Range end = workSheet.Cells[1, 20];
        workSheet.get_Range(start, end).Value2 = Enumerable.Range(1, 20)
                                                           .ToArray();
    }
}

Я пытаюсь избежать полного глубокого погружения в COM или офисную совместимость, просто выделяя новые функции C# 4 - но я не хочу делать ничего действительно, действительно глупого.

(там может быть что-то очень, очень глупо в коде выше, а в этом случае, пожалуйста, дайте мне знать. Использование отдельных начальных/конечных ячеек вместо просто "A1:T1" является преднамеренным - легче увидеть, что это действительно диапазон из 20 ячеек. Что-нибудь еще, вероятно непреднамеренный.)

Итак, я должен использовать _Worksheet или Worksheet и почему?

5 67

5 ответов:

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

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

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

теперь, когда библиотека типов автоматически переводится в метаданные, эти отношения, к сожалению, сохраняются. Было бы лучше иметь ручной PIA, который сделал классы и интерфейсы более соответствующими тому, что мы ожидали бы в управляемом мире, но, к сожалению, этого не произошло. Поэтому офис PIA полон этих, казалось бы, странных дубликатов, где каждый создаваемый объект, кажется, имеет два интерфейса, связанные с ним, с тем же материалом на них. Один из интерфейсов представляет интерфейс для совместного класса, и один из них представляет входящий интерфейс для компонентного класса.

интерфейс _Workbook-это входящий интерфейс в совместном классе книг. Интерфейс рабочей книги-это интерфейс, который представляет собой сам кокласс и поэтому наследуется от _Workbook.

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

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

public interface Workbook : _Workbook, WorkbookEvents_Event

Workbook и _Workbook но добавляет события. То же самое для Worksheet (извините, просто заметил, что вы не говорили о Workbooks)...

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;
}

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

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

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

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

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)

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

http://msdn.microsoft.com/en-gb/library/ms247299(офис.11).аспн

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

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

Я видел и написал довольно много кода взаимодействия c# / Excel COM за последние несколько лет, и я видел рабочий лист, используемый почти в каждом случае. Я никогда не видел ничего определенного от Microsoft по этому вопросу.

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