Excel Managed Code Assembly
VSTO?
Onlangs kreeg ik een verzoek van een klant om de inhoud van Excel bestanden op een webserver uit te lezen en om te zetten in XML. Dat verzoek leek mij bij uitstek de gelegenheid om eens aan de slag te gaan met VSTO. Microsoft heeft met Visual Studio Tools for Applications .Net ondersteuning gerealiseerd voor Office applicaties, waar Excel ook onder valt. Na het bijwonen van verschillende VSTO-presentaties was het immers alleen nog wachten op een verzoek waarbij VSTO toegepast zou kunnen worden.
Helaas kwam ik er achter dat de VSTO-uitbreiding min of meer aan Excel-bestanden vast geplakt wordt
Helaas kwam ik er achter dat de VSTO-uitbreiding min of meer aan Excel-bestanden vast geplakt wordt. Een bestaand XLS-bestand kan niet worden ingelezen. Het idee achter VSTO is dat er vanuit VSTO een XLS bestand moet worden aangemaakt, waarbij er ook nog een extra assembly-bestand aan wordt toegevoegd waarin de .Net functionaliteit zich bevindt. Vanaf dat moment kan het bestand verspreid worden en is het later mogelijk om dat bestand weer in te lezen vanuit een .Net applicatie. Ik heb daarbij bovendien gemerkt dat op een Excel-client de VSTO-runtime geïnstalleerd moet worden.
Mijn klant had echter het verzoek om XLS bestanden in te kunnen lezen die niet ‘voorbehandeld’ zijn. Het is vaak niet mogelijk om bij de aanleverende partijen software te installeren (zoals de VSTO-runtime).Bovendien is de Excel-versie niet altijd even recent en vaak worden de XLS-bestanden aangemaakt vanuit propietary applicaties. Daarmee viel het gebruik van VSTO helaas af.
COM?
De alternatieve oplossing bestond uit het installeren van Excel op een webserver. Via COM kan dan een Excel-bestand geautomatiseerd worden geopend. Deze aanpak heeft echter een hele serie nadelen (NB: dit overzicht is niet compleet :-():
- Excel (Office) op een webserver is ongewenst vanwege mogelijke security leaks als gevolg van de installatie van Office en veel systeembeheerders willen Office eenvoudigweg niet op een webserver zien
- Bij het openen van een Excel document kunnen vragen gesteld worden zoals het wel of niet mogen inschakelen van macro’s. Dergelijke UI-meldingen worden niet ondersteund in een ASP-omgeving, zodat een dergelijk bestand niet geopend kan worden, of er ontstaan exceptions in het ASP-proces.
- Het ASP-account moet een aanzienlijke hoeveelheid extra rechten krijgen om Office te mogen starten. Dat geeft mogelijke security leaks.
- Het aanroepen van COM-componenten vanuit .Net vraagt om een Interop-wrapper. De .Net software wordt daar niet stabieler van.
- De COM-wrapper ondersteunt geen optionele parameters bij gebruik van C#, zodat functies compleet moeten worden aangeroepen. De documentatie van de Excel COM DLL is echter niet altijd even duidelijk, terwijl dat wel nodig is wanneer alle parameters opgegeven moeten worden.
Wat dan?
Nu zowel VSTO als het direct gebruik van Excel afvallen, resteert een zoektocht op Internet naar verschillende aanbieders van componenten waarmee Excel-bestanden gemuteerd kunnen worden. Het blijkt toch nog niet mee te vallen om third party leveranciers te vinden. Blijkbaar is communicatie met Office bestanden redelijk complex en in principe voorbehouden aan Microsoft zelf. SyncFusion is een bedrijf dat managed-code-componenten aanbiedt waarmee het mogelijk is om te communiceren met in Office aangemaakte bestanden. SyncFusion doet overigens meer dan dat alleen, waaronder GUI-componenten, maar dat valt buiten de scope van dit artikel.
SyncFusion XlsIO

De overhead van de Syncfusion-installatie is minimaal, en Excel zelf is niet nodig. Van de website van SyncFusion kan een 30 dagen trial versie gedownload worden die alle functionaliteit biedt. Sinds kort ondersteunt SyncFusion ook Office 2007.
Nadat een web-project wordt aangemaakt, moeten referenties worden aangemaakt naar SyncFusion.XlsIO.Base en naar SyncFusion.XlsIO.Web. Uiteraard is SyncFusion ook te gebruiken in een Winforms-applicatie; in dat geval volstaat een referentie naar SyncFusion.XlsIO.Base.
Uitlezen van een Excel-bestand in een ASP.Net-omgeving
Een willekeurig Excel-bestand kan worden uitgelezen met behulp van .Net. De volgende code geeft een voorbeeld hoe dat mogelijk is:
Imports Syncfusion.XlsIO;
Public Partial Class _Default : _
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object,_
ByVal e As EventArgs)
Dim excelEngine As ExcelEngine = New ExcelEngine()
Dim workBook As IWorkbook = _
excelEngine.Excel.Workbooks.Open("c:\test.xls")
Dim sheet As IWorksheet = workBook.Worksheets(0)
Response.Write(sheet.Range("A1").Text)
excelEngine.ThrowNotSavedOnDestroy = False
excelEngine.Dispose()
End Sub
End Class
In deze code wordt de Excel-engine van SyncFusion geïnstantieerd en wordt het bestand “test.xls” geopend als workbook. Uit dat workbook wordt vervolgens van worksheet 0 de inhoud geprint van cell A1.
Het statement ThrowNotSavedOnDestroy zorgt ervoor dat er geen eventueel exception ontstaat bij het sluiten van een workbook wanneeer daar mutaties in aangebracht zijn. In dit voorbeeld zal dat echter nooit het geval zijn.
Uitlezen van een Excel bestand in een Win32 omgeving
Vrijwel dezelfde code als hierboven kan worden gebruikt om een Excel-bestand uit te lezen in een Win32-omgeving:
Imports Syncfusion.XlsIO
Public Class Form1
Private Sub Button1_Click(_
ByVal sender As System.Object,+
ByVal e As System.EventArgs) Handles Button1.Click
Dim excelEngine As ExcelEngine = New ExcelEngine
Dim iApplication As IApplication = _
excelEngine.Excel
Dim workBook As IWorkbook = _
excelEngine.Excel.Workbooks.Open("c:\test.xls")
Dim sheet As IWorksheet = workBook.Worksheets(0)
Dim content As String = sheet.Range("A1").Text
MessageBox.Show(content)
excelEngine.ThrowNotSavedOnDestroy = False
excelEngine.Dispose()
End Sub
End Class
Aanmaken van een Excel bestand vanaf scratch
Vergelijkbaar met het uitlezen van een bestaand Excel-bestand is het ook mogelijk om een Excel-bestand aan te maken vanaf scratch.
Dim excelEngine As ExcelEngine = New ExcelEngine()
Dim application As IApplication = excelEngine.Excel
Dim workbook As IWorkbook = _
application.Workbooks.Create()
Dim sheet As IWorksheet = workBook.Worksheets(0)
sheet.Range("A1").Text = "Dag SDN lezer"
workbook.SaveAs("c:\test.xls")
workBook.Close()
Deployment
Om SyncFusion te kunnen deployen in een Asp.Net omgeving moet de directory waar de webapplicatie zich in bevindt, binnen IIS worden ingesteld als ‘Application’. De assembly SyncFusion.XlsIO.Base moet worden geplaatst in de .\Bin folder en in een webomgeving SyncFusion.XlsIO.Web. Er hoeven geen additionele runtime kosten te worden betaald. Het enige wat aangekocht moet worden is een licentie per developer die gebruik wil maken van de Syncfusion componenten.
Samenvatting
Als je flink gaat zoeken zullen er ongetwijfeld nog enkele bedrijven te vinden zijn die managed-code componenten aanbieden om te communiceren met Office. Veel zijn het er echter niet, wat zoals eerder opgemerkt waarschijnlijk te maken heeft met de complexiteit van in Office gegenereerde bestanden. SyncFusion heeft hierin goed voorzien met een behoorlijk lichtgewicht XlsIO assembly. Met een verkoopprijs per developer van 495 dollar en een royalty free runtime deployment was dit wat mij betreft de oplossing voor de vraag die ik van een klant kreeg om Excel bestanden te kunnen uitlezen vanuit een Asp.Net webserver.
XlsIO biedt nog veel meer mogelijkheden, waaronder zelfs het uitvoeren van Excel VBA macro’s. De toepassing die ik nodig heb is simpel van opzet, maar de toepasbaarheid van deze assembly gaat veel verder. Meer informatie over de hier beschreven tools is te vinden op http://www.syncfusion.com.