Вопрос по excel, interop, c# – Взаимодействие с Excel: _Worksheet или Worksheet?

70

В настоящее время я пишу о динамической типизации, и я привожу пример взаимодействия 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, и почему?

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

Ваш Ответ

5   ответов
24

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

8

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

7

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

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

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

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

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

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

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

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

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

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

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

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