Взаємодія Excel: _Робочий аркуш чи аркуш?


76

Зараз я пишу про динамічне введення тексту і наводжу приклад взаємодії Excel. Я майже ніколи не робив жодної взаємодії з Office, і це видно. Підручник MSDN Office Interop для 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 або Office, лише виділяючи нові функції C # 4 - але я не хочу робити нічого справді, дуже тупого.

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

Отже, чи варто мені користуватися _Worksheetчи Worksheet, і чому?


5
Джон, на додаток до чудових відповідей, наведених тут, я хотів би додати, що, загалом, при роботі з Excel за допомогою взаємодії використовуйте назву класу, як це зазвичай відображається в Excel. Це означає, що замість "_Worksheet" використовується "Worksheet", а замість "ApplicationClass" використовується "Application". (Обговорення тут пояснює, чому не використовувати «ApplicationClass»: blogs.msdn.com/ptorr/archive/2004/02/05/67872.aspx. ) Якщо ви не знайомі з об’єктною моделлю Excel, яка зазнала впливу COM, тоді це може бути складніше, але я думаю, що це повинно бути досить зрозумілим більшу частину часу.
Майк Розенблюм,

На щастя, я дуже мало працюю з Office - насправді просто намагаюся показати нові функції. Дуже дякую за посилання - дуже корисно!
Джон Скіт,

Вибачте, але маю запитати - яку нову функцію C # 4 ви виділяєте?
Оскар

У цьому конкретному випадку це була динамічна типізація - типи повернення різних викликів / властивостей методів фактично є "динамічними", отже відсутність закидів, які в іншому випадку потребували б.
Джон Скіт,

Відповіді:


77

Якщо я правильно згадую - і моя пам’ять про це трохи розмита, минуло багато часу з того часу, як я розібрав Excel PIA на частини - це так.

Подія - це, по суті, метод, який об’єкт викликає, коли щось трапляється. У .NET події є делегатами, простими та простими. Але в COM дуже часто можна організувати цілу купу зворотних викликів подій в інтерфейси. Отже, у вас є два інтерфейси на даному об’єкті - „вхідний” інтерфейс, методи, які ви очікуєте від інших людей зателефонувати вам, і „вихідний” інтерфейс, методи, які ви очікуєте викликати до інших людей, коли трапляються події.

У некерованих метаданих - бібліотеці типів - для об’єкта, який можна створити, є визначення для трьох речей: вхідного інтерфейсу, вихідного інтерфейсу та coclass, в якому сказано: «Я об’єкт, що створюється, який реалізує цей вхідний інтерфейс, вихідний інтерфейс ".

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

Інтерфейс _Workbook - це вхідний інтерфейс кокласу книги. Інтерфейс робочої книги - це інтерфейс, який представляє сам коклас і, отже, успадковується від _Workbook.

Коротше кажучи, я б скористався Робочим зошитом, якщо ви зможете це зробити зручно; _Workbook - це трохи деталей реалізації.


Тут ми говоримо про Worksheet / _Worksheet ... ви зробили те саме неправильне читання, що і JP, але, як він зазначає, ситуація в основному еквівалентна. ;)
Noldorin

25

Якщо ви подивитесь на збірку PIA (Microsoft.Office.Interop.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, але це різниця.


8

Класи та інтерфейси лише для внутрішнього використання

Уникайте безпосереднього використання будь-якого з наступних класів та інтерфейсів, які використовуються внутрішньо і зазвичай не використовуються безпосередньо.

Клас / інтерфейс: приклади

classid Class: ApplicationClass (Word або Excel), WorksheetClass (Excel)

classid Події x _SinkHelper: ApplicationEvents4_SinkHelper (Word), WorkbookEvents_SinkHelper (Excel)

_classid : _Застосування (Word або Excel), _Робочий лист (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

редагувати: (повторне: форматування цієї відповіді) не може правильно відформатувати прокреслене нижнє підкреслення з наступним курсивом. Показує правильно в попередньому перегляді, але зламаний при публікації

edit2: працює, якщо ви зробите підкреслення саме курсивом, що концептуально жахливо, але виглядає так само


7

За останні кілька років я бачив і писав досить багато коду C # / Excel COM Interop, і я бачив, як робочий аркуш використовувався майже у кожному випадку. Я ніколи не бачив нічого остаточного від Microsoft на цю тему.


Дякую. З-за інтересу ви не відставали від удосконалень в C # 4? Вони звучать , як вони роблять велику різницю з точкою зору Управління Interop, але без досвіду , я на самому ділі просто вгадування (він же блефують, коли справа доходить до написання книги ...)
Джон Скит

Покращення динамічного / COM Interop виглядають корисними, коли доводиться використовувати COM, але я впевнений, що не буду використовувати динамічну функцію набагато більше. Те, чого я справді з нетерпінням чекаю, є в C # 4 / .NET 4 - це контракти коду та паралельна бібліотека завдань.
Джо Еріксон

6

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


4
Джон Скіт задає питання ?? Мені довелося скористатися цією рідкісною можливістю відповісти! :)
Noldorin

(Крім того, я міг би просто вибрати Робочий аркуш, бо це підкреслення там виглядає жахливо потворним ... Але серйозно, здається, немає причин не робити цього.)
Нолдорін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.