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

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

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

<code>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();
    }
}
</code>

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

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

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

 Jon Skeet27 июн. 2009 г., 07:47
К счастью, я делаюvery мало с Office - на самом деле просто пытаюсь показать новые функции. Большое спасибо за ссылку - очень полезно!
 Oskar09 июл. 2009 г., 17:40
Мне очень жаль, но я должен спросить - Какую новую функцию C # 4 вы выдвигаете на первый план?
 Jon Skeet09 июл. 2009 г., 18:12
В этом конкретном случае это была динамическая типизация - возвращаемые типы различных вызовов / свойств методов по сути являются «динамическими», отсюда и отсутствие приведений, которые в противном случае потребовались бы.
 Mike Rosenblum27 июн. 2009 г., 03:00
Джон, в дополнение к отличным ответам, которые здесь даются, я бы добавил, что, как правило, при работе с Excel через взаимодействие используйте имя класса, как оно обычно отображается в Excel. Это означает использовать «Рабочий лист». вместо «рабочего листа» и используйте «приложение»; вместо «ApplicationClass». (Обсуждение здесь объясняет, почему не использовать «ApplicationClass»:blogs.msdn.com/ptorr/archive/2004/02/05/67872.aspx.Если вы не знакомы с объектной моделью Excel, представленной в COM, то это может быть сложнее, но я думаю, что в большинстве случаев она должна быть достаточно понятной.

Ответы на вопрос(5)

Решение Вопроса

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

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

В неуправляемых метаданных - библиотеке типов - для создаваемого объекта есть определения для трех вещей: входящий интерфейс, исходящий интерфейс и кокласс, который говорит, что «я» создаю объект, который реализует этот входящий интерфейс и это исходящий интерфейс & quot ;.

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

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

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

 27 июн. 2009 г., 00:27
Это «Рабочий лист» / «Рабочий лист», о котором мы здесь говорим ... вы сделали то же неверное прочтение, что и JP, но, как он указывает, ситуация в основном эквивалентна. ;)

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но это разница.

Avoid directly using any of the following classes and interfaces, which are used internally and are typically not used directly.

Class/Interface : Examples

classid Class : ApplicationClass (Word or Excel), WorksheetClass (Excel)

classid Events x _SinkHelper : ApplicationEvents4_SinkHelper (Word), WorkbookEvents_SinkHelper (Excel)

_classid : _Application (Word or Excel), _Worksheet (Excel)

classid Events x : ApplicationEvents4 (Word), AppEvents (Excel)

I classid Events x : IApplicationEvents4 (Word), IAppEvents (Excel)

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

edit: (re: formatting of this answer) cannot correctly format an escaped underscore followed immediately by italic text. Shows correctly in preview but broken when posted

edit2: works if you make the underscore itself italic which is conceptually horrible but looks the same I suppose

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

 27 июн. 2009 г., 00:17
Улучшения динамического взаимодействия / COM-взаимодействия выглядят полезными, когда вам нужно использовать COM, но я уверен, что не буду использовать динамическую функцию для чего-то большего. В C # 4 / .NET 4 я действительно с нетерпением жду контрактов кода и Task Parallel Library.
 Jon Skeet27 июн. 2009 г., 00:09
Благодарю. Из интереса, вы не отставали от улучшений в C # 4? Oниsound как будто они имеют большое значение с точки зрения взаимодействия с Office, но без опыта, о котором я действительно только догадываюсь (иначе говоря, блефует, когда речь идет о написании книги ...)

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

 27 июн. 2009 г., 00:20
Джон Скитasking вопрос?? Мне пришлось воспользоваться этой редкой возможностью ответить! :)
 27 июн. 2009 г., 00:29
(Кроме того, я мог бы просто использовать Worksheet, потому что это подчеркивание выглядит ужасно уродливым ... Но если серьезно, то, похоже, нет причин этого не делать.)

Ваш ответ на вопрос