VB.Net a MSOffice Excel   zodpovězená otázka

VB.NET, Visual Studio, WinForms, Office, .NET

Řeším přístup k objektovému modelu excelu z vb.net, aby reference nebyla závislá na verzi office, nevystačím s GetObject a CreateObject, potřebuji se mj. také dostat k událostem.

Jakým způsobem provést referenci nezávisle na verzi, resp. pokrýt verze 2003, 2007, 2010?

Co používáte? Nějaký office wraper? NetOffice? Excel DNA ?

Jak na tvorbu doplňku(com addin) pro excel v Express verzi visual studia? Potřebné templates jsou zřejmě jen v plné verzi?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu bez reference události nejdou, resp. nejdou události, kde jsou v parametru nějaké typy z Excel knihovny.

Následující kód použije Reflection pro získání delegáta a zaregistrování události, ale chodí to pouze pokud v parametrech události nejsou typy z chybějící reference Excelu:

Option Strict Off

Private Sub ExcelTest()
        Dim ExcelType As Type = Type.GetTypeFromProgID("Excel.Application")
        Dim Excel As Object = Activator.CreateInstance(ExcelType)

        Excel.Visible = True

        Dim ExcelAssembly As Assembly = ExcelType.Assembly
        Dim AppEventsType As Type = ExcelAssembly.GetType("Microsoft.Office.Interop.Excel.AppEvents_Event")

        Dim AfterCalculateDelegateType As Type = ExcelAssembly.GetType("Microsoft.Office.Interop.Excel.AppEvents_AfterCalculateEventHandler")
        Dim AfterCalculateDelegate As [Delegate] = [Delegate].CreateDelegate(AfterCalculateDelegateType, Me, "Application_AfterCalculate")
        AppEventsType.GetEvent("AfterCalculate").AddEventHandler(Excel, AfterCalculateDelegate)

        'Chyba: 'Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.'
        'Dim AppEventsNewWorkbookDelegateType As Type = ExcelAssembly.GetType("Microsoft.Office.Interop.Excel.AppEvents_NewWorkbookEventHandler")
        'Dim AppEventsNewWorkbookDelegate As [Delegate] = [Delegate].CreateDelegate(AppEventsNewWorkbookDelegateType, Me, "Application_NewWorkbook")
        'AppEventsType.GetEvent("NewWorkbook").AddEventHandler(Excel, AppEventsNewWorkbookDelegate)
    End Sub

    Private Sub Application_AfterCalculate()
        MessageBox.Show("AfterCalculate")
    End Sub

    Private Sub Application_NewWorkbook(Workbook As Object) 'Měl by být Microsoft.Office.Interop.Excel.Workbook
        MessageBox.Show("NewWorkbook")
    End Sub

Asi Vám to moc nepomůže, ale co kdyby.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Odlišnosti musím poladit, aby pracovalo dle příslušné verze, jinak skvělé.

Např. AfterCalculate ve verzi 2007, ale ve verzi 2003 SheetCalculate...

Např. událost NewWokbook je stejná a pro obě verze lze použít:

Dim AppEventsNewWorkbookDelegateType As Type = ExcelAssembly.GetType("Microsoft.Office.Interop.Excel.AppEvents_NewWorkbookEventHandler")
        Dim mi As MethodInfo = Me.GetType().GetMethod("Application_NewWorkbook", BindingFlags.NonPublic Or BindingFlags.Instance)
        Dim AppEventsNewWorkbookDelegate As [Delegate] = [Delegate].CreateDelegate(AppEventsNewWorkbookDelegateType, Me, mi)
        AppEventsType.GetEvent("NewWorkbook").AddEventHandler(Excel, AppEventsNewWorkbookDelegate)

Workbook as Object v deklaraci metody to překousne.

Asi Vám to moc nepomůže, ale co kdyby.

Naopak, velmi jste mi pomohl a moc Vám děkuji za Vaši odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zvláštní, že mě to s Object nefungovalo viz. chyba Cannot bind to the target... Ale možná je to tou jinou verzí Office. Já to zkoušel proti 2013.

K tomu jak jsou události pojmenované jsem používal to, že jsem si v samostatným projektu vygeneroval interop přes referenci a koukal object browserem (nebo Reflektorem) co to obsahuje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback