9.25.2008

Použivani MS Office z prostředí .NET

Jedna z častých otázek, která se objevuje na diskuzních fórech, je ovládání MS Office či přístup do jejich souborů. Přestože se to zdá jako jednoduchý úkol, realita je trošku někde jinde.
Máte v zásade tři možnosti, které mají své pro i proti.

1) OleDB provider pro Excel
2) Visual Studio Tools for Office ( VSTO )
3) Napsat si vlastni wrapper

Paradoxne nejjednodužší (*) a nejspolehlivějši je třetí možnost.
Když využijete schopnost VB.NET - late binding - tak můžete komunikovoat s COM rozhraním Office s poměrně vysokým (oproti ostatním možnostem) komfortem. V podstatě opisujete to, co vidíte ve VBA u Office a Excelu/Wordu/Outlooku/atd...

Přiklad:

Public Class ExcelApplication

    private m_NativeApplication As Object 'COM objekt s aplikaci excelu

     Public Sub New(nativeApplication As Object) 'konstruktor
         m_NativeApplication = nativeApplication
     End Sub

     Public Shared Function CreateApplication() As ExcelApplication
         Dim comObj = CreateObject("Excel.Application") 'vytvori instanci COM objektu excelu
         Dim ret As New ExcelApplication(comObj) 'vytvori wrapper tridu nad COM objektem
         Return ret
     End Function

     Public Readonly Property WorkBooks() As WorkBooks
         Get
             Dim comObj As Object = m_NativeApplication.WorkBooks 'ziska se COM objekt WorkBooks
             Dim ret As New WorkBooks(comObj)
             Return ret
         End Get
     End Property

     Public Sub Quit()
         m_NativeApplication.Quit() 'za behu aplikace se "samo" zjisti jaka metoda se ma zavolat = late binding
    End Sub
End Class

Public Class WorkBooks
     Dim m_NativeWorkBooks As Object

     public Sub New(nativeWorkBooks as Object)
         m_NativeWorkBooks = nativeWorkBooks
End Sub

     Public Default Readonly Property Item(index As Integer)
         Get
             Dim comObj as Object = m_NativeWorkBooks(index)
             Dim ret As new WorkBook(comObj)
             Eeturn ret
         End Get
     End Property

     Public Function Open(filename As String) As WorkBook
         Dim comObj as Object = m_NativeWorkBook.Open(filename)
         Dim ret As New WorkBook(comObj)
         Return ret
     End Function

End Class

...
...
...


A takto si vytvoříte třídy, jejich metody a property, které potřebujete. Navíc nejste zavislí na konkrétni verzi Office. Toto bude fungovat na Office 2000, xp, 2003, a novejsi, mozna i starsi.

(*) S příchodem VSTO 2007 SE se situace trochu zlepšila, a už to není tak strašné. Leč, stále mají co vylepšovat.

P.S.: Pokud chcete těch tříd hodně, zamyslete se nad možnosti automatické generace kódu.

No comments: