Ο παραπάνω τρόπος απαιτεί να υπάρχει το Excel στον υπολογιστή σου. Επίσης, η Dim EXL As New Excel.Application() ανοίγει το Excel αν και δεν φαίνεται. Στο τέλος θα πρέπει όχι μόνο να κάνεις EXL.Quit() αλλά και EXL.Dispose(), διαφορετικά δεν θα ελευθερωθεί το reference μέχρι να τρέξει o garbage collector. Το ίδιο ισχύει και για τις sh1 = Nothing, wb0 = Nothing. Είναι πολύ εύκολο να ξεχάσεις κάποιο reference με αποτέλεσμα να παραμεινει ανοικτό το Excel ακόμα και αν ολοκληρωθεί η εκτέλεση του κώδικα σου.
Οι παραπάνω περιορισμοί κάνουν απαγορευτική τη χρήση του Excel API σε servers, είτε πρόκειται για web applications είτε για web services. Εναλλακτικά μπορείς να χρησιμοποιήσεις τον Jet OLE DB Provider για να διαβάσεις και να γράψεις τα περιεχόμενα ενός Excel sheet σα να είναι πίνακας σε βάση. Αυτό δεν απαιτεί την ύπαρξει του Excel στο μηχάνημα και φυσικά δεν δημιουργεί instances του Excel. Δες το Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory του David Hayden.
Συνοπτικά, χρησιμοποιείς ένα connection string του τύπου string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Book1.xls;Extended Properties=""Excel 8.0;HDR=YES;"""; για να ανοίξεις το Excel σαν πίνακα και statements όπως "SELECT ID,City,State FROM [Sheet1$]"; για να διαβάσεις τα περιεχόμενα του κάθε Sheet στο WorkBook.
Άκόμα και αυτή η λύση έχει κάποια προβλήματα. Τα κελιά του Excel δεν έχουν συγκεκριμένο τύπο ενώ το ADO.NET περιμένει κάθε στήλη να έχει τύπο. Ο OLE DB Provider προσπαθεί να μαντέψει τί τύπου είναι κάθε στήλη διαβάζοντας τις πρώτες Χ γραμμές. Αν όλες οι γραμμές μέχρι τη Χ είχαν στο πεδίο C νούμερα και η X+1 έχει κείμενο, ο provider θα νομίσει ότι η στήλη C περιέχει αριθμούς και θα ρίξει exception όταν προσπαθήσει να διαβάσει τη γραμμή Χ+1.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos