SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Daten via Excel (ODC Datei) auslesen, verarbeiten und in eine Sharepointliste eintragen

Unbeantwortet Dieser Beitrag hat 4 Antworten

Ohne Rang
46 Beiträge
Markus Doll erstellt 10 Okt. 2012 11:43
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich sitze nun schon seit über einem Jahr an einer Windows Forms Anwendung die Daten über eine ODC Datei (mit Hilfe von Excel) aus einer Datenbank auslesen, verarbeiten und dann entsprechede Einträge in Sharepointlisten anlegen soll.

Leider habe ich nur wenig Zeit, weshalb sich das bisher so hingezogen hat.

Gestern habe ich nun den Quellcode fertig gestellt, stehe nun aber vor einem Problem.

Zum Auslesen der Daten aus der "Exceldatei" muss das Target Framework ".Net Framework 4.0" sein, damit ich auf alle Eigenschaften der Zellen bzw. auf ".Value2" zugreifen kann. Nehme ich .Net Framework 3.5, habe ich nur die option Range.ToString() auszuwählen, die mir dann aber nicht den eigentlichen Zellwert zurück liefert. Anschließend werden die Daten im Code verarbeitet und Einträge in Sharepointlisten erstellt. Das Problem ist, das wenn ich mit SPSite die Testbox aufrufe eine Ausnahme entsteht, weil (bei einer 32 Bit App) der Zugriff nicht möglich sei bzw. (bei 64 Bit) diese Meldung kommt -> +  $exception {"Microsoft SharePoint is not supported with version 4.0.30319.269 of the Microsoft .Net Runtime."} System.Exception {System.PlatformNotSupportedException}.

Kann mir jemand sagen, wie ich mein Vorhaben in nur einem VS Projekt realisieren kann?

Es muss nichtmal eine Windows Forms Anwendung sein, es könnte auch innerhalb eines TimerJobs laufen, wobei auch hier wieder die Limitierung des .Net Framework 3.5 zuschlägt, es sei denn es gibt noch andere Möglichkeiten.

Als letzte mögliche Instanz habe ich mir ein zweigeteiltes Konstrukt überlegt, das mit Hilfe einer XML Datei, in der die Windows Forms Anwendung die Daten aus Excel ablegt und einem TimerJob auf SHarepointseite der die XML Datei ausliest, das bewerkstelligt, was ich brauche, jedoch kann ich mir fast nicht vorstellen, das es tatsächlich keinen direkten Weg geben soll.

Ich bin für alle Anregungen offen.

Vielen Dank & Gruß,

Markus

 

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 10 Okt. 2012 12:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du greifst also über das Excel-Objektmodell auf eine Exceldatei zu? Ich habe sowas schon mit .NET 1.0 gemacht und hatte dabei nie Probleme an die Zellwerte zu kommen. es sollte also unabhängig von der Framework-Version funktionieren. Wenn ich die Zeit finde, schaue ich mal in die alten Projekte...

Eine andere Möglichkeit (und wahrscheinlich die bessere), wäre die Verwendung von System.IO.Packaging. Damit kann man die xlsx-Datei direkt öffnen und auf die Inhalte zugreifen. Das ist zwar nicht so komfortabel wie das Objektmodell, braucht aber kein installiertes Excel und könnte damit auch auf dem Server laufen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 10 Okt. 2012 17:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich greife über Microsoft.Office.Interop.Excel auf die Excelfunktionalität zu.

Ich arbeite mit einem Rangeobjekt das alle genutzten Zellen enthält (Range range = (Range)worksheet.UsedRange;) und genau -> .UsedRange <- scheint es - wenn ich .Net 3.5 als Target Framework angebe nicht zu geben, weshalb ich nicht auf die Methoden und Eigenschaften zugreifen kann.

Ich versuche es nun über get_range, was mir bei .Net 3.5 angeboten wird. Jedoch bekomme ich beim öffnen des Workbooks, seitdem ich das Projekt auf .Net 3.5 umgestellt habe nun eine "+  $exception {"Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"} System.Exception {System.Runtime.InteropServices.COMException}
" Exception. Laut M$ bezieht sich dieser Fehler auf die Systemlocale, die von der OS Sprache abweicht...(http://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&ved=0CDAQFjAB&url=http%3A%2F%2Fsupport.microsoft.com%2Fkb%2F320369&ei=jpJ1UMGBE8rHtAaH-YGgCA&usg=AFQjCNGFzlpTbjBfahet5Tr9nhV7AchbXQ).

Leider hat das umstellen der Locale von Deutsch auf Englisch nichts gebracht, also versuche ich nun erstmal diesen Fehler wegzubekommen, bevor ich weiter mache.

Vg,

Markus

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 10 Okt. 2012 17:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Markus Doll"]Ich greife über Microsoft.Office.Interop.Excel auf die Excelfunktionalität zu[/quote]

Das ist Teil von VSTO, oder? Und sollte es auch für .NET 3.5 (bzw. 2.0) geben. Ich hatte das bisher immer über direkte COM-Automatisierung gemacht.

Jedenfalls bekommst Du über Worksheet.UsedRange eine Range-Objekt, das mehrere Zellen enthält und die mußt Du zuerst in einzelne Zellen auflösen. Wenn ich mich richtig erinnere geht das einfach per Indexer, also range[Zeilennr, Spaltennr]. Und bei der einzelnen Zelle kommst Du dann über die Value-Eigenschaft an den Inhalt.

Aber wie oben schon geschrieben: wahrscheinlich wäre der Weg über System.IO.Packaging besser.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 10 Okt. 2012 18:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn ich .Net 4.0 als Targetframework nehme, kann ich über das .UsedRange Objekt in der Form UsedRangeObjekt.Cells[1,1].value2 auf die entsprechenden Werte zugreifen.

Unter .Net 3.5 geht das nicht. Hier scheint es nur zu gehen indem ich über jede Zelle, von dem UsedRangeObjekt ein neues Rangeobjekt erstelle, dann gehts komischerweise.

Sieht also so aus:

Das geht unter 3.5:

oRange = (Range)ws.UsedRange;

Range aRange = (Range)ws.[1,2]

string test = aRange.value2

Das geht unter 4.0:

Range oRange = (Range)ws.UsedRange;

string test = oRange.Cells[1,2].value2

Ich werde mir aber das von Dir beschriebene dennoch anschauen.

Das Culture Problem konnte durch setzen der Culture auf "en-us" lösen.

Vg,

Markus