ich möchte ein XLS (ev. ein XLSX) Excel File in SharePoint 2010 uploaden. Dieses soll dann in einer SANDBOXED solution gelesen, analyisiert und die Inhalte in eine (bzw. mehrere) SharePoint-Listen geschrieben werden.
Geht das in einer Sandbox? Wenn ja: Wie kann man auf das in SP2010 upgeloadete File zugreifen und die Inhalte der einzelnen Zellen auslesen (mit VSTO wirds wohl nicht klappen?). Ich weiß dass ein Zugriff auf XLS(X)? per REST möglich sein sollte - aber aus sandbox auch? Ich suche also nach Tipps bzw. ev. eine best practice...
Frage, warum muss es eine Sandbox sein? Ich nehme mal an das du davon ausgehst das du die Excel-Datei nicht lesen kannst ohne Excel zu starten. Das stimmt aber nicht. Mittels ADO.Net kannst du eine Excel-Datei verarbeiten ohne Excel installiert haben zu müssen.
Hatte bereits in einem anderen Post die Antwort schonmal gegeben wie man mit den Standard .Net-Mitteln ohne Fremdkomponenten eine Excel-Datei einlesen kann. Das ganze Funktioniert mit ADO.Net und den passenden ODBC-Treibern (Jet und Ace - je nach dem obs um eine XLS oder XLSX Datei geht). Dieser Weg hat eine gute Perfomance und kommt auch mit sehr großen Datenmengen klar. Zumal man die Excel-Datei wie eine Datenbank anbinden kann und einfache SQL-Querys abschicken kann. Und er kommt komplett ohne die Notwendigkeit einer Sandbox aus :D
Der folgende Code wandelt dir eine beliebige Excel-Datei in eine DataTable um. Mit der kannst du dann machen was du willst. Das Beispiel arbeitet mit einem Stream als Ausgangsbasis, den Code kannst du aber problemlos adaptieren. Es werden alle Excel-Mappen umgewandelt weswegen die Rückgabe von Typ List<DataTable> ist. Der Code kommt mit XLS und XLSX-Dateien klar. Der Code ist in C# geschrieben. Eine Umwandlung in VB.Net sollte keine Hürde darstellen.
using System.Data; using System.IO; using System.Data.OleDb; using System.Collections.Generic; using System.Collections; public static List<DataTable> GetDataTabeleFromExcel(Stream stream, string extension) { List<DataTable> dtList = new List<DataTable>();
//----------------------------------------------------------------------- // Stream als Datei ins Tempverzeichnis schreiben //----------------------------------------------------------------------- FileInfo tempFile = new FileInfo(Path.GetTempFileName() + extension.ForceStartsWith("."));
int length = 256; int bytesRead = 0; Byte[] buffer = new Byte[length]; using (FileStream fs = new FileStream(tempFile.FullName, FileMode.Create, FileAccess.Write)) { do { bytesRead = stream.Read(buffer, 0, length); fs.Write(buffer, 0, bytesRead); } while (bytesRead == length); } stream.Dispose();