| 

.NET C# Java Javascript Exception

3
Hi all .net/SharePoint Developers,

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...

Danke für Tipps!
19.02.2011
Tony43 73 5
1
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.
Floyd 09.03.2011
Auf die Beantwortung dieser Frage war ein Kopfgeld in Höhe von 50 Reputationspunkten ausgesetzt. Das Kopfgeld wurde bereits vergeben.
3 Antworten
4
Ich habe gute Erfahrungen mit dieser Bibliothek gemacht:

http://exceldatareader.codeplex.com/

Sehr einfach zu benutzen und der Source-Code ist verfügbar.

Nachteile:
- Passwortgeschützte Exceldateien können nicht gelesen werden
- Zeilenfilter sollten vorher in der Exceldatei gelöscht werden
22.03.2011
mblaess 1,2k 1 9
3
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();

//-----------------------------------------------------------------------
// Excel öffnen und verarbeiten
//-----------------------------------------------------------------------
string strConn = "Provider=Microsoft.{0}.OLEDB.{1};Data Source=" + tempFile.FullName + ";Extended Properties=\"Excel {2};HDR=Yes;\""; ;
if (extension.ForceStartsWith(".").ToLower() == ".xls")
strConn = string.Format(strConn, "Jet", "4.0", "8.0");
else if (extension.ForceStartsWith(".").ToLower() == ".xlsx")
strConn = string.Format(strConn, "Ace", "12.0", "12.0");

OleDbConnection excelConn = new OleDbConnection(strConn);
excelConn.Open();

//-----------------------------------------------------------------------
// Workbook-Namen auslesen
//-----------------------------------------------------------------------
DataTable schemaTable = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
foreach (DataRow schemaRow in schemaTable.Rows) {
String WorkbookName = schemaRow["TABLE_NAME"].ToString().Replace("'", "");

//-----------------------------------------------------------------------
// Daten aus dem Workbook abrufen
//-----------------------------------------------------------------------
OleDbCommand excelCmd = new OleDbCommand("SELECT * FROM [" + WorkbookName.ForceEndsWith("$") + "]", excelConn);
excelCmd.CommandType = CommandType.Text;
OleDbDataAdapter excelDA = new OleDbDataAdapter(excelCmd);
DataTable dt = new DataTable();
excelDA.Fill(dt);

//-----------------------------------------------------------------------
// Spaltenbeschreibungsliste überprüfen und ggf. verändern
//-----------------------------------------------------------------------
int ColumnC = 0;
StringBuilder ColumnNameList = new StringBuilder();
foreach (DataColumn nC in dt.Columns) {
ColumnC++;
nC.Caption = nC.ColumnName;
if (nC.ColumnName == "") {
nC.ColumnName = ColumnC.ToString();
nC.Caption = ColumnC.ToString();
}
nC.ColumnName += '_' + System.Guid.NewGuid().ToString();
ColumnNameList.Append(nC.Caption + ";");
}
dt.ExtendedProperties.Add("HeadLine_CheckSum", ColumnNameList.ToString().GetMD5Hash());
dt.ExtendedProperties.Add("WorkbookName", WorkbookName);
dtList.Add(dt);
dt = null; excelDA = null; excelCmd = null; WorkbookName = null;
}
excelConn.Close();
if (tempFile.Exists) tempFile.Delete();
return dtList;
}
}
22.03.2011
Floyd 14,6k 3 9
Floyd 14,6k 3 9
0
Cool! Danke euch für eure Infos.
Ich probiers mal aus und melde mich dann mit meinen Erfahrungen hier!

lg, Toni
28.03.2011
Tony43 73 5

Stelle deine Sharepoint-Frage jetzt!